Architecture doc: add notifications table, v0.4.0 feature history, updated beat schedule (fetch-actions-active-bills, dispatch-notifications), expanded admin API table (17 endpoints), new /api/notifications section, BriefPanel and ActionTimeline component docs, chamberBadgeColor utility, migrations 0010-0011, live LLM model picker endpoint, queue routing corrections. Roadmap: mark Phase 1 notifications complete, check off LLM model picker, admin health panel, chamber badges, action history fallback, backfill all actions, brief regeneration UI; remove completed Phase 1 section. Authored-By: Jack Levy
6.7 KiB
6.7 KiB
Roadmap
- Docker Stack — PostgreSQL, Redis, FastAPI, Celery, Next.js, Nginx fully containerized
- Bill Polling — Congress.gov incremental sync every 30 min, filtered to legislation that can become law
- Document Fetching — GovInfo bill text retrieval with smart truncation for token budgets
- LLM Analysis — Multi-provider AI briefs (OpenAI, Anthropic, Gemini, Ollama) with amendment diffing
- News Correlation — NewsAPI + Google News RSS articles linked to bills via topic tags
- Trend Scoring — Composite zeitgeist score (0–100) from NewsAPI + Google News + Google Trends, nightly
- Full-text Search — PostgreSQL tsvector search across bills and members
- Follows — Per-user follows for bills, members, and topics
- Dashboard — Personalized feed + trending bills
- Multi-user Auth — JWT email/password auth, admin role, user management panel
- Admin Panel — LLM provider switching, pipeline stats, manual task triggers
- Citations — Every AI brief key point and risk cites the section + verbatim quote from bill text
- Citation UI — § chips expand inline to show quote + GovInfo source link
- Party Badges — Solid red/blue/slate badges readable in light and dark mode
- Nginx DNS Fix — Resolver directive prevents stale-IP 502s after container restarts
- Sponsor Linking — Poller fetches bill detail for sponsor; backfill task fixes existing bills
- Member Search — "First Last" and "Last, First" both match via PostgreSQL split_part()
- Search Spaces — Removed .trim() on keystroke that ate spaces in search inputs
- Mobile UI — Responsive layout: sidebar collapses, cards stack, touch-friendly controls
- Member BIO & Photo — Display member headshots (photo_url already stored, not yet shown in UI)
- Bill Action Fetching — BillAction table populated via Congress.gov actions endpoint; nightly batch + event-driven on bill change
- What Changed (Amendment Briefs) — BriefPanel surfaces amendment briefs with "What Changed" badge and collapsible version history
- Source Viewer — "View source" link in § citation popover opens GovInfo document in new tab (Option A; Option B = in-app highlighted viewer deferred pending UX review)
- Admin Reprocess — POST /api/admin/bills/{bill_id}/reprocess queues document + action fetches for a specific bill
- LLM Model Picker — live model list fetched from each provider's API; custom model name fallback
- Admin Health Panel — bill pipeline breakdown table, external API health tests with latency, manual controls with status dots + task polling
- Chamber Badges — amber/gold for Senate, slate/silver for House; applied on bill cards and detail pages
- Action History Fallback — shows latest_action_date/text while full history loads; full timeline once fetched
- Backfill All Actions — admin task to fetch action history for all pre-existing bills
- Notifications (Phase 1) — ntfy dispatch, RSS feed, per-user settings UI, 5-min dispatcher beat task
- Brief Regeneration UI — admin button to delete existing briefs for a bill and re-queue LLM processing. Useful for improving citation/diff logic without a full re-poll. (Backend reprocess endpoint already exists.)
To Do
Phase 2 — High Impact (can run in parallel after Phase 1)
- Change-driven Alerts — emit
notification_eventfrom poller/document fetcher on material changes: new doc version, substitute text, committee report, vote scheduled/result. Filter out procedural-only action text. Fan out to ntfy + RSS. - Fact vs Inference Labeling — add
label: "cited_fact" | "inference"+ optionalconfidencefield to eachkey_pointandriskin the LLM JSON schema. Prompt engineering change + BillBrief schema migration. UI: small badge on each bullet (no color politics — neutral labels only).
Phase 3 — Personal Workflow
- Collections / Watchlists —
collections(id, user_id, name, slug, is_public) +collection_billsjoin table. UI to create/manage collections and filter dashboard by collection. Shareable via public slug URL (read-only for non-owners). - Personal Notes —
bill_notestable (user_id, bill_id, content, stance, tags, pinned). Shown on bill detail page. Private; optionally pin to top of the bill detail view. - Shareable Links — UUID token on briefs and collections → public read-only view, no login required. Same token system for both. No expiry by default. UUID (not sequential) to prevent enumeration.
- Weekly Digest — Celery beat task (weekly), queries followed bills for changes in the past 7 days, formats a low-noise summary, dispatches via ntfy + RSS.
Phase 4 — Accountability
- Votes & Committees — fetch roll-call votes and committee referrals/actions from Congress.gov. New
bill_votestable. UI: timeline entries for committee actions (already partially populated from bill actions) + vote results filterable by followed members and topics. - Member Effectiveness Score — nightly Celery task; transparent formula: sponsored bills count, bills advanced through stages, co-sponsored, committee participation, "bills enacted" metric. Stored in
member_scorestable. Displayed on member profile with formula explanation. - Representation Alignment View — for each followed member, show how their votes and actions align with the user's followed topics. Based purely on followed members (no ZIP/district storage). Neutral presentation — no scorecard dunking.
Phase 5 — Polish (slot in anytime, independent)
- Search Improvements — filters on global search (bill type, status, chamber, date range); search within a member's sponsored bills; topic-scoped search.
- Desktop View — wider multi-column layout optimized for large screens (sticky sidebar, expanded grid, richer bill detail layout).
- first_name / last_name Backfill — Celery task to populate empty first/last from stored "Last, First"
namefield via split.
Later / Backlog
- Notification Channels v2 — email (SMTP), Discord webhook, Telegram bot (after ntfy + RSS v1 ships)
- Source Viewer Option B — in-app bill text viewer with cited passage highlighted and scroll-to-anchor. Deferred pending UX review of Option A (GovInfo link).
- Raw Diff Panel — Python
difflibdiff between stored document versions, shown as collapsible "Raw Changes" below amendment brief. Zero API calls. Deferred — AI amendment brief is the primary "what changed" story. - Shareable Collection Subscriptions — "Follow this collection" mechanic so other users can subscribe to a public collection and get its bills added to their feed.