Skip to content

Generated Storage Schema

This page is generated from a real in-memory SQLite database after migrations run.

Migration count: 22.

Schema overview

Migrations

  • packages/politiclaw-plugin/src/storage/migrations/0001_init.sql
  • packages/politiclaw-plugin/src/storage/migrations/0002_reps.sql
  • packages/politiclaw-plugin/src/storage/migrations/0003_bills.sql
  • packages/politiclaw-plugin/src/storage/migrations/0004_bill_alignment.sql
  • packages/politiclaw-plugin/src/storage/migrations/0005_snapshots.sql
  • packages/politiclaw-plugin/src/storage/migrations/0006_rep_votes.sql
  • packages/politiclaw-plugin/src/storage/migrations/0007_rep_scores.sql
  • packages/politiclaw-plugin/src/storage/migrations/0008_ballot.sql
  • packages/politiclaw-plugin/src/storage/migrations/0009_monitoring_cadence.sql
  • packages/politiclaw-plugin/src/storage/migrations/0010_letters.sql
  • packages/politiclaw-plugin/src/storage/migrations/0011_hot_path_indexes.sql
  • packages/politiclaw-plugin/src/storage/migrations/0012_alert_history.sql
  • packages/politiclaw-plugin/src/storage/migrations/0013_letter_redraft.sql
  • packages/politiclaw-plugin/src/storage/migrations/0014_monitoring_mode.sql
  • packages/politiclaw-plugin/src/storage/migrations/0015_accountability.sql
  • packages/politiclaw-plugin/src/storage/migrations/0016_action_moments.sql
  • packages/politiclaw-plugin/src/storage/migrations/0017_preferences_action_prompting.sql
  • packages/politiclaw-plugin/src/storage/migrations/0018_issue_stance_notes.sql
  • packages/politiclaw-plugin/src/storage/migrations/0019_stance_signals_drop_issue.sql
  • packages/politiclaw-plugin/src/storage/migrations/0020_auto_direction.sql
  • packages/politiclaw-plugin/src/storage/migrations/0021_legislation_review_model.sql
  • packages/politiclaw-plugin/src/storage/migrations/0022_stance_signals_per_stance.sql

Tables

action_package_feedback

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
package_idINTEGERyesnon/a
created_atINTEGERyesnon/a
verdictTEXTyesnon/a
noteTEXTnonon/a
sql
CREATE TABLE action_package_feedback (
  id           INTEGER PRIMARY KEY AUTOINCREMENT,
  package_id   INTEGER NOT NULL REFERENCES action_packages(id),
  created_at   INTEGER NOT NULL,
  verdict      TEXT NOT NULL CHECK(verdict IN ('useful','not_now','stop')),
  note         TEXT
)

action_packages

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
created_atINTEGERyesnon/a
trigger_classTEXTyesnon/a
package_kindTEXTyesnon/a
outreach_modeTEXTnonon/a
bill_idTEXTnonon/a
rep_idTEXTnonon/a
issueTEXTnonon/a
election_dateTEXTnonon/a
decision_hashTEXTyesnon/a
summaryTEXTyesnon/a
statusTEXTyesno'open'
status_atINTEGERyesnon/a
generated_letter_idINTEGERnonon/a
generated_call_script_idINTEGERnonon/a
generated_reminder_idINTEGERnonon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
sql
CREATE TABLE action_packages (
  id                        INTEGER PRIMARY KEY AUTOINCREMENT,
  created_at                INTEGER NOT NULL,
  trigger_class             TEXT NOT NULL CHECK(trigger_class IN (
                              'bill_nearing_vote',
                              'tracked_event_scheduled',
                              'repeated_misalignment',
                              'election_proximity',
                              'new_bill_high_relevance'
                            )),
  package_kind              TEXT NOT NULL CHECK(package_kind IN (
                              'outreach',
                              'reminder',
                              'election_prep_prompt'
                            )),
  outreach_mode             TEXT CHECK(outreach_mode IN ('letter','call')),
  bill_id                   TEXT,
  rep_id                    TEXT,
  issue                     TEXT,
  election_date             TEXT,
  decision_hash             TEXT NOT NULL,
  summary                   TEXT NOT NULL,
  status                    TEXT NOT NULL DEFAULT 'open'
                            CHECK(status IN ('open','used','dismissed','stopped','expired')),
  status_at                 INTEGER NOT NULL,
  generated_letter_id       INTEGER,
  generated_call_script_id  INTEGER,
  generated_reminder_id     INTEGER,
  source_adapter_id         TEXT NOT NULL,
  source_tier               INTEGER NOT NULL CHECK(source_tier BETWEEN 1 AND 5)
)

alert_history

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
created_atINTEGERyesnon/a
kindTEXTyesnon/a
ref_idTEXTyesnon/a
change_reasonTEXTyesnon/a
summaryTEXTyesnon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
sql
CREATE TABLE alert_history (
  id                INTEGER PRIMARY KEY AUTOINCREMENT,
  created_at        INTEGER NOT NULL,
  kind              TEXT NOT NULL CHECK(kind IN ('bill_change', 'event_change')),
  ref_id            TEXT NOT NULL,
  change_reason     TEXT NOT NULL,
  summary           TEXT NOT NULL,
  source_adapter_id TEXT NOT NULL,
  source_tier       INTEGER NOT NULL
)

alert_settings

ColumnTypeNot NullPrimary KeyDefault
keyTEXTnoyesn/a
valueTEXTyesnon/a
sql
CREATE TABLE alert_settings (
  key             TEXT PRIMARY KEY,
  value           TEXT NOT NULL
)

ballot_explanations

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
election_dayTEXTnonon/a
stance_snapshot_hashTEXTnonon/a
narrative_textTEXTyesnon/a
coverage_jsonTEXTyesnon/a
computed_atINTEGERyesnon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
sql
CREATE TABLE ballot_explanations (
  id                     INTEGER PRIMARY KEY AUTOINCREMENT,
  election_day           TEXT,
  stance_snapshot_hash   TEXT,
  narrative_text         TEXT NOT NULL,
  coverage_json          TEXT NOT NULL,
  computed_at            INTEGER NOT NULL,
  source_adapter_id      TEXT NOT NULL,
  source_tier            INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5)
)

ballots

ColumnTypeNot NullPrimary KeyDefault
address_hashTEXTnoyesn/a
normalized_input_jsonTEXTnonon/a
election_jsonTEXTnonon/a
contests_jsonTEXTyesnon/a
logistics_jsonTEXTyesnon/a
fetched_atINTEGERyesnon/a
ttl_msINTEGERyesno86400000
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
raw_response_jsonTEXTyesnon/a
sql
CREATE TABLE ballots (
  address_hash           TEXT PRIMARY KEY,
  normalized_input_json  TEXT,
  election_json          TEXT,
  contests_json          TEXT NOT NULL,
  logistics_json         TEXT NOT NULL,
  fetched_at             INTEGER NOT NULL,
  ttl_ms                 INTEGER NOT NULL DEFAULT 86400000,
  source_adapter_id      TEXT NOT NULL,
  source_tier            INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5),
  raw_response_json      TEXT NOT NULL
)

bill_alignment

ColumnTypeNot NullPrimary KeyDefault
bill_idTEXTyesyesn/a
bill_update_dateTEXTyesyesn/a
stance_snapshot_hashTEXTyesyesn/a
relevanceREALyesnon/a
confidenceREALyesnon/a
matched_jsonTEXTyesnon/a
rationaleTEXTyesnon/a
computed_atINTEGERyesnon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
sql
CREATE TABLE "bill_alignment" (
  bill_id              TEXT NOT NULL,
  bill_update_date     TEXT NOT NULL,
  stance_snapshot_hash TEXT NOT NULL,
  relevance            REAL NOT NULL CHECK (relevance BETWEEN 0 AND 1),
  confidence           REAL NOT NULL CHECK (confidence BETWEEN 0 AND 1),
  matched_json         TEXT NOT NULL,
  rationale            TEXT NOT NULL,
  computed_at          INTEGER NOT NULL,
  source_adapter_id    TEXT NOT NULL,
  source_tier          INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5),
  PRIMARY KEY (bill_id, bill_update_date, stance_snapshot_hash),
  FOREIGN KEY (bill_id) REFERENCES bills(id) ON DELETE CASCADE
)

bill_direction

ColumnTypeNot NullPrimary KeyDefault
bill_idTEXTyesyesn/a
bill_update_dateTEXTyesyesn/a
stance_snapshot_hashTEXTyesyesn/a
stance_slugTEXTyesyesn/a
kindTEXTyesnon/a
confidenceREALyesnon/a
rationaleTEXTyesnon/a
evidence_jsonTEXTyesnon/a
computed_atINTEGERyesnon/a
model_idTEXTyesnon/a
sql
CREATE TABLE bill_direction (
  bill_id              TEXT NOT NULL,
  bill_update_date     TEXT NOT NULL,
  stance_snapshot_hash TEXT NOT NULL,
  stance_slug          TEXT NOT NULL,
  kind                 TEXT NOT NULL CHECK (kind IN ('advances','obstructs','mixed','unclear')),
  confidence           REAL NOT NULL CHECK (confidence BETWEEN 0 AND 1),
  rationale            TEXT NOT NULL,
  evidence_json        TEXT NOT NULL,
  computed_at          INTEGER NOT NULL,
  model_id             TEXT NOT NULL,
  PRIMARY KEY (bill_id, bill_update_date, stance_snapshot_hash, stance_slug),
  FOREIGN KEY (bill_id) REFERENCES bills(id) ON DELETE CASCADE
)

bills

ColumnTypeNot NullPrimary KeyDefault
idTEXTnoyesn/a
congressINTEGERyesnon/a
bill_typeTEXTyesnon/a
numberTEXTyesnon/a
titleTEXTyesnon/a
origin_chamberTEXTnonon/a
introduced_dateTEXTnonon/a
latest_action_dateTEXTnonon/a
latest_action_textTEXTnonon/a
policy_areaTEXTnonon/a
subjects_jsonTEXTnonon/a
summary_textTEXTnonon/a
sponsors_jsonTEXTnonon/a
update_dateTEXTnonon/a
source_urlTEXTnonon/a
last_syncedINTEGERyesnon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
rawTEXTnonon/a
sql
CREATE TABLE bills (
  id                  TEXT PRIMARY KEY,            -- "<congress>-<billType lowercased>-<number>"
  congress            INTEGER NOT NULL,
  bill_type           TEXT NOT NULL,               -- uppercase: HR, S, HJRES, ...
  number              TEXT NOT NULL,
  title               TEXT NOT NULL,
  origin_chamber      TEXT,                        -- 'House' | 'Senate'
  introduced_date     TEXT,                        -- ISO date
  latest_action_date  TEXT,
  latest_action_text  TEXT,
  policy_area         TEXT,
  subjects_json       TEXT,                        -- JSON array of subject names
  summary_text        TEXT,
  sponsors_json       TEXT,                        -- JSON array of sponsors
  update_date         TEXT,
  source_url          TEXT,
  last_synced         INTEGER NOT NULL,
  source_adapter_id   TEXT NOT NULL,
  source_tier         INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5),
  raw                 TEXT                         -- original normalized Bill JSON for audit
)

call_scripts

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
rep_idTEXTyesnon/a
rep_nameTEXTyesnon/a
rep_officeTEXTyesnon/a
issueTEXTyesnon/a
bill_idTEXTnonon/a
opening_lineTEXTyesnon/a
ask_lineTEXTyesnon/a
one_specific_lineTEXTnonon/a
closing_lineTEXTyesnon/a
phone_numberTEXTnonon/a
stance_snapshot_hashTEXTyesnon/a
word_countINTEGERyesnon/a
created_atINTEGERyesnon/a
sql
CREATE TABLE call_scripts (
  id                    INTEGER PRIMARY KEY AUTOINCREMENT,
  rep_id                TEXT NOT NULL,
  rep_name              TEXT NOT NULL,
  rep_office            TEXT NOT NULL,
  issue                 TEXT NOT NULL,
  bill_id               TEXT,
  opening_line          TEXT NOT NULL,
  ask_line              TEXT NOT NULL,
  one_specific_line     TEXT,
  closing_line          TEXT NOT NULL,
  phone_number          TEXT,
  stance_snapshot_hash  TEXT NOT NULL,
  word_count            INTEGER NOT NULL,
  created_at            INTEGER NOT NULL
)

issue_stances

ColumnTypeNot NullPrimary KeyDefault
issueTEXTnoyesn/a
weightINTEGERyesnon/a
stanceTEXTyesnon/a
updated_atINTEGERyesnon/a
noteTEXTnonon/a
source_textTEXTnonon/a
sql
CREATE TABLE issue_stances (
  issue           TEXT PRIMARY KEY,
  weight          INTEGER NOT NULL CHECK (weight BETWEEN 1 AND 5),
  stance          TEXT NOT NULL,
  updated_at      INTEGER NOT NULL
, note TEXT, source_text TEXT)

kv_store

ColumnTypeNot NullPrimary KeyDefault
keyTEXTnoyesn/a
valueTEXTyesnon/a
updated_atINTEGERyesnon/a
sql
CREATE TABLE kv_store (
  key             TEXT PRIMARY KEY,
  value           TEXT NOT NULL,
  updated_at      INTEGER NOT NULL
)

letters

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
rep_idTEXTyesnon/a
rep_nameTEXTyesnon/a
rep_officeTEXTyesnon/a
issueTEXTyesnon/a
bill_idTEXTnonon/a
subjectTEXTyesnon/a
bodyTEXTyesnon/a
citations_jsonTEXTyesnon/a
stance_snapshot_hashTEXTyesnon/a
word_countINTEGERyesnon/a
created_atINTEGERyesnon/a
redraft_requested_atINTEGERnonon/a
sql
CREATE TABLE letters (
  id                    INTEGER PRIMARY KEY AUTOINCREMENT,
  rep_id                TEXT NOT NULL,
  rep_name              TEXT NOT NULL,
  rep_office            TEXT NOT NULL,
  issue                 TEXT NOT NULL,
  bill_id               TEXT,
  subject               TEXT NOT NULL,
  body                  TEXT NOT NULL,
  citations_json        TEXT NOT NULL,
  stance_snapshot_hash  TEXT NOT NULL,
  word_count            INTEGER NOT NULL,
  created_at            INTEGER NOT NULL
, redraft_requested_at INTEGER)

member_votes

ColumnTypeNot NullPrimary KeyDefault
vote_idTEXTyesyesn/a
bioguide_idTEXTyesyesn/a
positionTEXTyesnon/a
first_nameTEXTnonon/a
last_nameTEXTnonon/a
partyTEXTnonon/a
stateTEXTnonon/a
sql
CREATE TABLE member_votes (
  vote_id      TEXT NOT NULL,
  bioguide_id  TEXT NOT NULL,
  position     TEXT NOT NULL CHECK (position IN ('Yea', 'Nay', 'Present', 'Not Voting')),
  first_name   TEXT,
  last_name    TEXT,
  party        TEXT,
  state        TEXT,
  PRIMARY KEY (vote_id, bioguide_id),
  FOREIGN KEY (vote_id) REFERENCES roll_call_votes(id) ON DELETE CASCADE
)

mute_list

ColumnTypeNot NullPrimary KeyDefault
kindTEXTyesyesn/a
refTEXTyesyesn/a
reasonTEXTnonon/a
muted_atINTEGERyesnon/a
sql
CREATE TABLE mute_list (
  kind            TEXT NOT NULL CHECK (kind IN ('bill','rep','issue')),
  ref             TEXT NOT NULL,
  reason          TEXT,
  muted_at        INTEGER NOT NULL,
  PRIMARY KEY (kind, ref)
)

preferences

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
addressTEXTyesnon/a
zipTEXTnonon/a
stateTEXTnonon/a
districtTEXTnonon/a
monitoring_modeTEXTyesno'action_only'
updated_atINTEGERyesnon/a
accountabilityTEXTyesno'self_serve'
action_promptingTEXTyesno'on'
auto_direction_modeTEXTyesno'off'
legislation_review_modelTEXTyesno''
sql
CREATE TABLE "preferences" (
  id                 INTEGER PRIMARY KEY CHECK (id = 1),
  address            TEXT NOT NULL,
  zip                TEXT,
  state              TEXT,
  district           TEXT,
  monitoring_mode    TEXT NOT NULL DEFAULT 'action_only'
    CHECK (monitoring_mode IN ('off','quiet_watch','weekly_digest','action_only','full_copilot')),
  updated_at         INTEGER NOT NULL
, accountability TEXT NOT NULL DEFAULT 'self_serve'
  CHECK (accountability IN ('self_serve','nudge_me','draft_for_me')), action_prompting TEXT NOT NULL DEFAULT 'on'
  CHECK (action_prompting IN ('off','on')), auto_direction_mode TEXT NOT NULL DEFAULT 'off'
  CHECK (auto_direction_mode IN ('off','supplement','co-equal','advisory')), legislation_review_model TEXT NOT NULL DEFAULT '')

reminders

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
titleTEXTyesnon/a
deadlineTEXTnonon/a
anchor_bill_idTEXTnonon/a
anchor_event_idTEXTnonon/a
anchor_election_dateTEXTnonon/a
steps_jsonTEXTyesnon/a
created_atINTEGERyesnon/a
sql
CREATE TABLE reminders (
  id                    INTEGER PRIMARY KEY AUTOINCREMENT,
  title                 TEXT NOT NULL,
  deadline              TEXT,
  anchor_bill_id        TEXT,
  anchor_event_id       TEXT,
  anchor_election_date  TEXT,
  steps_json            TEXT NOT NULL,
  created_at            INTEGER NOT NULL
)

rep_scores

ColumnTypeNot NullPrimary KeyDefault
rep_idTEXTyesyesn/a
stance_snapshot_hashTEXTyesyesn/a
issueTEXTyesyesn/a
aligned_countINTEGERyesnon/a
conflicted_countINTEGERyesnon/a
considered_countINTEGERyesnon/a
relevanceREALyesnon/a
confidenceREALyesnon/a
alignment_scoreREALyesnon/a
rationaleTEXTyesnon/a
cited_bills_jsonTEXTyesnon/a
procedural_excludedINTEGERyesnon/a
computed_atINTEGERyesnon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
sql
CREATE TABLE rep_scores (
  rep_id               TEXT NOT NULL,
  stance_snapshot_hash TEXT NOT NULL,
  issue                TEXT NOT NULL,
  aligned_count        INTEGER NOT NULL CHECK (aligned_count >= 0),
  conflicted_count     INTEGER NOT NULL CHECK (conflicted_count >= 0),
  considered_count     INTEGER NOT NULL CHECK (considered_count >= 0),
  relevance            REAL NOT NULL CHECK (relevance BETWEEN 0 AND 1),
  confidence           REAL NOT NULL CHECK (confidence BETWEEN 0 AND 1),
  alignment_score      REAL NOT NULL CHECK (alignment_score BETWEEN 0 AND 1),
  rationale            TEXT NOT NULL,
  cited_bills_json     TEXT NOT NULL,
  procedural_excluded  INTEGER NOT NULL CHECK (procedural_excluded IN (0, 1)),
  computed_at          INTEGER NOT NULL,
  source_adapter_id    TEXT NOT NULL,
  source_tier          INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5),
  PRIMARY KEY (rep_id, stance_snapshot_hash, issue),
  FOREIGN KEY (rep_id) REFERENCES reps(id) ON DELETE CASCADE
)

reps

ColumnTypeNot NullPrimary KeyDefault
idTEXTnoyesn/a
nameTEXTyesnon/a
officeTEXTyesnon/a
partyTEXTnonon/a
jurisdictionTEXTnonon/a
districtTEXTnonon/a
stateTEXTnonon/a
contactTEXTnonon/a
last_syncedINTEGERyesnon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
rawTEXTnonon/a
sql
CREATE TABLE reps (
  id                TEXT PRIMARY KEY,           -- stable external id (bioguide where available)
  name              TEXT NOT NULL,
  office            TEXT NOT NULL,              -- 'US Senate' | 'US House' | 'Governor' | ...
  party             TEXT,
  jurisdiction      TEXT,                       -- 'US-CA-12', state code, etc.
  district          TEXT,                       -- numeric district for House members; null for Senate
  state             TEXT,                       -- 2-letter code for federal reps
  contact           TEXT,                       -- JSON blob: phone, url, address (adapter-shaped)
  last_synced       INTEGER NOT NULL,
  source_adapter_id TEXT NOT NULL,
  source_tier       INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5),
  raw               TEXT                         -- original JSON from the source adapter
)

roll_call_votes

ColumnTypeNot NullPrimary KeyDefault
idTEXTnoyesn/a
chamberTEXTyesnon/a
congressINTEGERyesnon/a
sessionINTEGERyesnon/a
roll_call_numberINTEGERyesnon/a
start_dateTEXTnonon/a
update_dateTEXTnonon/a
vote_typeTEXTnonon/a
resultTEXTnonon/a
vote_questionTEXTnonon/a
bill_idTEXTnonon/a
amendment_idTEXTnonon/a
amendment_authorTEXTnonon/a
legislation_urlTEXTnonon/a
source_urlTEXTnonon/a
is_proceduralINTEGERnonon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
synced_atINTEGERyesnon/a
sql
CREATE TABLE roll_call_votes (
  id                  TEXT PRIMARY KEY,                  -- `<chamber>-<congress>-<session>-<rollCall>`
  chamber             TEXT NOT NULL CHECK (chamber IN ('House', 'Senate')),
  congress            INTEGER NOT NULL,
  session             INTEGER NOT NULL CHECK (session IN (1, 2)),
  roll_call_number    INTEGER NOT NULL,
  start_date          TEXT,
  update_date         TEXT,
  vote_type           TEXT,
  result              TEXT,
  vote_question       TEXT,
  bill_id             TEXT,                              -- canonical `<congress>-<type>-<number>` when applicable
  amendment_id        TEXT,
  amendment_author    TEXT,
  legislation_url     TEXT,
  source_url          TEXT,
  is_procedural       INTEGER,                           -- 0/1/NULL-unknown
  source_adapter_id   TEXT NOT NULL,
  source_tier         INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5),
  synced_at           INTEGER NOT NULL,
  UNIQUE (chamber, congress, session, roll_call_number)
)

schema_version

ColumnTypeNot NullPrimary KeyDefault
versionINTEGERnoyesn/a
sql
CREATE TABLE schema_version (
    version INTEGER PRIMARY KEY
  )

snapshots

ColumnTypeNot NullPrimary KeyDefault
entity_kindTEXTyesyesn/a
entity_idTEXTyesyesn/a
hash_input_versionINTEGERyesnon/a
content_hashTEXTyesnon/a
first_seen_atINTEGERyesnon/a
last_seen_atINTEGERyesnon/a
last_changed_atINTEGERyesnon/a
source_adapter_idTEXTyesnon/a
source_tierINTEGERyesnon/a
sql
CREATE TABLE snapshots (
  entity_kind         TEXT NOT NULL,
  entity_id           TEXT NOT NULL,
  hash_input_version  INTEGER NOT NULL,
  content_hash        TEXT NOT NULL,
  first_seen_at       INTEGER NOT NULL,
  last_seen_at        INTEGER NOT NULL,
  last_changed_at     INTEGER NOT NULL,
  source_adapter_id   TEXT NOT NULL,
  source_tier         INTEGER NOT NULL CHECK (source_tier BETWEEN 1 AND 5),
  PRIMARY KEY (entity_kind, entity_id)
)

stance_signals

ColumnTypeNot NullPrimary KeyDefault
idINTEGERnoyesn/a
bill_idTEXTnonon/a
directionTEXTyesnon/a
weightREALyesno1.0
sourceTEXTyesnon/a
created_atINTEGERyesnon/a
stance_slugTEXTnonon/a
sql
CREATE TABLE stance_signals (
  id              INTEGER PRIMARY KEY AUTOINCREMENT,
  bill_id         TEXT,
  direction       TEXT NOT NULL CHECK (direction IN ('agree','disagree','skip')),
  weight          REAL NOT NULL DEFAULT 1.0,
  source          TEXT NOT NULL,
  created_at      INTEGER NOT NULL
, stance_slug TEXT)

Indexes

IndexTableDefinition
action_package_feedback_packageaction_package_feedbackCREATE INDEX action_package_feedback_package ON action_package_feedback(package_id, created_at DESC)
action_packages_decision_hashaction_packagesCREATE UNIQUE INDEX action_packages_decision_hash ON action_packages(trigger_class, bill_id, rep_id, issue, election_date, decision_hash)
action_packages_openaction_packagesCREATE INDEX action_packages_open ON action_packages(status, created_at DESC) WHERE status = 'open'
action_packages_targetaction_packagesCREATE INDEX action_packages_target ON action_packages(trigger_class, bill_id, rep_id, issue)
alert_history_createdalert_historyCREATE INDEX alert_history_created ON alert_history(created_at DESC)
alert_history_refalert_historyCREATE INDEX alert_history_ref ON alert_history(ref_id)
ballot_explanations_computedballot_explanationsCREATE INDEX ballot_explanations_computed ON ballot_explanations(computed_at DESC)
ballots_fetchedballotsCREATE INDEX ballots_fetched ON ballots(fetched_at)
bill_alignment_billbill_alignmentCREATE INDEX bill_alignment_bill ON bill_alignment(bill_id)
bill_alignment_computedbill_alignmentCREATE INDEX bill_alignment_computed ON bill_alignment(computed_at)
bill_alignment_stance_snapshotbill_alignmentCREATE INDEX bill_alignment_stance_snapshot ON bill_alignment(stance_snapshot_hash)
bill_direction_billbill_directionCREATE INDEX bill_direction_bill ON bill_direction(bill_id)
bill_direction_review_queuebill_directionCREATE INDEX bill_direction_review_queue ON bill_direction(stance_snapshot_hash, kind, confidence)
bills_congress_typebillsCREATE INDEX bills_congress_type ON bills(congress, bill_type)
bills_latest_actionbillsCREATE INDEX bills_latest_action ON bills(latest_action_date)
call_scripts_createdcall_scriptsCREATE INDEX call_scripts_created ON call_scripts(created_at DESC)
call_scripts_issuecall_scriptsCREATE INDEX call_scripts_issue ON call_scripts(issue)
call_scripts_repcall_scriptsCREATE INDEX call_scripts_rep ON call_scripts(rep_id)
letters_createdlettersCREATE INDEX letters_created ON letters(created_at DESC)
letters_issuelettersCREATE INDEX letters_issue ON letters(issue)
letters_redraft_requestedlettersCREATE INDEX letters_redraft_requested ON letters(redraft_requested_at) WHERE redraft_requested_at IS NOT NULL
letters_replettersCREATE INDEX letters_rep ON letters(rep_id)
member_votes_bioguidemember_votesCREATE INDEX member_votes_bioguide ON member_votes(bioguide_id)
member_votes_positionmember_votesCREATE INDEX member_votes_position ON member_votes(position)
reminders_createdremindersCREATE INDEX reminders_created ON reminders(created_at DESC)
reminders_deadlineremindersCREATE INDEX reminders_deadline ON reminders(deadline)
rep_scores_computedrep_scoresCREATE INDEX rep_scores_computed ON rep_scores(computed_at)
rep_scores_issuerep_scoresCREATE INDEX rep_scores_issue ON rep_scores(issue)
rep_scores_reprep_scoresCREATE INDEX rep_scores_rep ON rep_scores(rep_id)
reps_staterepsCREATE INDEX reps_state ON reps(state)
roll_call_votes_billroll_call_votesCREATE INDEX roll_call_votes_bill ON roll_call_votes(bill_id)
roll_call_votes_congressroll_call_votesCREATE INDEX roll_call_votes_congress ON roll_call_votes(congress, session)
roll_call_votes_updateroll_call_votesCREATE INDEX roll_call_votes_update ON roll_call_votes(update_date)
snapshots_changedsnapshotsCREATE INDEX snapshots_changed ON snapshots(last_changed_at)
snapshots_kindsnapshotsCREATE INDEX snapshots_kind ON snapshots(entity_kind)
stance_signals_billstance_signalsCREATE INDEX stance_signals_bill ON stance_signals(bill_id)
stance_signals_bill_dir_createdstance_signalsCREATE INDEX stance_signals_bill_dir_created ON stance_signals(bill_id, direction, created_at DESC)
stance_signals_bill_stance_dir_createdstance_signalsCREATE INDEX stance_signals_bill_stance_dir_created ON stance_signals(bill_id, stance_slug, direction, created_at DESC)

Built for people who want local-first political tooling.