I Escondido·In 8 weeks (June 2026)
ForaCity Developer Portal

Compliance System

Levine Act (SB 1429) Compliance — City of Escondido

Role-based compliance dashboard for California's Levine Act and related government ethics requirements. Four user roles with distinct access levels, 22 routes, live MuniCode agenda integration, and evidence-based attorney investigation tools. Configured for Escondido City Council.

22
Total Routes
4
User Roles
12
DB Tables
45+
tRPC Procedures
4
AI Invocations
3
External Integrations

User Roles

Four distinct roles control what each user sees in the compliance dashboard. Access is enforced at both the route level (ComplianceRoleGuard) and the sidebar level (ComplianceDashboardLayout). Officers under investigation cannot see attorney tools.

Officer

12 pages

Mayor, Councilmembers & Commissioners

Elected officials and appointed commissioners who are subject to the Levine Act and other compliance requirements. Officers see a personal compliance experience focused on their own status, deadlines, and self-service tools.

Attorney

18 pages

City Attorney's Office

The City Attorney and designated legal staff who conduct compliance investigations, review contribution relationships, and provide legal guidance. Attorneys have the most powerful investigative tools, including evidence-based data exploration and AI-assisted legal research.

Clerk

12 pages

City Clerk's Office

The City Clerk and administrative staff who manage data ingestion, user onboarding, and system configuration. Clerks handle the operational side — importing Netfile contributions, managing data sources, and assigning compliance roles to new users.

Admin

20 pages

System Administrators

Full system access for ForaCity platform administrators. Admins see everything — all attorney investigative tools and all clerk administrative tools. The only role that bridges both the City Attorney and City Clerk tool sets.

Compliance Site Map

All 22 compliance routes organized by category. Each route shows which roles can access it and what data sources it reads from.

officerattorneyclerkadmin— access levels
RoutePageAccess
/compliance
Dashboard
officerattorneyclerkadmin
/compliance/overview
Role Overview
officerattorneyclerkadmin
/compliance/tour
Guided Tour
officerattorneyclerkadmin
RoutePageAccess
/compliance/pay-to-play
1. Pay-to-Play
officerattorneyclerkadmin
/compliance/form-700
2. Form 700
officerattorneyclerkadmin
/compliance/conflicts
3. Conflict of Interest
officerattorneyclerkadmin
/compliance/ethics-training
4. Ethics Training
officerattorneyclerkadmin
/compliance/fiscal-training
5. Fiscal Training
officerattorneyclerkadmin
/compliance/harassment
6. Harassment Prevention
officerattorneyclerkadmin
/compliance/open-meetings
7. Open Meetings
officerattorneyclerkadmin
/compliance/campaign-finance
8. Campaign Finance
officerattorneyclerkadmin
RoutePageAccess
/compliance/my-dashboard
My Compliance
officer
RoutePageAccess
/compliance/attorney-review
Attorney Review
attorneyadmin
/compliance/investigations
Investigations
attorneyadmin
/compliance/ai-assistant
Legal AI Assistant
attorneyadmin
/compliance/knowledge-base
Knowledge Base
attorneyadmin
/compliance/audit
Audit Trail
attorneyadmin
/compliance/netfile-explorer
Netfile Explorer
attorneyadmin
/compliance/agenda-recusal
Agenda Recusal
attorneyadmin
RoutePageAccess
/compliance/data-sources
Data Sources
clerkadmin
/compliance/onboarding
Onboarding & Invites
clerkadmin
RoutePageAccess
/compliance/setup
Change City
officerattorneyclerkadmin

External Integrations

MuniCode Meetings
escondido-ca.municodemeetings.com

City Council agenda scraping

Weekly (Monday 7 AM)
California Netfile
netfile.com

Campaign finance contribution data

On-demand sync
Forge LLM
Built-in API

Legal AI assistant, agenda item classification

Per-request

Architecture Notes

  • Compliance routes live under /compliance/* in the main App.tsx router
  • Role enforcement uses ComplianceRoleGuard at the route level and sidebar filtering in ComplianceDashboardLayout
  • Backend procedures are gated by complianceRole field on the user record, checked via tRPC middleware
  • MuniCode scraping runs server-side via node-cron every Monday at 7:00 AM Pacific
  • Evidence-based contribution links use contribution_evidence_links table with typed evidence categories
  • Attorney research dossiers are stored in research_items linked to compliance_investigations