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 "
| 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).