← qipu data

qipu data: data dictionary (v1)

Generated from the tables as built (scripts/45_docs.py). Files: release/v1/parquet/<table>.parquet. Ids are stable across rebuilds. Empty columns are columns of the design (DATA_ARCHITECTURE.md section 7) the existing data cannot fill yet; nothing is invented to fill them.

claims (2,484,188 rows)

The core table: one small statement per row, the same shape for every source (DATA_ARCHITECTURE.md 7.4).

column type meaning
subject_id VARCHAR What the statement is about: a decision (qipu:sf/decision/...), a place, a person (qipu:sf/person/...) or an archive item (ia:<identifier>).
subject_label VARCHAR Readable label of the subject.
property VARCHAR Controlled list: outcome, voted, concerns_place, built, depicted_in, recorded_at, happened_at, ballot_result.
property_detail VARCHAR The source file's own name for the statement (e.g. sanborn_map_shows, voted_aye, timeline_moment).
object_id VARCHAR The other entity, when there is one (the decision a supervisor voted on; the place an archive item concerns).
value_num DOUBLE Numeric value (e.g. the year built from the assessor roll).
value_text VARCHAR Text value: the outcome, the vote (yes/no/absent/excused), the line as written.
summary VARCHAR For outcome claims: the one-line plain summary of the decision. For votes: the printed outcome phrase.
unit VARCHAR Empty in v1.
currency VARCHAR Empty in v1.
value_year INTEGER Empty in v1 (money is not yet extracted).
t_from VARCHAR When: YYYY-MM-DD, YYYY-MM or YYYY.
t_to JSON End of an interval (empty in v1).
t_precision VARCHAR day, month or year.
place_id VARCHAR Where (a qipu place id; qipu:sf/place/city for citywide).
place_label VARCHAR The place as written in the source.
place_precision VARCHAR How exactly the source places it: address, parcel, corner, segment, street, block, stated, named place, hood, city.
lat DOUBLE Latitude where the source file gives one.
lon DOUBLE Longitude where the source file gives one.
page_id VARCHAR The archive.org page: <identifier>:<leaf> (see pages).
source_id VARCHAR The source: an archive.org identifier, or web:<url> for other sources.
source_url VARCHAR Link to the source page.
source_label VARCHAR Readable source name.
licence VARCHAR The source's licence where the source file states it.
quote VARCHAR Short quote of the source (<= 300 characters). See privacy_flag.
extraction_table VARCHAR Which table or file the statement came from (bos_records, resweep, x_roll_calls, map_blocks, site_decisions, ...).
run_id VARCHAR The extraction run (see runs).
seq VARCHAR The row id inside that table or file.
confidence DOUBLE 0-1 where a run gives one (votes: 0.95 when the printed counts match the names).
status VARCHAR extracted (machine-read), record (from an official register: assessor, DataSF), curated (written or checked by qipu for the map). No verified rows yet.
inferred BOOLEAN True when the claim is inferred from others (none in v1).
claim_kind VARCHAR event or observation.
topic VARCHAR Topic label from the run.
outcome VARCHAR Decision outcome where known.
importance BIGINT qipu importance score 0-100 (map ranking).
page_exact BOOLEAN True 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.
privacy_flag VARCHAR may_name_private_person_after_1950 on Board text from 1950 on. The public SQLite leaves those quotes out.
name_printed VARCHAR Votes: the name as printed in the roll call.
city VARCHAR
rights_note VARCHAR
collection_group VARCHAR
place_role VARCHAR
qualifiers JSON
privacy_class VARCHAR
public_after_year INTEGER
claim_id VARCHAR Stable id. c: + hash of (table, origin row, property, subject, object, place); votes: v:<rollcall_id>:<n>.
n_support BIGINT
n_support_1 BIGINT
media_id VARCHAR
release_added VARCHAR
display_n INTEGER
t_lo DATE
t_hi DATE
reliability VARCHAR
mention_id VARCHAR

decisions (412,296 rows)

One row per thing the Board of Supervisors did (an item in the Journal, a re-swept item, a hand-built decision, or a site row with no item behind it).

column type meaning
decision_id VARCHAR 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:....
item_id VARCHAR
origin VARCHAR bos_corpus, resweep, map_blocks, site, hand.
year BIGINT
date VARCHAR
kind VARCHAR
heading VARCHAR
plain VARCHAR
record_type VARCHAR
topic VARCHAR
subtopic VARCHAR
action VARCHAR
outcome VARCHAR
importance BIGINT
source_url VARCHAR
block VARCHAR
streets VARCHAR
amounts VARCHAR
how_placed VARCHAR
classified_by VARCHAR
hocr_leaf BIGINT Page index in the OCR (before the leaf map).
page_exact BOOLEAN
significance VARCHAR
who VARCHAR
place_text VARCHAR
run_id VARCHAR
address VARCHAR
amount BIGINT
quote VARCHAR
site_plain VARCHAR
site_outcome VARCHAR
site_importance BIGINT
site_hidden VARCHAR
site_ids VARCHAR
outcome_best VARCHAR passed / refused / rejected / vetoed / pending / unknown (the map's value first, then the run's).
plain_best VARCHAR The best one-line summary (the map's corrected line first).
instrument_id VARCHAR Ordinance/resolution number printed in the item (see instruments).
outcome_from VARCHAR
same_as VARCHAR
city VARCHAR
privacy_flag VARCHAR
summary_by VARCHAR

x_decisions (351,493 rows)

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.

column type meaning
run_id VARCHAR
page_id VARCHAR
seq VARCHAR
decision_id VARCHAR
year BIGINT
date VARCHAR
quote VARCHAR
heading_on_prev VARCHAR
kind VARCHAR
number VARCHAR
file_no VARCHAR
stage VARCHAR
outcome VARCHAR
action VARCHAR
continued_to VARCHAR
amended BOOLEAN
ayes_n BIGINT
noes_n BIGINT
absent_n BIGINT
ayes VARCHAR[]
noes VARCHAR[]
absent VARCHAR[]
mover VARCHAR
seconder VARCHAR
parties_text VARCHAR
money_text VARCHAR
places_text VARCHAR
block VARCHAR
topic VARCHAR
subtopic VARCHAR
interest BIGINT
plain VARCHAR
significance VARCHAR
record_type VARCHAR
classified_by VARCHAR
confidence DOUBLE
scan_url VARCHAR
page_exact BOOLEAN
action_raw VARCHAR
department VARCHAR
parties STRUCT("name" VARCHAR, "role" VARCHAR)[]
money STRUCT(amount DOUBLE, currency VARCHAR, purpose VARCHAR, payee VARCHAR, direction INTEGER)[]
places STRUCT("text" VARCHAR, street VARCHAR, number VARCHAR, from_street VARCHAR, to_street VARCHAR, block VARCHAR, lot VARCHAR, area VARCHAR, "precision" VARCHAR)[]
zoning STRUCT(from_district VARCHAR, to_district VARCHAR)[]
related STRUCT(relation VARCHAR, ref_number VARCHAR)[]
dates STRUCT(date VARCHAR, "role" VARCHAR)[]
interest_why VARCHAR
topics VARCHAR[]
city VARCHAR
privacy_flag VARCHAR
row_key VARCHAR

x_roll_calls (123,611 rows)

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

column type meaning
rollcall_id VARCHAR
item_id VARCHAR
corpus VARCHAR
page_id VARCHAR
source_id VARCHAR
leaf BIGINT
hocr_leaf BIGINT
page_exact BOOLEAN
year BIGINT
date DATE
outcome_text VARCHAR
outcome VARCHAR
ayes_n BIGINT Count as printed.
noes_n BIGINT
absent_n BIGINT
ayes_parsed BIGINT Names parsed.
noes_parsed BIGINT
absent_parsed BIGINT
counts_match BOOLEAN True when every printed count equals the names parsed (94% of roll calls).
numbers VARCHAR[][] Resolution / Ordinance / File / Bill numbers printed in the item.
context VARCHAR
quote VARCHAR
run_id VARCHAR

x_roll_call_votes (1,491,968 rows)

One row per name in a roll call: the vote, the name as printed, the person it was matched to and how (surname, surname+given, fuzzy, fuzzy_low, surname_widened, journal_only, or ambiguous/unmatched with no person).

column type meaning
rollcall_id VARCHAR
vote VARCHAR
name_printed VARCHAR
person_id VARCHAR
match VARCHAR

x_site_rows (47,167 rows)

The map's decision rows (citywide decades, street layer) with the item they come from (linked_item).

column type meaning
site_id VARCHAR
decision_id VARCHAR
linked_item VARCHAR
origins VARCHAR[]
plain VARCHAR
year BIGINT
date VARCHAR
outcome VARCHAR
topic VARCHAR
significance VARCHAR
hidden VARCHAR
importance BIGINT
importance_why VARCHAR
place VARCHAR
src VARCHAR
src_mapped VARCHAR
blocks VARCHAR[]
streets VARCHAR[]
hoods VARCHAR[]

sources (8,434 rows)

Every source cited. archive.org items carry their collections and Democracy's Library membership.

column type meaning
source_id VARCHAR
collection VARCHAR
collections VARCHAR[]
in_democracys_library BOOLEAN True when one of the item's collections is in Democracy's Library scope: the DL pools (instituteofgovernmentalstudieslibrary, USGovernmentDocuments, fedlink, governmentpublications, us_census, nasa, ...) or one of the 830 child collections of democracys-library (DL_INVENTORY.md section 1). SF Public Library scans are not in DL.
dl_rule VARCHAR Which collection made it DL, or why not.
kind VARCHAR board_journal, board_minutes, council_minutes, report, plan, eir, book, film, audio, photo, open_data, encyclopedia, map, web ...
title VARCHAR
creator VARCHAR
publisher VARCHAR
year_from BIGINT
year_to BIGINT
pages BIGINT archive.org imagecount.
ocr_quality VARCHAR
licence VARCHAR
holder VARCHAR
digitized BOOLEAN
on_archive_org BOOLEAN
url VARCHAR
n_claims HUGEINT Claims citing it.
notes VARCHAR

pages (118,891 rows)

Every archive.org page cited. We point at the scans; we never copy them.

column type meaning
page_id VARCHAR <identifier>:<leaf>
source_id VARCHAR
printed_page VARCHAR Empty in v1.
meeting_date DATE Earliest dated claim on the page.
text_sha1 VARCHAR Empty in v1.
ocr_engine VARCHAR Empty in v1.
scan_url VARCHAR Opens the page on archive.org.
iiif_url VARCHAR The page image through archive.org IIIF (v3).
leaf_num INTEGER
display_n INTEGER
page_exact BOOLEAN
n_claims BIGINT
ocr_file_sha1 VARCHAR

runs (26 rows)

What made each table: rules, hand work, or a model run (model, prompt).

column type meaning
run_id VARCHAR
kind VARCHAR
model VARCHAR
prompt_version VARCHAR
schema_version VARCHAR
settings VARCHAR
started VARCHAR
pages INTEGER
cost_usd DOUBLE
gold_scores VARCHAR
notes VARCHAR
gold_id VARCHAR
prompt_id VARCHAR
extraction_table VARCHAR
city VARCHAR

places (466,239 rows)

Today's places with stable qipu ids.

column type meaning
place_id VARCHAR qipu:sf/place/address/eas-<EAS id>, .../parcel/<block>-<lot>, .../block/<block>, .../street/<name-type>, .../street/<name> (printed without type, street_name), .../hood/<slug>, .../landmark/<slug>, .../city.
kind VARCHAR address, parcel, block, street, street_name, neighbourhood, landmark, city.
name VARCHAR
parent_id VARCHAR address -> parcel -> block -> neighbourhood -> city.
apn VARCHAR Assessor block + lot.
eas_id VARCHAR DataSF Enterprise Addressing System base id.
cnn VARCHAR Empty in v1.
wikidata VARCHAR
lat DOUBLE
lon DOUBLE
number BIGINT
street VARCHAR
street_id VARCHAR
block VARCHAR
lot VARCHAR
hood VARCHAR DataSF Analysis Neighborhood (point in polygon).
valid_from DATE Empty in v1 (the historic place index comes later).
valid_to DATE
source VARCHAR
radius_m DOUBLE
gnis VARCHAR
geometry_note VARCHAR
type_id VARCHAR
city VARCHAR
specificity DOUBLE
rep_lat DOUBLE
rep_lon DOUBLE
status VARCHAR
area_m2 DOUBLE

place_names (2,268 rows)

Names of places (official, alias). The historic names index starts here; v1 holds today's names and the search aliases.

column type meaning
place_id VARCHAR
name VARCHAR
name_kind VARCHAR
from VARCHAR
to VARCHAR
source VARCHAR

address_resolution (4,058 rows)

Raw " " texts seen in claims, resolved exactly to today's EAS address. Only exact, unique matches in v1.

column type meaning
raw_text VARCHAR
year INTEGER
place_id VARCHAR
precision VARCHAR
method VARCHAR
confidence DECIMAL(2,1)
run_id VARCHAR

persons (294 rows)

People resolved in v1: the members of the Board of Supervisors (official roster: the Wikipedia list, with Wikidata ids), plus four supervisors printed in the Journals but missing from that list (journal_only).

column type meaning
person_id VARCHAR
display_name VARCHAR
born VARCHAR
died VARCHAR
wikidata VARCHAR
is_public_official BOOLEAN
wikipedia VARCHAR
roster_source VARCHAR
first_year BIGINT
last_year BIGINT
aka VARCHAR[]

person_names (9,251 rows)

Each name as printed in roll calls, with the years seen and the person it resolves to.

column type meaning
person_id VARCHAR
name_printed VARCHAR
from BIGINT
to BIGINT
n BIGINT
match VARCHAR

roles (318 rows)

Supervisor terms (contiguous years served, from the roster).

column type meaning
person_id VARCHAR
role VARCHAR
org_id VARCHAR
from INTEGER
to INTEGER
source VARCHAR

orgs (1 rows)

Organisations (v1: the Board).

column type meaning
org_id VARCHAR
name VARCHAR
kind VARCHAR
wikidata VARCHAR

instruments (72,621 rows)

Ordinances, resolutions and bills by printed number.

column type meaning
instrument_id VARCHAR qipu:sf/instrument/<res|ord|bill>/<year>-<n> when the number prints its year (627-91), s<year>-<n> for "(Series of 1939)", ns-<n> for "(New Series)", else y<journal year>-<n>.
kind VARCHAR
number VARCHAR
year BIGINT
year_basis VARCHAR printed, or the Journal year (assumed).
title VARCHAR
file_no VARCHAR
first_page_id VARCHAR
n_decisions BIGINT
note VARCHAR

decision_numbers (88,876 rows)

Decision -> number(s) printed in its text.

column type meaning
decision_id VARCHAR
kind VARCHAR
number VARCHAR
number_year INTEGER
series VARCHAR
file_no VARCHAR
year BIGINT
source_url VARCHAR
instrument_id VARCHAR

media (1,405 rows)

Every photo, film, recording, clip and document the map shows (timelines, covers, hood stories, block items, films, clips), with its credit, licence, holder and a rights note. Claims depicted_in / recorded_at tie each to its place and year.

column type meaning
media_id VARCHAR qipu:sf/media/<hash of its URL>, stable.
kind VARCHAR
url VARCHAR
file_url VARCHAR
embed_url VARCHAR
title VARCHAR
credit VARCHAR
licence VARCHAR
holder VARCHAR Who holds the rights or the copy.
rights_note VARCHAR What a reuser must know, by holder rule (e.g. WNP: ask before public use; Live Music Archive: non-commercial).
year BIGINT
used_in VARCHAR[] Where the map shows it (file and key).
source_identifier VARCHAR
start_s BIGINT
placed_because VARCHAR
distance_m BIGINT
end_s BIGINT
derived_from VARCHAR
clip_seconds DOUBLE
not_cut_because VARCHAR
media_kind VARCHAR
created_edtf VARCHAR
use_policy VARCHAR
city VARCHAR

x_appraisals (3,189 rows)

Extraction table: the SF Redevelopment Agency property files of the Western Addition A-2 project (SFPL scans on archive.org), one row per parcel page (claude-haiku-5-5, sfra_extract.py), matched to today's parcels by sfra_build.py.

column type meaning
block VARCHAR
lot VARCHAR
precision VARCHAR
xy DOUBLE[]
year BIGINT
text VARCHAR
where VARCHAR
address_printed VARCHAR
block_printed VARCHAR
lot_printed VARCHAR
parcel_printed VARCHAR
kind_page VARCHAR
building VARCHAR
units VARCHAR
rent_example VARCHAR
rent_total VARCHAR
appraised_value VARCHAR
assessed_total VARCHAR
sale_price VARCHAR
sale_date VARCHAR
owner VARCHAR
present_use VARCHAR
confidence VARCHAR
item VARCHAR
page BIGINT
url VARCHAR
run_id VARCHAR
seq BIGINT
page_id VARCHAR
row_key VARCHAR

x_dl_tags (1,131 rows)

Extraction table: Democracy's Library (IGS) items about SF, with the neighbourhoods, streets and places each is about (claude-haiku-5-5 on metadata + first OCR, dl_tag.py).

column type meaning
about_sf BOOLEAN
doc_type VARCHAR
scope VARCHAR
hoods VARCHAR[]
streets VARCHAR[]
places VARCHAR[]
evidence VARCHAR
identifier VARCHAR
run_id VARCHAR
seq BIGINT

place_geometries (459,606 rows)

Dated geometry versions of places (EPSG:4326): parcel and block polygons, address points, street lines, neighbourhoods, the 1906 burn zone, showcase features (approximate circles). hit_geom is the clickable footprint (points and lines buffered by the place type), hit_area_m2 drives specificity.

column type meaning
place_id VARCHAR
geom_version INTEGER
valid_from DATE
valid_to DATE
geom GEOMETRY
hit_geom GEOMETRY
geom_kind VARCHAR
bounds VARCHAR
source VARCHAR
area_m2 DOUBLE
length_m DOUBLE
hit_area_m2 DOUBLE
bbox_xmin DOUBLE
bbox_ymin DOUBLE
bbox_xmax DOUBLE
bbox_ymax DOUBLE

claim_support (1,049,703 rows)

One row per staged extraction row behind a claim: the same statement read by several runs or layers is one claim with several supports.

column type meaning
claim_id VARCHAR
extraction_table VARCHAR
row_key VARCHAR
run_id VARCHAR
confidence DOUBLE
agrees BOOLEAN

properties (54 rows)

The claim property vocabulary (spec/vocab/properties.csv).

column type meaning
property VARCHAR
domain VARCHAR
range VARCHAR
claim_kind VARCHAR
definition VARCHAR
wikidata_property VARCHAR
wikidata_match VARCHAR
use_case VARCHAR
since_spec VARCHAR
deprecated_by VARCHAR
sources VARCHAR

place_types (82 rows)

The place type vocabulary (spec/vocab/place_types.csv): id segment, family, clickable buffer, salience, Wikidata class.

column type meaning
type_id VARCHAR
id_segment VARCHAR
family VARCHAR
label VARCHAR
broader_type VARCHAR
default_geom VARCHAR
hit_buffer_m VARCHAR
salience VARCHAR
wikidata_class VARCHAR
definition VARCHAR

cities (2 rows)

City configuration (config/cities/*.json): namespace, currency, privacy embargo, address authority.

column type meaning
city VARCHAR
name VARCHAR
country VARCHAR
jurisdiction_id VARCHAR
currency VARCHAR
privacy_embargo_years INTEGER
address_authority VARCHAR
wikidata VARCHAR
bbox DOUBLE[]

privacy_rules (2 rows)

Names of private people are public after N years: sf 75, van 92.

column type meaning
city VARCHAR
applies_to VARCHAR
embargo_years INTEGER
basis VARCHAR

events (1 rows)

Events (v0.3: the 1906 earthquake and fire, with its burn-zone footprint).

column type meaning
event_id VARCHAR
city VARCHAR
label VARCHAR
event_type VARCHAR
t_from VARCHAR
t_to VARCHAR
footprint_place_id VARCHAR
wikidata VARCHAR

field_scores (26 rows)

Measured accuracy per run and field, from the benchmarks (L4_TEST.md, sfra bench, the roll-call gold). Claims from these runs say reliability = measured.

column type meaning
run_id VARCHAR
field VARCHAR
metric VARCHAR
value DOUBLE
gold_id VARCHAR
against VARCHAR
n INTEGER

corrections (0 rows)

The human layer (empty in v0.3): edits applied on top of claims, never replacing extractions.

column type meaning
correction_id VARCHAR
target_kind VARCHAR
target_id VARCHAR
field VARCHAR
new_value VARCHAR
who VARCHAR
at_time TIMESTAMP
why VARCHAR
review VARCHAR

id_redirects (15,401 rows)

Stable-id policy: a merged or retired id keeps resolving through this table (empty in v0.1, the first release).

column type meaning
old_id VARCHAR
new_id VARCHAR
reason VARCHAR
since_release VARCHAR

Reliability by field

How each field was made and how well it is known. "Unmeasured" means no gold exists yet; nothing here is a guess.

field made by reliability
x_roll_calls: counts (ayes/noes/absent) rules (20_rollcalls.py) Rule check on all 123,611 roll calls: printed counts equal the names parsed in 90.6% (2,900 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).
x_roll_call_votes.person_id (who voted) rules: surname + years served, official roster 99.4% of 1,491,968 printed names matched to a person (1,797 ambiguous, left empty). Gold names: 536/541 matched. Correctness of each match: unmeasured (no gold of names to persons yet); confidence in claims drops to 0.6 when the counts do not match.
claims voted: value_text (yes/no/absent) rules Same as the roll-call counts above; unmeasured separately.
decisions.block, concerns_place (block level) rules (map block index) Measured 2026-10-06 on 3,195 checks (accuracy.json): 88.9% on the exact block, 91.6% within one block face, 95.5% within 250 m. By tier: address 92.8%, corner 51.9%, segment 71.4%. Street-tier placements (a street, not a block) are not scored.
pages.leaf / page links per-volume leaf map (scandata) 97,246 of 97,871 Board pages are leaf-mapped (page_exact); the rest may be a page or two off. Spot check 14/10: the IIIF manifest of journalofproceed1915sanfrich puts canvas n1102 on file leaf 1115, the OCR leaf our item came from.
decisions.topic / subtopic / action (bos_corpus) rules + title classification (build_core_table.py) unmeasured
decisions from the re-sweep: outcome, topic, plain, place (claude-haiku-5-5, RESWEEP_PROMPT.md) LLM, one item at a time unmeasured for this prompt. Indicative only (same model, page-level prompt, SF gold, L4_TEST.md): action 0.97, topics F1 0.84, places F1 0.89.
decisions.plain_best (the map's one-line summaries) LLM + accuracy pass (CHECK_PROMPT.md) unmeasured as a rate; lines the accuracy pass found wrong were rewritten or dropped.
instruments (numbers) regex on the item text unmeasured. OCR can garble numbers (1G2 for 162); those are not parsed.
address_resolution exact text match to DataSF EAS exact matches only, by construction; unmatched texts are not resolved.
sources.in_democracys_library rule: the item's collections vs DL scope (DL_INVENTORY.md) exact by definition, as of the metadata fetched 14/10/2026.
built (assessor year built), fire_1906, sanborn lines official records (DataSF, Sanborn via OldInsuranceMaps) record values, not extracted; the Sanborn line wording is a convention of the map (unmeasured).
dl_documents links (archive items to places) IA full-text search + relevance score unmeasured; confidence holds the search relevance score.
x_dl_tags (places a DL item is about) LLM on metadata + first OCR unmeasured (no gold of document places yet).
media rights_note rules by holder, on top of the licence the map recorded rule output; the item page is the authority. 17 items have no holder rule (rights not recorded: link only).
x_decisions v2 money currency (SF) fixed in the build the run's writer stamps CAD on every amount; SF amounts are relabelled USD in the release (run files unchanged).
stories, timelines, doors, dateline written for the map (LLM + hand review on demo streets) unmeasured; each line cites its source.
x_decisions run sf-v21-haiku-1014 / van-v21-haiku-1014 (decisions v2) LLM, one call per page agreement 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).
x_appraisals (SFRA property files), claude-haiku-5-5 LLM, one call per page measured on 18 pages (ia_records/sfra/bench/score.json): address 18/18, parcel 18/18, owner 18/18, present_use 17/18, rent 16/18, appraised_value 18/18.

Measured field scores (from field_scores)

run field metric value gold
rollcall-parser-v1 counts exact where the roll is in the text 0.87 decisions_bench/gold.jsonl roll calls (Opus-written key), scripts/22_rollcall_gold.py
rollcall-parser-v1 names to persons matched 0.99 decisions_bench/gold.jsonl roll calls (Opus-written key), scripts/22_rollcall_gold.py
sf-v21-haiku-1014 action exact 0.95 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 dates F1 (vs Opus key) 0.55 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 finds recall 0.95 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 interest Spearman 0.78 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 money F1 (vs Opus key) 0.80 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 mover exact 0.93 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 number exact 1.00 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 number+action+votes all exact 0.95 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 parties F1 (vs Opus key) 0.61 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 places F1 (vs Opus key) 0.66 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 related F1 (vs Opus key) 0.17 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 topics F1 0.90 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 vote names exact 0.95 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sf-v21-haiku-1014 votes (counts) exact 0.99 decisions_bench/gold.jsonl (SF, 40 pages: an Opus-5.5-written key, no record of a hand check) + v2 Opus key
sfra-appraisals-haiku55-2026-10 address normalized exact (18 pages) 1.00 ia_records/sfra/bench (18 pages)
sfra-appraisals-haiku55-2026-10 appraised_value normalized exact (18 pages) 1.00 ia_records/sfra/bench (18 pages)
sfra-appraisals-haiku55-2026-10 owner normalized exact (18 pages) 1.00 ia_records/sfra/bench (18 pages)
sfra-appraisals-haiku55-2026-10 parcel normalized exact (18 pages) 1.00 ia_records/sfra/bench (18 pages)
sfra-appraisals-haiku55-2026-10 present_use normalized exact (18 pages) 0.94 ia_records/sfra/bench (18 pages)
sfra-appraisals-haiku55-2026-10 rent normalized exact (18 pages) 0.89 ia_records/sfra/bench (18 pages)
van-v21-haiku-1014 money F1 (vs Opus key) 0.73 decisions_bench Vancouver gold (30 pages, 48 decisions: Opus-written, 21 decisions hand-checked)
van-v21-haiku-1014 mover exact 1.00 decisions_bench Vancouver gold (30 pages, 48 decisions: Opus-written, 21 decisions hand-checked)
van-v21-haiku-1014 number+action+votes all exact 0.98 decisions_bench Vancouver gold (30 pages, 48 decisions: Opus-written, 21 decisions hand-checked)
van-v21-haiku-1014 vote names exact 0.98 decisions_bench Vancouver gold (30 pages, 48 decisions: Opus-written, 21 decisions hand-checked)

Public SQLite copy (qipu_sf.db)

The same tables for browsing, plus ready-joined tables for the showcase questions (place_records, street_zoning, refused, hood_archive_items, supervisor_totals) and compact votes / roll_calls with the view vote_claims (votes in claim shape). In this copy the outcome claims of Board items live in decisions, and Board quotes from 1950 on are left out (privacy rule).