Roadmap
Current state is a working full-stack scaffold: SSR + WASM hydration,
SQLite-backed persistence (crates/db, seeded with fictional demo data), a
live query panel against the configured LLM backend, an LLM-based extraction
pipeline (crates/extraction), a crawler (crates/crawler) that pulls real
press releases from the SEC and FCA and feeds them through extraction
automatically, search/filtering by industry, jurisdiction, violation type,
and law firm/monitor, global watch-rule alerts, and a trend/benchmark
dashboard. Every core feature in Product Concept has a
working (if scoped-down) implementation now.
Rough next steps, roughly in dependency order:
Persistence— done:crates/db'sCaseRepositorytrait +SqliteCaseRepository, wired intoweb/servervia Leptos context.NLP extraction pipeline— done:crates/extractionextracts structureddomain::Resolutionfields from raw filing text via thellmcrate, with a schema-constrained prompt and validation, persisted viaCaseRepository::upsert.Crawler— done for SEC and FCA:crates/crawler'sFilingSourcetrait +run_crawlfetch, dedupe, and feed real filings through the sameextraction::extract_caseentrypoint the manual-paste UI uses. No DoJ connector (bot-blocked, see CLAUDE.md) or OFAC connector yet. Nothing schedules thecrawlbinary itself — that's on the operator (cron, systemd timer, ...).Search and filtering UI— done:SearchPanel/CaseList(web/app/src/app.rs) filter by industry, jurisdiction, violation type, and law firm/monitor viaCaseRepository::search, server-side (not client-side filtering of a fully-fetched list). No free-text search, date-range filtering, or pagination yet — revisit once there's a real backlog of cases to justify it.Alerts— done as global watch rules, not user-scoped (this app has no auth/user system — see CLAUDE.md for that tradeoff).domain::WatchRule(industry and/or company-name-substring criteria) +db::evaluate_case, checked after every case persisted via manual extraction or the crawler.WatchRulesPanel/AlertsPanelmanage rules and show/acknowledge triggered alerts. No actual notification delivery (email/push) — in-app only. Revisit user-scoping if/when real multi-user need emerges.Trend/benchmark analysis— done:domain::compute_trend_report(pure function, no DB access) aggregates case/resolution counts, monitorship rate by industry, and total sanctions by currency;get_trend_reportfeeds it the whole dataset (not the search filter);TrendPanelrenders it as simple CSS bar lists. No time-series/trend- over-time view yet — extracted cases don't reliably have asigned_ondate, so a "per quarter" breakdown isn't meaningful with today's data.- Routing (
leptos_router) — only once there's a second page to justify it. - OFAC connector, and a real DoJ data source — e.g. an official API/data-sharing arrangement rather than scraping around their bot protection.
Contributions and issues: github.com/asmuelle/incompliance-radar.