San Francisco Board of Supervisors decisions, 1906–2026
decisionsrelease v0.7.1CC0 1.0
About
Every item the San Francisco Board of Supervisors acted on from 1906 to 2026, as printed in its Journal of Proceedings and minutes. One row per item; an item read more than once can have more than one row. Each row links to the scanned page on the Internet Archive it was read from.
- Where it comes from
- Journal of Proceedings and meeting minutes of the Board of Supervisors, scanned by the San Francisco Public Library and held by the Internet Archive; recent minutes from sfbos.org. 93% of rows link to their archive.org page.
- How it was read
- The scanned text was split into items by rules. A language model (Claude Haiku) read the pages and wrote the one-line summaries; every model-written line is marked in summary_by.
- 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
- decisions, rows where city = 'sf'
- Publisher
- qipu
- Source
- SF Board of Supervisors, Journal of Proceedings (1906–1999) and meeting minutes (2000–2026), scanned by the San Francisco Public Library and held by the Internet Archive; recent minutes from sfbos.org
- Temporal coverage
- 1906–2026
- Spatial coverage
- San Francisco, California
- Rows
- 718,093
- Columns
- 52
- Distinct source pages
- 155,860
- Rows citing an archive.org page
- 669,173 (93.2%)
- Page link
- exact on 620,576 rows; may be one or two pages off on 7,804; not page-level on 89,713
- Instrument number
- printed on 75,250 rows
- Identifier
- qipu:sf/decision/<identifier>|<item>
- Version
- v0.7.1, 21 October 2026
- Licence
- CC0 1.0. One-line summaries written by a model are marked in summary_by.
- Formats
- Parquet, SQLite; one page per decision in the record viewer
Rows
By origin
| origin | Rows | Share | |
|---|---|---|---|
| v2 read page by page by decisions v2 (claude-haiku-5-5) | 344,936 | 48.0% | |
| bos_corpus items read from the Journal text by rules | 161,015 | 22.4% | |
| resweep items re-read by claude-haiku-5-5 | 112,079 | 15.6% | |
| roll_call roll calls with no item text | 55,692 | 7.8% | |
| site map rows with no item behind them | 22,050 | 3.1% | |
| map_blocks decisions placed on blocks for qipu's map | 21,592 | 3.0% | |
| hand written by hand from the cited source | 729 | 0.1% |
By outcome
| outcome_best | Rows | Share | |
|---|---|---|---|
| passed | 325,076 | 45.3% | |
| (not stated) | 153,884 | 21.4% | |
| referred | 80,871 | 11.3% | |
| passed first reading | 55,604 | 7.7% | |
| pending | 44,188 | 6.2% | |
| continued | 25,044 | 3.5% | |
| unknown | 12,825 | 1.8% | |
| refused | 10,054 | 1.4% | |
| tabled | 3,343 | 0.5% | |
| amended | 2,489 | 0.3% |
Rows without an outcome are mostly items the Journal records without a vote: communications, referrals, hearings.
By decade
By author of the summary
| summary_by | Rows | Share | |
|---|---|---|---|
| claude-haiku-5-5 (model-written; check the scan) | 490,605 | 68.3% | |
| a model in the 2026-09 pipeline (model-written; check the scan) | 169,707 | 23.6% | |
| (not stated) | 57,052 | 7.9% | |
| qipu (hand-written from the cited source) | 729 | 0.1% |
Method and accuracy
Method
The Journal text (OCR of the Internet Archive scans) is split into items by rules, and titles are classified by rules with some model labels (run bos-corpus-2026-09). Items from the 1960s to the 2010s were re-read one at a time by claude-haiku-5-5 (runs resweep-d1960-haiku55-2026-10 and later). Decisions v2 (run sf-v21-haiku-1014, claude-haiku-5-5) read the Journal and minutes page by page for 1906–2016; where a v2 row and an earlier row describe the same decision, same_as links them. Roll calls are parsed by rules (20_rollcalls.py). Each item's page is mapped to the archive.org leaf number from the volume's scan data. Names of private people are withheld for 75 years.
Accuracy
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.
Decisions v2 (run sf-v21-haiku-1014) against a key written by Opus 5.5 on 40 San Francisco pages, 115 decisions. The key has no record of a hand check; a Wilson 95% interval on 0.95 is about 0.89–0.98. Fields from the earlier runs are not measured.
| Field | Metric | Value |
|---|---|---|
| number | exact | 1.00 |
| votes (counts) | exact | 0.99 |
| votes | confirmed on the linked page image / checked (Wilson 95% 0.85-0.99) | 0.97 |
| money | confirmed on the linked page image / checked (Wilson 95% 0.85-0.99) | 0.96 |
| finds | recall | 0.95 |
| action | exact | 0.95 |
| number+action+votes | all exact | 0.95 |
| vote names | exact | 0.95 |
| mover | exact | 0.93 |
| topics | F1 | 0.90 |
| places | confirmed on the linked page image / checked (Wilson 95% 0.70-0.97) | 0.90 |
| outcomes | confirmed on the linked page image / checked (Wilson 95% 0.73-0.94) | 0.87 |
| money | F1 (vs Opus key) | 0.80 |
| interest | Spearman | 0.78 |
| places | F1 (vs Opus key) | 0.66 |
| parties | F1 (vs Opus key) | 0.61 |
| dates | F1 (vs Opus key) | 0.55 |
| related | F1 (vs Opus key) | 0.17 |
Known limitations
- Rows from decisions v2 and from the earlier runs can describe the same decision: 77,845 earlier rows are linked to their v2 row by same_as. Count distinct decisions with care.
- Decisions v2 reads the previous page as context: in a 20-claim scan spot check, 18 quotes were on the linked page and 2 on the page before (v0.6 re-points them).
- Block placement: from v0.5 a decision keeps a block only if a street named in its own text touches it, or a named site is within 400 m; 7.7% of placements moved to a street, a site or the city.
- Numbers printed in the text are found by pattern; OCR errors (1G2 for 162) are not parsed.
- The private-name filter is a pattern: it can miss a lone surname and hides some phrases that begin with a first name.
Columns 52
| Column | Type | Can be empty | Privacy | Public copy | Description |
|---|---|---|---|---|---|
| decision_id | VARCHAR | no | none | as is | qipu:sf/decision/<item id>: corpus items <volume>|<n>, re-swept items <volume>|g<n>, hand-built hand:<slug>, map/site-only rows map:..., su:..., sd:....Values e.g. qipu:sf/decision/journalofproceed30sanfrich|1 |
| item_id | VARCHAR | yes | none | as is | The item inside its volume: <volume>|<n> (corpus), <volume>|g<n> (re-sweep), or a hand/map/site key. |
| origin | VARCHAR | yes | none | as is | How the row came in: bos_corpus (rules over the Journal text), resweep (re-read by a model), roll_call (a roll call with no item text), map_blocks, site, hand, v2.Values bos_corpus, hand, map_blocks, resweep, roll_call, site, v2 |
| year | BIGINT | yes | none | as is | The year of the meeting. |
| date | VARCHAR | yes | none | as is | The meeting date (YYYY-MM-DD) when known. |
| date_from | VARCHAR | yes | none | as is | Where the date comes from (v0.6.1): record (the pass's own record), page: running head / page: page heading / page: meeting heading (the Journal page's printed meeting date before the item), page: heading of an earlier page / page: previous page heading (the last printed meeting date before the page), page: dated claims on the page. |
| rollcall_id | VARCHAR | yes | none | as is | v0.6.1: the roll call of this decision's item (its last; it may be printed on the next page). |
| decision_group | VARCHAR | yes | none | as is | One id per printed item (v0.6.1): rows of different passes over the same item (v1 corpus, resweep, v2, map, site, roll call) share it; it is the decision_id of the group's first row by pass. Count distinct decision_group for "how many decisions". |
| kind | VARCHAR | yes | none | as is | resolution, ordinance, motion, bill, hearing, report ... as classified. |
| heading | VARCHAR | yes | free text | private people's names withheld under the embargo | The item heading as printed (OCR). |
| plain | VARCHAR | yes | free text | private people's names withheld under the embargo | The run's one-line plain summary (model-written; see summary_by). |
| record_type | VARCHAR | yes | none | as is | What the row records: decision, vote-outcome-only, report ... Values cut-in-half, decision, departmental-work, index-row, page-furniture, public-comment, too-damaged, vote-outcome-only |
| topic | VARCHAR | yes | none | as is | Topic label. |
| subtopic | VARCHAR | yes | none | as is | Finer topic label. |
| action | VARCHAR | yes | none | as is | The last action on the item (adopted, passed first reading, referred ...). Values accepted, amended, appointed, appropriated, commended, granted, ordered, other, paid, refused, settled, voted-or-scheduled |
| outcome | VARCHAR | yes | none | as is | The run's outcome (passed / refused / rejected / vetoed / pending / unknown). Values amended, approved by voters, continued, passed, passed first reading, pending, referred, refused, rejected, rejected by voters, submitted_to_voters, tabled ... |
| source_url | VARCHAR | yes | none | as is | The archive.org page of the item. |
| block | VARCHAR | yes | none | as is | Assessor block the item names, when it names one. |
| streets | VARCHAR | yes | free text | private people's names withheld under the embargo | Streets the item names ("|"-separated). |
| amounts | VARCHAR | yes | none | as is | Dollar amounts printed in the item (text). |
| how_placed | VARCHAR | yes | none | as is | How the item was placed on the map (block, street, no place given ...). Values between two streets, names its own block, no place given, street address, street corner, street only |
| classified_by | VARCHAR | yes | none | as is | What classified it: rule, form, model. Values form, fund, near-duplicate, purpose-clause, record, rule, title |
| hocr_leaf | BIGINT | yes | none | as is | Page index in the OCR (before the leaf map). |
| page_exact | BOOLEAN | yes | none | as is | True when the page link was converted from the OCR leaf with the per-volume leaf map; false = may be a page or two off. |
| who | VARCHAR | yes | free text | private people's names withheld under the embargo | Who the item concerns, in words (model-written). |
| place_text | VARCHAR | yes | free text | private people's names withheld under the embargo | The place as written in the item. |
| run_id | VARCHAR | yes | none | as is | The run that read it (see runs).Values resweep-d1960-haiku55-2026-10, resweep-d1970-haiku55-2026-10, resweep-d1980-haiku55-2026-10, resweep-d1990-haiku55-2026-10, resweep-d2000-haiku55-2026-10, resweep-d2010-haiku55-2026-10, sf-v21-haiku-1014, van-v21-haiku-1014 |
| address | VARCHAR | yes | free text | private people's names withheld under the embargo | The street address the item names, if any. |
| amount | BIGINT | yes | none | as is | The main dollar amount, as a number. |
| quote | VARCHAR | yes | raw text | left out under the embargo | Raw OCR text of the item. Not published for records under the embargo. |
| site_plain | VARCHAR | yes | free text | private people's names withheld under the embargo | The map's corrected one-line summary. |
| site_outcome | VARCHAR | yes | none | as is | The map's outcome value. Values approved by voters, passed, refused, rejected, rejected by voters, vetoed |
| site_ids | VARCHAR | yes | none | as is | The map's row ids for this decision. |
| outcome_best | VARCHAR | yes | none | as is | passed / refused / rejected / vetoed / pending / unknown (the map's value first, then the run's). Values amended, approved by voters, continued, passed, passed first reading, pending, referred, refused, rejected, rejected by voters, submitted_to_voters, tabled ... |
| plain_best | VARCHAR | yes | free text | private people's names withheld under the embargo | The best one-line summary (the map's corrected line first). |
| instrument_id | VARCHAR | yes | none | as is | Ordinance/resolution number printed in the item (see instruments). |
| outcome_from | VARCHAR | yes | none | as is | Where outcome_best came from (site, run, roll call ...). |
| same_as | VARCHAR | yes | none | as is | Audit: the id this row was merged from (decisions v2 attached to v1). |
| city | VARCHAR | no | none | as is | sf or van.Values sf, van |
| privacy_flag | VARCHAR | yes | none | as is | may_name_private_person_after_1950 on Board text from 1952 on (records up to 1951 are open: the one cutoff, qipu_data/cutoff.py).Values may_name_private_person_after_1950 |
| summary_by | VARCHAR | yes | none | as is | Who wrote the plain line (model name, "model-written; check the scan"). Values a model in the 2026-09 pipeline (model-written; check the scan), claude-haiku-5-5 (model-written; check the scan), qipu (hand-written from the cited source) |
| status | VARCHAR | no | none | as is | What the Board did with this item at this reading, from the first rule that applies (status_from); never blank: not_recorded when nothing says (qipu_data/status.py, usability audit 19/10).Values introduced, proposed, referred, continued, amended, hearing_held, first_reading, submitted_to_voters, recommended, claim_filed, demand_listed, reported ... |
| status_word | VARCHAR | no | none | as is | The status in the word people see (proposed, referred, first reading, passed, adopted, vetoed, failed, withdrawn, claimed, listed for payment, recommended, reported, no status on record ...). |
| status_plain | VARCHAR | no | none | as is | The status in one plain sentence, e.g. "Sent to committee; no final vote found"; says when the matter went further later. |
| happened | VARCHAR | no | none | as is | decided (finally passed, adopted, voters approved, veto overridden) / not_decided (proposed, referred, continued, first reading only, claim, recommendation) / failed (refused, tabled, withdrawn, vetoed) / unknown (no status on record). Values decided, not_decided, failed, unknown |
| carried_out | VARCHAR | no | none | as is | Whether what was decided was carried out (paid, built, demolished): only with its own evidence (carried_out_evidence); unknown = not confirmed. A decision to pay is not a payment. Values True, False, unknown |
| carried_out_evidence | VARCHAR | yes | none | as is | The statement or record that shows it was carried out. |
| status_from | VARCHAR | no | none | as is | Where the status comes from: the instrument lifecycle stage of this reading, outcome_best, the v2 extraction, another reading of the same printed item, the printed roll call, a wording rule on the heading/summary/printed text, or none. Values instrument_lifecycle, outcome_best, x_decisions, other_reading, roll_call, wording_rule, none |
| matter_status | VARCHAR | no | none | as is | The furthest status of the whole matter (instrument lifecycle; else the same printed item; else the same title decided within 120 days; else this reading's own). |
| matter_happened | VARCHAR | no | none | as is | happened, for the whole matter. Values decided, not_decided, failed, unknown |
| matter_status_from | VARCHAR | no | none | as is | Where matter_status comes from. Values instrument_lifecycle, printed_item, same_title_120d, this_reading |
| plain_fix | VARCHAR | yes | none | as is | Set when plain_best was rewritten because it stated an open matter as done (rule_* = wording rule, model_haiku = rewritten by Claude Haiku and checked); plain keeps the original. |
Privacy: what kind of text the column holds. Public copy: what the published file does with it; the embargo covers records after 1951.
Preview
| Date | Kind | Outcome | Summary | Printed page |
|---|---|---|---|---|
| 8 November 1906 | resolution | passed | Board tells Ocean Shore Railway to finish its stalled Potrero Avenue roadbed work at once, without further delay. | page ↗ |
| 8 January 1908 | resolution | passed | Payment of $2,000 (≈ $74,876 in 2026 dollars) to Annie Galloway approved for a small lot added to the Jean Parker School site. | page ↗ |
| 8 July 1940 | ordinance | referred | Terms for leasing City airport land by competitive bid were referred to the Finance Committee. | page ↗ |
| 23 September 1940 | resolution | passed | Supervisor Arthur M. Brown, Jr. granted a leave of absence from September 28 to October 12, 1940, with permission to leave the State. | page ↗ |
| 11 March 1943 | other | referred | Jack Smith requested higher pay for Rammer; Board moved to fix it at $11 (≈ $214 in 2026 dollars) per day and referred it to Civil Service. | page ↗ |
| 19 May 1943 | other | passed | Board approved $3,686 (≈ $71,790 in 2026 dollars) for War Memorial overtime payments. | page ↗ |
| 26 May 1945 | ordinance | not read | The annual salary ordinance fixing city positions and pay for the fiscal year ending June 30, 1946 was taken up for second reading. | page ↗ |
| 16 July 1945 | motion | referred | Supervisor MacPhee's push for a new Juvenile Court Building was referred to the Public Health and Welfare Committee. | page ↗ |
Five of 52 columns, for eight rows from 1906–1951 sampled at build time. The date opens the record; every column is in the Columns list above and in SQL.
Download
| Format | File | Size |
|---|---|---|
| Parquet | decisions.parquet ↗ | 89.2 MB |
| SQLite (all tables) | qipu_sf.db ↗ | 6.44 GB |
SQL
Run in the SQL console (DuckDB in the browser, over the Parquet file).