{
 "codeRevision": "287d0ca009f7523bf50535d961fa34b7a60074c7",
 "correction": {
  "addedFields": [
   "fragmentation.json: byState[*].noTrackedPlatformShare (32 items)",
   "fragmentation.json: byState[*].topPlatform (32 items)",
   "fragmentation.json: byState[*].topTrackedPlatform (32 items)",
   "fragmentation.json: byState[*].topTrackedPlatformShare (32 items)",
   "fragmentation.json: byState[*].trackedPlatformBids (32 items)",
   "fragmentation.json: catchAllLabels[*] (2 items)",
   "fragmentation.json: noTrackedPlatformShare",
   "fragmentation.json: top5GroupShareIncludingCatchAlls",
   "fragmentation.json: top5NamedPlatformShare",
   "freshness.json: sensitivity.byState[*].medianLagDays (19 items)",
   "freshness.json: sensitivity.byState[*].n (19 items)",
   "freshness.json: sensitivity.byState[*].name (19 items)",
   "freshness.json: sensitivity.byState[*].state (19 items)",
   "freshness.json: sensitivity.label",
   "freshness.json: sensitivity.lagMedianDays",
   "freshness.json: sensitivity.lagP75Days",
   "freshness.json: sensitivity.lagP90Days",
   "freshness.json: sensitivity.lagRows",
   "freshness.json: sensitivity.rule",
   "freshness.json: sensitivity.seenWithin2Days",
   "freshness.json: sensitivity.seenWithin7Days",
   "freshness.json: timing.clearedRows",
   "freshness.json: timing.notTimed.noFirstSightingOrSourceStart",
   "freshness.json: timing.notTimed.noPostingDate",
   "freshness.json: timing.notTimed.postedAfterFirstSighting",
   "freshness.json: timing.notTimed.postedBeforeWeBeganCollectingTheSource",
   "freshness.json: timing.notTimed.postedWithinADayOfFirstSighting",
   "freshness.json: timing.timed",
   "sourceBase.json: activeOnNoTrackedPlatformListed",
   "sourceBase.json: activeOnNoTrackedPlatformResellersOrNotListed",
   "states.json: table[*].noTrackedPlatformShare (32 items)",
   "states.json: table[*].topPlatform (32 items)",
   "states.json: table[*].topTrackedPlatform (32 items)",
   "states.json: table[*].topTrackedPlatformShare (32 items)",
   "states.json: table[*].trackedPlatformBids (32 items)"
  ],
  "changedFigures": [
   {
    "file": "freshness.json",
    "now": 5.3,
    "path": "byState[AZ].medianLagDays",
    "was": 4.4
   },
   {
    "file": "freshness.json",
    "now": 158,
    "path": "byState[AZ].n",
    "was": 182
   },
   {
    "file": "freshness.json",
    "now": 5.7,
    "path": "byState[CA].medianLagDays",
    "was": 5.0
   },
   {
    "file": "freshness.json",
    "now": 666,
    "path": "byState[CA].n",
    "was": 743
   },
   {
    "file": "freshness.json",
    "now": 4.7,
    "path": "byState[CO].medianLagDays",
    "was": 2.7
   },
   {
    "file": "freshness.json",
    "now": 216,
    "path": "byState[CO].n",
    "was": 295
   },
   {
    "file": "freshness.json",
    "now": 5.1,
    "path": "byState[FL].medianLagDays",
    "was": 3.8
   },
   {
    "file": "freshness.json",
    "now": 1141,
    "path": "byState[FL].n",
    "was": 1319
   },
   {
    "file": "freshness.json",
    "now": 5.1,
    "path": "byState[HI].medianLagDays",
    "was": 4.7
   },
   {
    "file": "freshness.json",
    "now": 370,
    "path": "byState[HI].n",
    "was": 391
   },
   {
    "file": "freshness.json",
    "now": 5.3,
    "path": "byState[IL].medianLagDays",
    "was": 2.0
   },
   {
    "file": "freshness.json",
    "now": 188,
    "path": "byState[IL].n",
    "was": 282
   },
   {
    "file": "freshness.json",
    "now": 6.4,
    "path": "byState[KY].medianLagDays",
    "was": 6.0
   },
   {
    "file": "freshness.json",
    "now": 217,
    "path": "byState[KY].n",
    "was": 229
   },
   {
    "file": "freshness.json",
    "now": 8.0,
    "path": "byState[LA].medianLagDays",
    "was": 7.0
   },
   {
    "file": "freshness.json",
    "now": 229,
    "path": "byState[LA].n",
    "was": 255
   },
   {
    "file": "freshness.json",
    "now": 4.3,
    "path": "byState[MI].medianLagDays",
    "was": 3.7
   },
   {
    "file": "freshness.json",
    "now": 453,
    "path": "byState[MI].n",
    "was": 499
   },
   {
    "file": "freshness.json",
    "now": 3.4,
    "path": "byState[MO].medianLagDays",
    "was": 2.9
   },
   {
    "file": "freshness.json",
    "now": 360,
    "path": "byState[MO].n",
    "was": 414
   },
   {
    "file": "freshness.json",
    "now": 9.0,
    "path": "byState[NC].medianLagDays",
    "was": 8.1
   },
   {
    "file": "freshness.json",
    "now": 668,
    "path": "byState[NC].n",
    "was": 695
   },
   {
    "file": "freshness.json",
    "now": 7.3,
    "path": "byState[NJ].medianLagDays",
    "was": 5.3
   },
   {
    "file": "freshness.json",
    "now": 287,
    "path": "byState[NJ].n",
    "was": 346
   },
   {
    "file": "freshness.json",
    "now": 4.3,
    "path": "byState[NY].medianLagDays",
    "was": 3.3
   },
   {
    "file": "freshness.json",
    "now": 169,
    "path": "byState[NY].n",
    "was": 200
   },
   {
    "file": "freshness.json",
    "now": 5.5,
    "path": "byState[OH].medianLagDays",
    "was": 4.2
   },
   {
    "file": "freshness.json",
    "now": 171,
    "path": "byState[OH].n",
    "was": 214
   },
   {
    "file": "freshness.json",
    "now": 3.9,
    "path": "byState[SC].medianLagDays",
    "was": 3.7
   },
   {
    "file": "freshness.json",
    "now": 1150,
    "path": "byState[SC].n",
    "was": 1324
   },
   {
    "file": "freshness.json",
    "now": 5.0,
    "path": "byState[TN].medianLagDays",
    "was": 4.4
   },
   {
    "file": "freshness.json",
    "now": 199,
    "path": "byState[TN].n",
    "was": 217
   },
   {
    "file": "freshness.json",
    "now": 5.4,
    "path": "byState[TX].medianLagDays",
    "was": 3.9
   },
   {
    "file": "freshness.json",
    "now": 316,
    "path": "byState[TX].n",
    "was": 371
   },
   {
    "file": "freshness.json",
    "now": 5.1,
    "path": "byState[VA].medianLagDays",
    "was": 4.8
   },
   {
    "file": "freshness.json",
    "now": 249,
    "path": "byState[VA].n",
    "was": 269
   },
   {
    "file": "freshness.json",
    "now": 5.2,
    "path": "lagMedianDays",
    "was": 4.1
   },
   {
    "file": "freshness.json",
    "now": 9.5,
    "path": "lagP75Days",
    "was": 8.6
   },
   {
    "file": "freshness.json",
    "now": 15.6,
    "path": "lagP90Days",
    "was": 14.6
   },
   {
    "file": "freshness.json",
    "now": 8502,
    "path": "lagRows",
    "was": 9828
   },
   {
    "file": "freshness.json",
    "now": 21.4,
    "path": "seenWithin2Days",
    "was": 32.0
   },
   {
    "file": "freshness.json",
    "now": 63.7,
    "path": "seenWithin7Days",
    "was": 68.6
   }
  ],
  "changedFiles": [
   "figures.json",
   "fragmentation.json",
   "freshness.json",
   "sourceBase.json",
   "states.csv",
   "states.json"
  ],
  "changedWording": [
   "figures.json: [*].kind",
   "figures.json: [*].label",
   "figures.json: [*].measures (2 items)",
   "freshness.json: measures"
  ],
  "date": "2026-11-01",
  "newFiles": [
   "freshness-by-state.csv",
   "response-window-by-state.csv",
   "response-window-histogram.csv"
  ],
  "reasons": [
   "Time from posting to first sighting. Release 2026-11-01 timed a bid when its posting date was on or before our first sighting. That kept 1,326 bids dated within a day of first sighting, whose dates may have been inferred from when we found the bid, and DATA-RELEASE-RULES allows a date-based figure only on a date from the source. This release times a bid only when its posting date is more than a day before first sighting, the rule the response window uses: 8,502 bids, median 5.2 days, 21.4% seen within 2 days and 63.7% within 7 days, against 9,828 bids, median 4.1 days, 32.0% and 68.6% before. The earlier basis is published as the labelled sensitivity in freshness.json.",
   "Bids not timed. The reasons published for cleared bids left out of the timing figures did not add up to the bids left out. They now do: 15,471 of 23,973 cleared bids are not timed, and timing.notTimed gives each reason, including 353 bids dated after we first saw them.",
   "Platform concentration by state. The share published as topPlatformShare for a state is the share of its largest raw platform label, and in 10 of 32 states that label is the one for sources on no platform we track, which stands for many separate sites. This release publishes the largest platform by name for each state, the share of bids on no tracked platform, and the largest tracked platform with its share of the bids on tracked platforms. A platform the clearance rules do not allow us to name shows as unnamed.",
   "Platform concentration overall. Release 2026-11-01 published top5PlatformShare, 67.5% of cleared bids on the five largest platform groups, and its headline called them the five largest platform groups. Two of those five groups are catch-alls and not platforms: sources on no platform we track (25.0% of cleared bids) and the shared Other portals label. This release publishes top5NamedPlatformShare, the five largest groups that are one named platform each: 42.5% of cleared bids. The share with the two catch-alls is kept as top5GroupShareIncludingCatchAlls (67.5%, the figure published before as top5PlatformShare) and the headline no longer uses it.",
   "Precision. The share of cleared rows that are true solicitations is now marked estimated, because it comes from a random sample of 400 rows judged by a model from the posted title, with a 95% interval of 83.6 to 90.2.",
   "Source base. sourceBase.json now gives the exact difference between the 12,373 active sources on no tracked platform and the 12,296 in the platform list: 77 are resellers or are not listed by platform.",
   "Wording. The figure for the share of cleared bids with a posting date now says usable posting date, because more cleared bids have a posting date than have a usable one. Its value is unchanged.",
   "New tables. freshness-by-state.csv, response-window-by-state.csv and response-window-histogram.csv publish the state and histogram figures that the pages show.",
   "Every other figure, including the response window, weekly counts, document access and trades, is unchanged. The changed figures are listed below, and the files that did not change are named in unchangedFiles."
  ],
  "removedFields": [
   "fragmentation.json: top5PlatformShare",
   "freshness.json: byState[MA].medianLagDays",
   "freshness.json: byState[MA].n",
   "freshness.json: byState[MA].name",
   "freshness.json: byState[MA].state"
  ],
  "summary": "Release 2026-11-01-r2 corrects release 2026-11-01, on November 1, 2026. Release 2026-11-01 stays published as it was. Use this release where the two differ.",
  "supersedes": "2026-11-01",
  "unchangedFiles": [
   "biasTests.json",
   "clearance.json",
   "document-access-by-platform.csv",
   "document-access-by-state.csv",
   "documentAccess.json",
   "exclusions.json",
   "geography.json",
   "platforms.csv",
   "portal-directory.csv",
   "portalDirectory.json",
   "precision.json",
   "reconciliation.json",
   "responseWindow.json",
   "trades.csv",
   "trades.json",
   "weekly-due.csv",
   "weekly.json"
  ]
 },
 "files": [
  {
   "bytes": 1491,
   "path": "biasTests.json",
   "sha256": "f9d41121b04497658b56a7941fe29d1ea956bbc437d228046587baeeb2ff5443"
  },
  {
   "bytes": 6175,
   "path": "clearance.json",
   "sha256": "2533ab185b38256f668e115830153c60dadd5497fed937698d4773b5f2f75778"
  },
  {
   "bytes": 382,
   "path": "document-access-by-platform.csv",
   "sha256": "6f707cb25e44410ce7045cd8368f764787198e2063503e4fb111ef2fcd4a9f93"
  },
  {
   "bytes": 425,
   "path": "document-access-by-state.csv",
   "sha256": "7e43dcae5e6102dc40797b6924d0b00261edf2689b48992c78118ba96adaee8a"
  },
  {
   "bytes": 2663,
   "path": "documentAccess.json",
   "sha256": "3a00802f2af451ba3c9d09baf6ebdec529b3a4485cdea52c80dd378aa78fe31a"
  },
  {
   "bytes": 4089,
   "path": "exclusions.json",
   "sha256": "36c4999f1ff2bc6b87e2f7b7108f066ee4b7270960590fd3ac60ad6f0cd085e4"
  },
  {
   "bytes": 8412,
   "path": "figures.json",
   "sha256": "4b014189396b426af9681b41f6a240adbec579ec2b3bb129558c698d8855eb81"
  },
  {
   "bytes": 12601,
   "path": "fragmentation.json",
   "sha256": "446f13b2799cf86db795e1944f7a0ac4367d26a71e9a4fc82875a887c466f4b2"
  },
  {
   "bytes": 614,
   "path": "freshness-by-state.csv",
   "sha256": "82c53951b344f1e3ada7a7e9baabb9bf73d8ece022eefd85481e45482df0063a"
  },
  {
   "bytes": 4716,
   "path": "freshness.json",
   "sha256": "facbcb2aaa39239cb5e328412146be66cb6f14bb18c13b6e2c64bbe87982fbf8"
  },
  {
   "bytes": 877,
   "path": "geography.json",
   "sha256": "021e8971e83fa42841a167e4b5cb8e4d48b6ea78a1bfd9ec6fe1d8cc8abeb6bb"
  },
  {
   "bytes": 757,
   "path": "platforms.csv",
   "sha256": "688b154b77359f44af2ae983e923625c6e9d940622c614df4db557f6d5d4a0e2"
  },
  {
   "bytes": 3764,
   "path": "portal-directory.csv",
   "sha256": "17101c3789bd66095d87e8e15cc6eb05d6c75295de0d741b1f26242a0c6a56da"
  },
  {
   "bytes": 9145,
   "path": "portalDirectory.json",
   "sha256": "bfa373dd9b4f45785aa7ff9d734a0ff5e2b755efe1f8badd1a233fd480050762"
  },
  {
   "bytes": 2577,
   "path": "precision.json",
   "sha256": "f208256727d0be116d826f40e4a60fb1d09d92315a8398a64c1391b029bf66d1"
  },
  {
   "bytes": 1479,
   "path": "reconciliation.json",
   "sha256": "c3a578fcbcee93fb5fa75f1a9ae6e79eb73a9bd0046240a15efb2e2fe1bd4167"
  },
  {
   "bytes": 795,
   "path": "response-window-by-state.csv",
   "sha256": "d47a8c43319304d7b95185fd1b6bec9799e867abca1d849c1e3b3ef20ab8f410"
  },
  {
   "bytes": 325,
   "path": "response-window-histogram.csv",
   "sha256": "80d83602caaf8a7d9a684f7350db6b2ff49435b475b1eec141e5eeb6dd7aedd9"
  },
  {
   "bytes": 4639,
   "path": "responseWindow.json",
   "sha256": "92b050b57a9d5012697fe121f928ebf18b88f1178e599a81ef71530971aa2b24"
  },
  {
   "bytes": 2305,
   "path": "sourceBase.json",
   "sha256": "d2ebf89b862088928de3776b6d6069b16cbad34575a51010d534736c257e5df3"
  },
  {
   "bytes": 3417,
   "path": "states.csv",
   "sha256": "2e91abb2de0adfa5b0ae86d0e8bf9d7f2e86f509cf59b3026ead8074063e6189"
  },
  {
   "bytes": 14673,
   "path": "states.json",
   "sha256": "2ad19c42724e82a8a9644030b39792d36d8ef1acf0b1bca5f3a4cb9f2c0c4e26"
  },
  {
   "bytes": 1000,
   "path": "trades.csv",
   "sha256": "61f15cbd0a800a4b377c839b3d98dd02c75dc73b28fddaa1bfb7227ab2a65197"
  },
  {
   "bytes": 9133,
   "path": "trades.json",
   "sha256": "1caf58539f24c398c9bf891b61f098ecd99d9da84a50256534ab8c5b514fbcdf"
  },
  {
   "bytes": 477,
   "path": "weekly-due.csv",
   "sha256": "79c6fd6691cdf10f395718ba82845e6a21851822a46572569fa0b47643a22d3c"
  },
  {
   "bytes": 2385,
   "path": "weekly.json",
   "sha256": "c5caa3d5108dd1633cfba39520e973cca00a3d0082256e5673367f0990c8bdb0"
  }
 ],
 "inputs": {
  "clearance_rows.csv.gz": "188bc2eb4cc84c49d1a6daaa27e3c3c3fabaa369b77c90ceba1703a97ee8b553",
  "clearance_sources.csv.gz": "e72416f240dd5db3c15bdaa540fd698daacf61d6dc4d97b2bce154e8a9abde6c",
  "hub_counts.json": "b95c3352081a6fa020249d8274dd2843b9c8821889b2d38525450e9284c14019",
  "portal_directory.json": "9e497a4cf78277b4c1d76f1fe866a17828527872ec81beda6a1ac8854bc5bbe4",
  "precision_labels.csv": "952cd137ecb5b033767494e944824f7ffe81c57e708d90912182888c15c90723",
  "precision_spotcheck.csv": "8565b999470a6b468a288219eea073775c1f77033cc70d6ded68aadcb41ac955",
  "reading_notes.json": "6b473c3daf9fab63a141fe00deccbda1104c244033b02037e68b0f680bcc9c24",
  "robots_cache.json": "fd1a501ed2caa551c26c4fec190bbc02966b6e54d44387b6ff7d19a0cf96efa5",
  "rows.csv.gz": "1ee6d9d0e8a9cf9efbc181342179d7e339cfe2ec395d2cc5b4b863579770ed23",
  "sources.csv.gz": "6ecc44fb0d2077c20deeb21446fc1bbd6f0d8b3c3541f7473eb81f6101829249"
 },
 "queries": {
  "column_check_opportunities": "select table_schema, column_name from information_schema.columns where table_name = 'opportunities' and column_name in ('country_code', 'state_code') order by 1, 2",
  "production_rows_nondup": "select count(*) from bids where serving_scope = 'production' and duplicate_of_bid_id is null",
  "production_rows_null_due": "select count(*) from bids where serving_scope = 'production' and duplicate_of_bid_id is null and due_at is null",
  "production_rows_total": "select count(*) from bids where serving_scope = 'production'",
  "rows": "select b.id::text, b.source_id::text, b.title, b.source_url, b.buyer_type, b.solicitation_type, b.posted_at, b.posted_at_source, b.first_seen_at, b.due_at, b.active, array_to_string(b.naics_codes, ';'), b.classification_code, (b.duplicate_of_bid_id is not null), o.country_code, o.state_code, o.state_resolution_method, o.geography_scope, o.buyer_archetype, cl.label, cl.confidence, coalesce(dd.n, 0), coalesce(dd.nd, 0) from bids b left join commercial.opportunity_records r on r.bid_id = b.id left join commercial.opportunities o on o.id = r.opportunity_id left join commercial.opportunity_classification_current cl on cl.opportunity_id = o.id and cl.is_primary left join (select bid_id, count(*) n, count(*) filter (where download_status = 'downloaded') nd from bid_documents group by bid_id) dd on dd.bid_id = b.id where b.serving_scope = 'production' and b.due_at >= %s order by b.id",
  "sources": "select s.id::text, s.slug, s.name, s.platform, s.status, coalesce(s.is_aggregator, false), s.base_url, s.created_at, d.country_code, d.state_code, d.state_status, d.geography_scope, d.geography_method, d.buyer_archetype, a.min_fs, a.max_fs, coalesce(a.n, 0), coalesce(a.n30, 0) from sources s left join commercial.source_dimensions d on d.source_id = s.id left join (select source_id, min(first_seen_at) min_fs, max(first_seen_at) max_fs, count(*) n, count(*) filter (where first_seen_at >= now() - interval '30 days') n30 from bids where serving_scope = 'production' group by source_id) a on a.source_id = s.id order by s.id",
  "sources_active_generic": "select count(*) from sources where status = 'active' and platform = 'generic'",
  "sources_active_nonaggregator": "select count(*) from sources where status = 'active' and not coalesce(is_aggregator, false)",
  "sources_active_with_open_bid": "select count(distinct b.source_id) from bids b join sources s on s.id = b.source_id where b.serving_scope = 'production' and b.duplicate_of_bid_id is null and not coalesce(s.is_aggregator, false) and b.active and b.due_at > now()",
  "sources_added_since_oct_29": "select count(*) from sources where status = 'active' and created_at >= '2026-10-29'",
  "sources_by_status": "select status, count(*) from sources group by 1 order by 1",
  "sources_with_new_bid_30d": "select count(distinct b.source_id) from bids b join sources s on s.id = b.source_id where b.serving_scope = 'production' and b.duplicate_of_bid_id is null and not coalesce(s.is_aggregator, false) and b.first_seen_at >= now() - interval '30 days'"
 },
 "release": "2026-11-01-r2",
 "rowCounts": {
  "snapshotRows": 227039,
  "tradeWindowRowsIn": 190704,
  "tradeWindowRowsOut": 57261,
  "windowRowsIn": 103851,
  "windowRowsOut": 23973
 },
 "ruleVersion": "rules-v1-2026-11-01",
 "rules": "plans/DATA-RELEASE-RULES.md",
 "snapshotAt": "2026-11-01T10:28:37.575731+00:00",
 "supersedes": "2026-11-01",
 "tradeWindow": {
  "basis": "due date",
  "end": "2026-11-02",
  "start": "2025-11-02"
 },
 "window": {
  "basis": "due date",
  "end": "2026-11-02",
  "start": "2026-08-03"
 }
}
