Qipudata
San Francisco · v0.7.1
qipu data›San Francisco›Datasets›x_roll_calls

Printed roll calls of the Board of Supervisors, 1906–1998

x_roll_callsrelease v0.7.1CC0 1.0

About

Every printed roll call ("Adopted by the following vote: Ayes: Supervisors ... Noes: ... Absent: ...") found in the Journal text, 1906-1999.

Where it comes from
The printed Journal of Proceedings of the Board of Supervisors, scanned by the San Francisco Public Library and held by the Internet Archive.
How it was read
Found in the scanned text by rules (run rollcall-parser-v1): each “Adopted by the following vote: Ayes … Noes … Absent …” is one roll call. The counts as printed are kept beside the names read, and counts_match says when they agree.
How far to trust it
The release passed its automatic checks before it was published (what is checked). A hand check by the editor of qipu data is under way: 36 of 38 items checked so far were right, on votes, money, places and the map. A row says what the record states; the scanned page is the authority. Details
Licence
CC0 1.0: use it for anything, no permission needed. The scans and other sources keep their own rights.
Version
v0.7.1, published 21 October 2026. A published release is never changed; corrections come as a new release.
Technical details
Table
x_roll_calls
Rows
171,123
Columns
26
Parquet
x_roll_calls.parquet, 16.1 MB
Version
v0.7.1, 21 October 2026
Licence
CC0 1.0. Sources keep their own rights.

Rows

Rows by corpus

ValueRowsShare
page_text47,51227.8%
bos_corpus35,22520.6%
resweep_d197017,09010.0%
resweep_d198016,4279.6%
resweep_d195013,5937.9%
resweep_d196011,5796.8%
resweep_d199010,8316.3%
resweep_d19406,9804.1%
resweep_d19103,4062.0%
resweep_d19203,1771.9%
resweep_d19302,4151.4%
resweep_d19111,7471.0%

Rows by outcome

ValueRowsShare
passed99,51958.2%
(empty)47,51227.8%
unknown18,70110.9%
failed5,3913.2%

Rows by read_from

ValueRowsShare
page_text142,62883.3%
item_text28,49516.7%

Method and accuracy

Found in the scanned text by rules (run rollcall-parser-v1): each “Adopted by the following vote: Ayes … Noes … Absent …” is one roll call. The counts as printed are kept beside the names read, and counts_match says when they agree.

FieldMade byHow well it is known
x_roll_calls: counts (ayes/noes/absent)rules (20_rollcalls.py)Rule check on all 171,123 roll calls: printed counts equal the names parsed in 90.5% (1,402 print no counts). SF gold (decisions_bench/gold.jsonl, written by Opus 5.5, no record of a hand check): counts exact 40/46 (87%) where the roll call is in the item text; 12 of 58 gold roll calls not found (mostly outside the gold text span).

The release passed its automatic checks before it was published (what is checked). A hand check by the editor of qipu data is under way: 36 of 38 items checked so far were right, on votes, money, places and the map. A row says what the record states; the scanned page is the authority.

Methodology · Accuracy

Columns 26

ColumnTypeCan be emptyPrivacyPublic copyDescription
rollcall_idVARCHARnononeas isId of the roll call: hash of the item id and the roll call's position in the item.
Can be empty no · Privacy none · Public copy as is
item_idVARCHARnononeas isThe Board item the roll call is printed in (<volume>|<n>, re-swept <volume>|g<n>); its decision is qipu:sf/decision/<item_id>.
Can be empty no · Privacy none · Public copy as is
corpusVARCHARyesnoneas isWhere the item text came from: bos_corpus (the 2026-09 corpus) or resweep_d<decade> (re-swept items).
Values bos_corpus, resweep_d1900, resweep_d1910, resweep_d1911, resweep_d1920, resweep_d1930, resweep_d1940, resweep_d1950, resweep_d1960, resweep_d1970, resweep_d1980, resweep_d1990 ...
Can be empty yes · Privacy none · Public copy as is
page_idVARCHARnononeas isThe archive.org page: <identifier>:<leafNum> (IA's leaf number, the jp2 / IIIF number), or <identifier>:d<n> where only the BookReader index is known, or <url>:<page> for a web document. nopage:<seq> where the source gives no page number (sfbos rows without one): the row is kept, page_url is NULL.
Values e.g. journalofproceed30sanfrich:1
Can be empty no · Privacy none · Public copy as is
page_urlVARCHARyesnoneas isOpens the page: archive.org BookReader link built from the leaf map (audited against IA's scandata), or <pdf url>#page=<n> for a PDF. NULL only where page_id is nopage:<seq>.
Values e.g. https://archive.org/details/journalofproceed30sanfrich/page/n1
Can be empty yes · Privacy none · Public copy as is
source_idVARCHARnononeas isarchive.org identifier of the Journal volume.
Can be empty no · Privacy none · Public copy as is
leafBIGINTyesnoneas isarchive.org BookReader page index (the n in /page/n<k>).
Can be empty yes · Privacy none · Public copy as is
hocr_leafBIGINTyesnoneas isPage index in the OCR (before the leaf map).
Can be empty yes · Privacy none · Public copy as is
page_exactBOOLEANyesnoneas isTrue when the archive.org page number was converted from the OCR leaf with the per-volume leaf map; false = may be a page or two off.
Can be empty yes · Privacy none · Public copy as is
yearBIGINTyesnoneas isYear of the Journal volume.
Can be empty yes · Privacy none · Public copy as is
dateDATEyesnoneas isMeeting date, where the corpus gives one within a year of the volume's year.
Can be empty yes · Privacy none · Public copy as is
outcome_textVARCHARyesfree textprivate people's names withheld under the embargoThe printed outcome phrase before "by the following vote" (Adopted, Finally passed, ...), up to 120 characters.
Can be empty yes · Privacy free text · Public copy private people's names withheld under the embargo
outcomeVARCHARyesnoneas ispassed, failed or unknown, from the words in outcome_text.
Values failed, passed, unknown
Can be empty yes · Privacy none · Public copy as is
ayes_nBIGINTyesnoneas isCount as printed.
Can be empty yes · Privacy none · Public copy as is
noes_nBIGINTyesnoneas isNoes count as printed.
Can be empty yes · Privacy none · Public copy as is
absent_nBIGINTyesnoneas isAbsent count as printed.
Can be empty yes · Privacy none · Public copy as is
ayes_parsedBIGINTyesnoneas isNames parsed.
Can be empty yes · Privacy none · Public copy as is
noes_parsedBIGINTyesnoneas isNames parsed after Noes.
Can be empty yes · Privacy none · Public copy as is
absent_parsedBIGINTyesnoneas isNames parsed after Absent or Excused.
Can be empty yes · Privacy none · Public copy as is
read_fromVARCHARyesnoneas isv0.6.1: page_text (re-read from the Journal page text, across page breaks, with "No:" single dissents) or item_text (the item-based parse kept).
Can be empty yes · Privacy none · Public copy as is
duplicate_ofVARCHARyesnoneas isv0.6.1: the rollcall_id of the same printed roll call read from another item (a corpus item and a re-swept one); its votes are not counted twice.
Can be empty yes · Privacy none · Public copy as is
counts_matchBOOLEANyesnoneas isTrue when every printed count equals the names parsed (94% of roll calls).
Can be empty yes · Privacy none · Public copy as is
numbersVARCHAR[][]yesnoneas isResolution / Ordinance / File / Bill numbers printed in the item: [kind, number, series year].
Can be empty yes · Privacy none · Public copy as is
contextVARCHARyesraw textleft out under the embargoUp to 300 characters of item text before the roll call. Empty (withheld in the public files for records under the privacy embargo (75 years in SF, 92 in Vancouver)).
Can be empty yes · Privacy raw text · Public copy left out under the embargo
quoteVARCHARyesraw textleft out under the embargoThe roll call as printed, from 60 characters before it (<= 600 characters). Names supervisors, who are public officials. Not published for records under the embargo: the quoted lines carry the item text ("Submitted by ..."), not only the roll.
Can be empty yes · Privacy raw text · Public copy left out under the embargo
run_idVARCHARnononeas isrollcall-parser-v1 (see runs).
Values rollcall-parser-v1
Can be empty no · Privacy none · Public copy as is

Privacy: what kind of text the column holds. Public copy: what the published file does with it; the embargo covers records after 1951.

Preview

rollcall_iditem_idcorpuspage_idpage_urlsource_idleafhocr_leaf
cf97c00facd3decision/jour…sanfrich|3377bos_corpusjournalofproc…sanfrich:2777archive.org/deta…frich/page/n2777 ↗journalofproceed23sanfrich27772777
a6f6c3f70fbddecision/jour…sanfrich|1476bos_corpusjournalofproc…sanfrich:1386archive.org/deta…frich/page/n1386 ↗journalofproceed22sanfrich13861386
1306dd84018edecision/jour…sanfrich|1915bos_corpusjournalofproc…sanfrich:1236archive.org/deta…frich/page/n1231 ↗journalofproceed1910sanfrich12311236
b34d9ca72122decision/jour…6sanfrich|350bos_corpusjournalofproc…6sanfrich:296archive.org/deta…nfrich/page/n295 ↗journalofproceed1916sanfrich295296
c987c2214292decision/jour…sanfrich|g562resweep_d1900journalofproceed02sanfrich:342archive.org/deta…nfrich/page/n341 ↗journalofproceed02sanfrich341342
6369c6fce269decision/jour…sanfrich|g583resweep_d1910journalofproc…6sanfrich:475archive.org/deta…nfrich/page/n474 ↗journalofproceed1916sanfrich474475
e0cbf05df306decision/jour…anfrich|g1172resweep_d1911journalofproc…1sanfrich:297archive.org/deta…nfrich/page/n297 ↗journalofproceed1911sanfrich297297
63fa7a6a020fdecision/jour…sanfrich|g415resweep_d1920journalofproc…4sanfrich:234archive.org/deta…nfrich/page/n233 ↗journalofproceed1924sanfrich233234

8 of 26 columns shown. Eight rows sampled at build time, from the years up to 1951. Hover a shortened value for all of it.

Download

FormatFileSize
Parquetx_roll_calls.parquet ↗16.1 MB
SQLite (all tables)qipu_sf.db ↗6.44 GB

SQL

SELECT * FROM x_roll_calls LIMIT 100

Run in the SQL console (DuckDB in the browser, over the Parquet file).

Python

import duckdb duckdb.sql("SELECT * FROM 'https://tiles.qipu.org/data/releases/v0.7.1/parquet/x_roll_calls.parquet' LIMIT 5").show()