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

Decisions, per run

x_decisionsrelease v0.7.1CC0 1.0

About

Extraction table: one row per Board item per run (DATA_ARCHITECTURE.md 7.2), with the columns the existing runs filled; the rest are empty until decisions v2 lands in the same shape.

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_decisions
Rows
748,894 (San Francisco 748,894)
Columns
50
Parquet
x_decisions.parquet, 94.0 MB
Version
v0.7.1, 21 October 2026
Licence
CC0 1.0. Sources keep their own rights.

Rows

Rows by run_id

Rows by kind

ValueRowsShare
resolution282,04337.7%
ordinance209,95528.0%
(empty)112,07915.0%
motion46,9206.3%
hearing24,3483.3%
claim20,6522.8%
other19,0682.5%
appointment9,0741.2%
charter_amendment8,3561.1%
contract7,9101.1%
communication6,1790.8%
ballot_measure1,6440.2%

Rows by stage

ValueRowsShare
(empty)481,53564.3%
adopted159,97221.4%
final55,5667.4%
first reading49,7416.6%
hearing2,0800.3%

Method and accuracy

FieldMade byHow well it is known
x_decisions v2 money currency (SF)fixed in the buildthe run's writer stamps CAD on every amount; SF amounts are relabelled USD in the release (run files unchanged); gate M1 fails any SF amount in CAD.
x_decisions run sf-v21-haiku-1014 / van-v21-haiku-1014 (decisions v2)LLM, one call per pageagreement with an Opus-written key (L4_TEST.md, SF gold; not hand-checked; n = 115, a Wilson 95% interval on 0.95 is about 0.89-0.98): finds 0.95, number 1.00, action 0.95, vote counts 0.99, all three 0.95, vote names 0.95, mover 0.93, money F1 0.80, places F1 0.66, parties F1 0.61, dates F1 0.55, related F1 0.17 (new fields scored against an Opus key, not hand-checked).

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 50

ColumnTypeCan be emptyPrivacyPublic copyDescription
run_idVARCHARnononeas isThe extraction run that read the row (see runs).
Values bos-corpus-2026-09, 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
Can be empty no · 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
seqVARCHARyesnoneas isRow id inside the run: the corpus item id (<volume>|<n>) for v1 rows, the item's position on the page (1, 2, ...) for decisions v2 rows.
Can be empty yes · Privacy none · Public copy as is
decision_idVARCHARnononeas isThe decision the row reads (see decisions); a v2 reading of a v1 item carries the v1 id.
Can be empty no · Privacy none · Public copy as is
yearBIGINTyesnoneas isYear of the Journal volume or meeting.
Can be empty yes · Privacy none · Public copy as is
dateVARCHARyesnoneas isMeeting date (YYYY-MM-DD) where known; empty on decisions v2 rows.
Can be empty yes · Privacy none · Public copy as is
quoteVARCHARyesraw textleft out under the embargoThe item's text as printed (v1: first 300 characters; v2: the quote the model copied). 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
heading_on_prevVARCHARyesfree textprivate people's names withheld under the embargov1 rows: the item's printed heading. Decisions v2 rows: true/false, whether the heading is on the previous page. Person-like names are withheld for records under the 75-year privacy filter (92 years in Vancouver).
Can be empty yes · Privacy free text · Public copy private people's names withheld under the embargo
kindVARCHARyesnoneas isKind of item: resolution, ordinance, motion, contract, hearing, permit, appointment, claim, other, ...
Values appointment, ballot_measure, charter_amendment, claim, communication, contract, hearing, license, motion, ordinance, other, resolution
Can be empty yes · Privacy none · Public copy as is
numberVARCHARyesnoneas isResolution or ordinance number as printed (v1: parsed from the item's opening words, see decision_numbers; v2: read by the model).
Can be empty yes · Privacy none · Public copy as is
file_noVARCHARyesnoneas isBoard file number as printed.
Can be empty yes · Privacy none · Public copy as is
stageVARCHARyesnoneas isDecisions v2: stage reached, from action_raw: adopted, final, first reading or hearing; empty for other actions and v1 rows.
Values adopted, final, first reading, hearing
Can be empty yes · Privacy none · Public copy as is
outcomeVARCHARyesnoneas isResult: passed, refused, pending, referred, continued, vetoed, unknown, ... (v2: mapped from action_raw).
Values amended, approved by voters, continued, passed, passed first reading, pending, referred, refused, rejected, rejected by voters, submitted_to_voters, tabled ...
Can be empty yes · Privacy none · Public copy as is
actionVARCHARyesnoneas isv1 corpus rows: what the Board did, as classified (ordered, voted-or-scheduled, granted, amended, refused, ...); v2 rows use action_raw.
Values accepted, amended, appointed, appropriated, commended, granted, ordered, other, paid, refused, settled, voted-or-scheduled
Can be empty yes · Privacy none · Public copy as is
continued_toVARCHARyesnoneas isDecisions v2: when the item was continued to, as printed (next meeting of Council, two weeks).
Can be empty yes · Privacy none · Public copy as is
amendedBOOLEANyesnoneas isDecisions v2: true when the item was amended on the pages read.
Can be empty yes · Privacy none · Public copy as is
ayes_nBIGINTyesnoneas isAyes count as printed (v1: from the item's roll call in x_roll_calls; v2: read by the model).
Can be empty yes · Privacy none · Public copy as is
noes_nBIGINTyesnoneas isNoes count as printed (v1: from the item's roll call; v2: read by the model).
Can be empty yes · Privacy none · Public copy as is
absent_nBIGINTyesnoneas isAbsent count as printed (v1: from the item's roll call; v2: read by the model).
Can be empty yes · Privacy none · Public copy as is
ayesVARCHAR[]yesa public officialas isSurnames voting aye, as printed (v1: from x_roll_call_votes; v2: read by the model).
Can be empty yes · Privacy a public official · Public copy as is
noesVARCHAR[]yesa public officialas isSurnames voting no, as printed (v1: from x_roll_call_votes; v2: read by the model).
Can be empty yes · Privacy a public official · Public copy as is
absentVARCHAR[]yesa public officialas isSurnames absent or excused, as printed (v1: from x_roll_call_votes; v2: read by the model).
Can be empty yes · Privacy a public official · Public copy as is
moverVARCHARyesa public officialas isDecisions v2: surname of the member who moved the deciding motion, as printed.
Can be empty yes · Privacy a public official · Public copy as is
seconderVARCHARyesa public officialas isDecisions v2: surname of the member who seconded the deciding motion, as printed.
Can be empty yes · Privacy a public official · Public copy as is
parties_textVARCHARyesfree textprivate people's names withheld under the embargoRe-swept rows: the parties involved, written by a model. Person-like names are withheld for records under the 75-year privacy filter (92 years in Vancouver).
Can be empty yes · Privacy free text · Public copy private people's names withheld under the embargo
money_textVARCHARyesfree textprivate people's names withheld under the embargov1 corpus rows: amounts printed in the item, as text.
Can be empty yes · Privacy free text · Public copy private people's names withheld under the embargo
places_textVARCHARyesfree textprivate people's names withheld under the embargoPlace as written: the re-sweep model's place text, or the v1 streets joined with & . Person-like names are withheld for records under the 75-year privacy filter (92 years in Vancouver).
Can be empty yes · Privacy free text · Public copy private people's names withheld under the embargo
blockVARCHARyesnoneas isv1 corpus rows: assessor block the 2026-09 pipeline placed the item on.
Can be empty yes · Privacy none · Public copy as is
topicVARCHARyesnoneas isv1 rows: topic label (running-the-city, admin, the-street, land-and-building, ...); v2 rows use topics.
Can be empty yes · Privacy none · Public copy as is
subtopicVARCHARyesnoneas isv1 corpus rows: finer topic (vote-or-scheduling, zoning, city-buys-land, ...).
Can be empty yes · Privacy none · Public copy as is
plainVARCHARyesfree textprivate people's names withheld under the embargoOne-line plain summary, written by a model (check the scan). Person-like names are withheld for records under the 75-year privacy filter (92 years in Vancouver).
Can be empty yes · Privacy free text · Public copy private people's names withheld under the embargo
record_typeVARCHARyesnoneas isv1 corpus rows: what the text is (decision, vote-outcome-only, public-comment, cut-in-half, page-furniture, index-row, ...).
Values cut-in-half, decision, departmental-work, index-row, page-furniture, public-comment, too-damaged, vote-outcome-only
Can be empty yes · Privacy none · Public copy as is
classified_byVARCHARyesnoneas isv1 corpus rows: what the 2026-09 classification went by (form, rule, title, purpose-clause, record, near-duplicate, fund).
Values form, fund, near-duplicate, purpose-clause, record, rule, title
Can be empty yes · Privacy none · Public copy as is
confidenceDOUBLEyesnoneas isDecisions v2: 0-1 from rule checks: 1.0 quote found on the page, 0.7 found loosely, 0.4 not found; x0.8 for action other or noes count not matching names.
Can be empty yes · Privacy none · Public copy as is
scan_urlVARCHARyesnoneas isLink to the page: the archive.org scan or the minutes URL.
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
action_rawVARCHARyesnoneas isDecisions v2: the last action on the pages read, as the model chose it (adopted, passed_final, referred, continues_next_page, ...).
Values adopted, amended, continued, continues_next_page, failed, hearing_held, ordered_submitted_to_voters, other, passed_final, passed_first_reading, referred, tabled ...
Can be empty yes · Privacy none · Public copy as is
departmentVARCHARyesfree textprivate people's names withheld under the embargoDecisions v2: the department, board, officer or committee that reported or requested the item, as printed.
Can be empty yes · Privacy free text · Public copy private people's names withheld under the embargo
partiesSTRUCT("name" VARCHAR, "role" VARCHAR)[]yesnestedfield by field (below)Decisions v2: private parties named, with their role. Empty in the public files under the privacy embargo (75 years SF, 92 Vancouver): every row in v0.4.
Can be empty yes · Privacy nested · Public copy field by field (below)
moneySTRUCT(amount DOUBLE, currency VARCHAR, purpose VARCHAR, payee VARCHAR, direction INTEGER, value_year BIGINT, amount_2026 DOUBLE, index_used VARCHAR)[]yesnestedfield by field (below)Decisions v2: each amount with currency (USD SF, CAD Vancouver), purpose and payee as read by the model; direction is empty. payee is not name-filtered.
Can be empty yes · Privacy nested · Public copy field by field (below)
placesSTRUCT("text" VARCHAR, street VARCHAR, number VARCHAR, from_street VARCHAR, to_street VARCHAR, block VARCHAR, lot VARCHAR, area VARCHAR, "precision" VARCHAR)[]yesnestedfield by field (below)Decisions v2: each place as printed, with street, number, from/to street, block, lot, area and precision.
Can be empty yes · Privacy nested · Public copy field by field (below)
zoningSTRUCT(from_district VARCHAR, to_district VARCHAR)[]yesnestedfield by field (below)Decisions v2: a zoning change, from_district and to_district as printed.
Can be empty yes · Privacy nested · Public copy field by field (below)
relatedSTRUCT(relation VARCHAR, ref_number VARCHAR)[]yesnestedfield by field (below)Decisions v2: numbers of other measures the item amends or refers to (relation is always refers_to).
Can be empty yes · Privacy nested · Public copy field by field (below)
datesSTRUCT(date VARCHAR, "role" VARCHAR)[]yesnestedfield by field (below)Decisions v2: dates that set or schedule the decision, with role (effective, continued_to, hearing, deadline, other).
Can be empty yes · Privacy nested · Public copy field by field (below)
topicsVARCHAR[]yesnoneas isDecisions v2: topics chosen by a model from a fixed list (housing, whats-being-built, parks, transit, ...).
Can be empty yes · Privacy none · Public copy as is
cityVARCHARnononeas issf or van.
Values sf, van
Can be empty no · Privacy none · Public copy as is
privacy_flagVARCHARyesnoneas ismay_name_private_person_after_1950 on rows from 1952 on that have a quote.
Values may_name_private_person_after_1950
Can be empty yes · Privacy none · Public copy as is
decision_groupVARCHARyesnoneas isOne id per printed item (v0.6.1; see decisions.decision_group).
Can be empty yes · Privacy none · Public copy as is
row_keyVARCHARnononeas is<run_id>/<page_id>/<seq>.
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

run_idpage_idpage_urlseqdecision_idyeardatequote
bos-corpus-2026-09journalofproc…2sanfrich:682archive.org/deta…nfrich/page/n679 ↗journalofproceed34part2sanfrich|273decision/jour…2sanfrich|27319391939-10-16Resolution No. 588, as follows: Resolved. That certain dia…
bos-corpus-2026-09journalofproceed25sanfrich:192archive.org/deta…nfrich/page/n191 ↗journalofproceed25sanfrich|154decision/jour…5sanfrich|15419301930-01-20Ordinance, is hereby changed so as to place the property f…
bos-corpus-2026-09journalofproc…sanfrich:1482archive.org/deta…frich/page/n1482 ↗journalofproceed22sanfrich|1610decision/jour…sanfrich|161019271927-08-01Ordinance No. 1061, entitled "Regulating the Width of Side…
bos-corpus-2026-09journalofproc…6sanfrich:117archive.org/deta…nfrich/page/n116 ↗journalofproceed1916sanfrich|97decision/jour…16sanfrich|9719161916-01-31Resolution No. (New Series), as follows: Resolved, That pe…
bos-corpus-2026-09journalofproc…4sanfrich:879archive.org/deta…nfrich/page/n879 ↗journalofproceed1914sanfrich|1037decision/jour…sanfrich|103719141914-07-21Resolution No. 11046 (New Series), as follows: Resolved, T…
bos-corpus-2026-09journalofproc…8sanfrich:187archive.org/deta…nfrich/page/n184 ↗journalofproceed1918sanfrich|274decision/jour…8sanfrich|27419181918-02-25Ordinance of said I City and County of San Francisco, said…
bos-corpus-2026-09journalofproc…sanfrich:1845archive.org/deta…frich/page/n1845 ↗journalofproceed21sanfrich|2402decision/jour…sanfrich|240219261926-11-08Resolution No. 26410 (New Series), as follows: Resolved, T…
bos-corpus-2026-09journalofproc…sanfrich:1731archive.org/deta…frich/page/n1731 ↗journalofproceed23sanfrich|2207decision/jour…sanfrich|220719281928-08-13Resolution No. 28175 (New Series), for premises on the sou…

8 of 50 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_decisions.parquet ↗94.0 MB
SQLite (all tables)qipu_sf.db ↗6.44 GB

SQL

SELECT * FROM x_decisions 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_decisions.parquet' LIMIT 5").show()