# SaulGPT — Complete Feature Architecture ## Project Overview SaulGPT is an AI-powered Indian Legal Intelligence Assistant using a 6-layer RAG pipeline to answer legal queries, draft documents, evaluate contracts, and provide structured legal analysis. It uses a 3-phase "Virtual Counsel" flow (Discovery → Strategy → Execution) for legal grievance handling with Llama 3.1 8B via Groq. --- ## 1. Backend Systems ### 1.1 API Server & Request Routing **Source:** ackend/api_server.py (~1662 lines) FastAPI server (port 8000) with CORS, Groq LLM initialization, and Knowledge Graph startup. **Endpoints:** | Method | Route | Auth | Purpose | |--------|-------|------|---------| | POST | /api/chat | Optional | Main chat: pipeline, triage state machine, drafting loop, IRAC | | POST | /api/chat/stream | Optional | SSE-streaming variant | | POST | /api/upload | No | Contract upload and evaluation (multipart) | | GET | /api/document/{session_id} | No | Serve generated .docx as download | | DELETE | /api/history/{session_id} | No | Clear session history | | DELETE | /api/draft/state/{session_id} | No | Clear drafting state / cancel interview | | GET | /api/health | No | Health check | | GET | /api/conversations | Bearer | List conversations (paginated) | | POST | /api/conversations | Bearer | Create conversation | | GET | /api/conversations/{id} | Bearer | Load conversation with messages | | DELETE | /api/conversations/{id} | Bearer | Delete conversation | | POST | /api/conversations/migrate | Bearer | Bulk-import guest messages for session takeover | | POST | /api/auth/signup | No | Register user | | POST | /api/auth/login | No | Login user | | GET | /api/auth/me | Bearer | Current user info | **Request Pipeline** (for /api/chat): 1. Auth resolution (JWT or guest) 2. Conversation resolution (map session_id to conv_id or create new) 3. Message persistence (to SQLite if authenticated) 4. Interview state check 5. Interruption guard (clarification/hypothetical/pushback) 6. **Crisis pre-check** (regex: self-harm, active violence, confinement → helplines, stop) 7. Jurisdiction gate (non-Indian queries → rejected before processing) 8. Direct legal query patterns (15 regex → force knowledge mode) 9. Triage LLM call (classify: off-topic / direct legal / educational / document / grievance) 10. Triage state machine routing (3-phase flow or pass-through) 11. Pipeline dispatch (6-layer RAG fallthrough) 12. Response construction (widget metadata: remapped laws, urgency, jurisdiction) 13. Response persistence (conv_id injected for frontend tracking) **State Stores:** - ACTIVE_CONVERSATIONS: session_id → conv_id mapping - SESSIONS: per-session drafting interview state - SESSION_DOCUMENTS: generated .docx bytes - TRIAGE_STATES: per-session 3-phase flow state **Robust JSON Extraction:** _extract_json() with 4-layer fallback (pure JSON → markdown codeblock → markdown key-value → empty dict) used by all three core agents (triage, discovery, strategy). --- ### 1.2 Crisis Detection & Emergency Response **Source:** `backend/api_server.py` — `_detect_crisis()` + `_CRISIS_PATTERNS` Regex-based pre-check that fires **before any LLM call or pipeline processing**, positioned between the jurisdiction gate and the triage classification. **3 crisis categories:** | Category | Trigger examples | Response | |---|---|---| | **Self-harm** | "kill myself", "suicide", "hurt myself", "end my life" | Suicide prevention helplines (AASRA, iCall, Vandrevala) + emergency number | | **Active violence** | "beating me right now", "trying to kill me", "weapon" | Police (100), National Emergency (112), Women's Helpline (1091) | | **Confinement** | "locked in", "held against my will", "passport taken" | Police (100), National Emergency (112) | **Design principle:** Hard stop — no Discovery, no RAG, no pipeline. The system refuses to process further until the user confirms safety. --- ### 1.3 6-Layer RAG Pipeline **Source:** ackend/pipeline_orchestrator.py (~700 lines) Sequential pipeline for all non-drafting queries. **Layer 0: Conversation Memory (Sliding Window)** - Per-session verbatim turn memory - Sliding window: 6 turns verbatim, older turns collapsed into key facts - Thresholds: collapse at 9 turns, summarize at 12 turns - Key fact extraction: regex for dates, amounts (INR/Rs.), places, section numbers - Functions: save_turn_to_memory(), get_history_with_summary() **Layer 1: Query Understanding** (layer1_understanding.py, ~400 lines) - Language detection (langdetect, fallback "en") - Intent classification: factual / procedure / definition / comparison / analysis / document / ambiguous - Entity extraction (spaCy NER: PERSON, ORG, GPE, LAW, DATE, MONEY, TIME) - Citation extraction (regex: "Section X of Y Act", "Article Z") - Ambiguity detection (vague phrasing patterns) - Query reformulation (LLM-based abbreviation expansion) - spaCy model: en_core_web_sm **Layer 2: Hybrid Vector Retrieval** (layer2_retrieval.py, ~350 lines) - Vector DB: ChromaDB, collection "saulgpt_indian_laws" - Embedding model: all-MiniLM-L6-v2 - Chunks: 1200 chars, 150 overlap (~2409 chunks, 9 acts) - Hybrid: semantic search + BM25 keyword retrieval - Cross-encoder reranking: ms-marco-MiniLM-L-6-v2 (8 candidates → 5 results) - Noise detection: max_score < 0.5 AND spread < 0.15 → web fallback - Deduplication by content hash - Citation filtering prioritization **Layer 3: LLM Reasoning** (layer3_reasoning.py, ~700 lines) - Model: llama-3.1-8b-instant via Groq (temperature 0.1) - Mode prompts: knowledge (neutral), analysis (FACTS/ISSUES/LAW/OUTCOME), document (drafting), pathfinder (step-by-step) - Context: retrieved chunks + conversation history + mode instruction - Knowledge Graph expansions injected - Ambiguity handling → clarifying questions **Layer 4: Response Validation** (layer4_validation.py, ~700 lines) - Citation verification (regex cross-check against retrieved chunks) - NLI hallucination check (DeBERTa, fallback to pattern matching) - Repealed law interception (IPC/CrPC/IEA → BNS/BNSS/BSA; generates remapped_laws) - Struck-down section detection - Legal terminology enforcement (informal → formal) - Disclaimer enforcement - Remedy validation **Layer 5: External Data** (layer5_external.py, ~450 lines) - DuckDuckGo fallback (appends "Indian law indiankanoon indiacode") - Post-filter to Indian legal domains (.gov.in, indiankanoon.org, indiacode.nic.in) - IndianKanoon case law scraping (BeautifulSoup) - Auto-updater (APScheduler, 30-day interval) **Layer 6: Evaluator** — see Contract Evaluation System (1.6). --- ### 1.4 3-Phase Virtual Counsel Flow **Source:** ackend/api_server.py (triage state machine), riage_state.py, discovery_agent.py, strategy_agent.py, prompts/discovery.py, prompts/strategy.py Python-enforced state machine replacing old keyword-based triage for legal grievances. **State Machine** ( riage_state.py, 47 fields): - current_mode: "idle" | "discovery" | "strategy" - discovery_profile: structured Phase 1 output - discovery_turn_count: hard 3-turn cap (Python-enforced) - strategy_data: SWOT + options - selected_strategy_id: user-chosen path_a..path_d - counsel_override: LLM-detected override flag **Phase 1: Discovery** (discovery_agent.py, prompts/discovery.py) - Structured 3-turn sequence with fixed objectives per turn: - **Turn 0 (Story & Legal Anchor)**: Empathy + brief area-of-law anchor + open-ended story question - **Turn 1 (Evidence & Timeline)**: Ask about documentary proof and exact dates; skip if already populated - **Turn 2 (Outcome & Priority)**: Ask what the user wants and what matters most; always final turn - Adaptive skip: each turn checks existing profile and skips if target fields are already filled - Legal Framework Anchor: LLM names the relevant area of law before asking questions ("This falls under Indian Employment Law") - Tone Protocol: matches emotional_state (angry/frustrated/desperate/calm) - Graceful vague-answer handling (no re-asking on "I don't know") - Hard 3-turn Python cap (enforced by api_server.py line 1205: `discovery_turn >= 2`) - Discovery Profile output: emotional_state, desired_outcome, evidence_quality, timeline, user_priority, opponent_profile - 4-layer JSON extraction - Emotional-language fix: CRITICAL RULE ensures anger/frustration = legal grievance, not off-topic **Phase 2: Strategy** (strategy_agent.py, prompts/strategy.py) - SWOT: Strengths, Weaknesses, Opportunities, Threats - Exactly 4 options (path_a..path_d), each with: - route_to: "document" (drafting) or "pathfinder" (procedure) - title, description, pros, cons, estimated_timeline, difficulty, success_probability - Counsel Override for exceptional cases (government opponent, acknowledgment) - Evidence weakness flagging - Validation: strips path_e, pads with universal catch-alls, validates route_to - Unrecognized routing → pathfinder with preamble note **Phase 3: Execution** - Document → interview_state field collection - Pathfinder → 6-layer pipeline in procedural mode - IRAC Advocate Mode → keyword/button-invoked structured analysis --- ### 1.5 IRAC Advocate Mode **Source:** ackend/irac_agent.py, prompts/irac.py Structured legal analysis for law students/advocates. Never invoked as hidden fallback. **IRAC Structure:** FACTS (neutral) → ISSUES (legal questions) → RULE (RAG-grounded statutes) → APPLICATION (both-sides argumentation) → CONCLUSION (balanced assessment) **Domain Statute Mappings:** Employment, Contracts, Property, Family, Consumer, Criminal, Torts **Guardrails:** - Domain guardrails (no factory acts for white-collar disputes, no constitutional articles unless government opponent) - All citations RAG-grounded (never outside retrieved docs) - No verdict — Application argues both sides **Invocation:** Frontend "Advocate Mode" button + natural language ("advocate", "irac", "deep legal analysis"). Resets to "idle" after output. --- ### 1.6 Document Drafting System **Interview State** (interview_state.py, ~950 lines) - State machine: IDLE → INTERVIEWING → DRAFTING → COMPLETE - Document families: letter, pleading, affidavit, agreement - 5 predefined schemas: legal_notice, cheque_bounce, employment_notice, fir, rental_agreement - Each schema: 5-9 fields (sender, recipient, dates, amounts, etc.) **Dynamic Field Scoping** (dynamic_drafter.py, ~400 lines) - LLM-driven field identification (max 7 fields) - Classifies document type from query - Builds prompt injections from collected values - Session-cached field scope - Falls back to static schemas **Interview Loop:** - Progressive field-by-field questioning - Interruption handling (clarification, hypothetical, pushback) - Unrelated query detection (resets state) - Progress tracking per message **Three-Layer Document Gate:** 1. Triage identifies document intent 2. User picks document path from Strategy options 3. Explicit "Shall I draft?" confirmation **.docx Generation** (document_generator.py, ~980 lines) - Rendering: python-docx, Times New Roman 12pt, 1-inch margins, 1.5 spacing - 4-family: letter, pleading, affidavit, agreement - Primitive functions: add_header, add_title, add_recipient_block, add_subject_line, add_body, add_signature_block, add_enclosures, add_court_details, add_verification, add_pagination --- ### 1.7 Contract Evaluation System **Source:** ackend/layer6_evaluator.py (~470 lines) - Format support: PDF (PyMuPDF), DOCX (python-docx) - Chunking: 5000-character at paragraph boundaries - Evaluation dimensions: clarity, enforceability, compliance, risk, completeness - Per-chunk LLM evaluation (llama-3.1-8b-instant) - Output: overall_score, risk_level (low/medium/high/critical), clauses, summary, recommendations - Upload max: 50MB --- ### 1.8 Pre-Draft Legal Scrutiny Engine **Source:** ackend/scrutiny_agent.py (~640 lines) **ScrutinyResult:** is_valid, issues, warnings, limitation_status, remedy_feasibility, limitation_date, bns_mapping, risk_score (0-100), recommendations **Checks:** 1. Limitation (12 claim types with periods, exception detection: acknowledgment, continuous wrong, disability, government) 2. Remedy validity 3. BNS/BSA enforcement (IPC/CrPC/IEA → BNS/BNSS/BSA) 4. Field validation per doc type **Severity Levels:** "serious" (red, blocking), "warning" (gold, acknowledgeable), "info" (teal, acknowledgeable) --- ### 1.9 Legal Knowledge Graph **Source:** ackend/layer6_knowledge_graph.py (~560 lines) - NetworkX DiGraph: 89 nodes, 67 edges - Relationships: Act replacements (IPC→BNS, CrPC→BNSS, IEA→BSA), constitutional hierarchy, cross-act links, procedural chains (FIR→Investigation→Charge Sheet→Trial→Appeal) - ~30 act aliases resolved to canonical names - expand_context(): injects graph into pipeline, returns replaced_acts for frontend --- ### 1.10 Authentication & User Persistence **JWT Auth** (ackend/auth.py, 42 lines) - bcrypt hashing (passlib) - JWT: 30-day expiry, HS256 **SQLite DB** (ackend/database.py, ~170 lines) - Tables: users, conversations, messages - WAL mode, foreign keys, thread-local connections - bulk_import_messages() for guest session takeover --- ### 1.11 Legal Data Ingestion Pipeline **Scraper** (ackend/scraper/, 4 files + config) - LegalScraperEngine: IndiaCodeScraper (DSpace) + KanoonScraper (BeautifulSoup) - 25 scrapeable acts in config **Chunking & Embedding** (2_chunk_and_embed.py, ~469 lines) - Chunk: 1200 chars, 150 overlap - Embedding: all-MiniLM-L6-v2 - Universal key detector (14+ key variants per field) - 5 JSON structures supported - Lineage header: [Act: X] [Section Y: Z]. **Embedded Acts (9):** BNS 2023, Constitution of India, BNSS 2023, CPC, Negotiable Instruments Act, Hindu Marriage Act, Motor Vehicles Act, BSA 2023, Indian Divorce Act --- ### 1.12 RAG Evaluation Suite **Source:** ackend/eval_pipeline.py (~250 lines) 8 gold-standard test cases (knowledge, analysis, pathfinder). Metrics: retrieval_coverage, citation_accuracy, hallucination_score, overall_score. --- ## 2. Frontend Application ### 2.1 Core Chat Interface **Source:** saulgpt-ui/src/App.jsx (935 lines) **19 State Variables:** - Auth: token, user, authLoading - Chat: messages, input, loading, loadingLabel, forceMode, interviewActive - UI: showSuggestions, showDropZone, showGlossary, glossaryCategory, showSidebar - Session: convId, refreshTrigger **Sub-components (inline):** - TypingIndicator({ label }): animated bot-typing dots - InterviewProgress({ pct }): progress bar (0-100%) - RiskBadge({ risk }): color-coded pill (High/Medium/Low) - PipelineMeta({ data }): collapsible debug panel (citations, repealed laws, validation, confidence) - Message({ msg, onTriageChoice }): single chat message renderer with markdown, widgets, and export bar - DropZone({ onFile, disabled }): drag-and-drop contract upload **7 useEffect Hooks:** 1. convRef sync (prevents stale overwrites) 2. Persist convId to localStorage 3. Page refresh recovery (load conversation from API on mount) 4. Persist guest messages (last 6) 5. Auto-scroll on message/loading change 6. Auto-resize textarea 7. Cross-tab auth sync (storage event listener) **Key Functions:** - api(): axios instance with Bearer token + 401 interceptor (auto-logout) - sendMessage(): core send → POST /api/chat → handle interview/triage/complete states - handleFile(): contract upload → POST /api/upload - handleTriageChoice(): triage card → sendMessage - clearChat(), cancelInterview(), handleAuth(), logout() **Welcome Screen:** Animated seal, "Your Counsel Awaits", feature cards (Ask/Draft/Evaluate), 5 suggested queries. **Send Flow:** Validation → optimistic append → POST /api/chat → response processing → loading=false. **Mode Selector:** 5 buttons (Auto, Knowledge, Analysis, Document, Pathfinder). **Chat Input:** Auto-resizing textarea, contextual placeholder, disabled during loading, file upload button, send button with spinner. --- ### 2.2 Document Drafting UI - Interview badge ("Drafting Mode Active" with gold pulse) replaces mode selector during interview - Cancel button (red, clears draft state) - Input placeholder changes to "Type your answer..." during interview - InterviewProgress per message - .docx download button on completion (meta.document_ready flag) ### 2.3 Contract Evaluation UI - DropZone (drag-and-drop, accepts PDF/DOCX/TXT, 50MB max) - Upload button (paperclip icon, disabled during loading) - "Running Red Pen evaluation..." loading label - Evaluation response with risk level display ### 2.4 Response Widget System Each widget conditionally renders based on response metadata: **BNSCorrectionNotice** (BNSCorrectionNotice.jsx, 118 lines): - "LEGISLATION UPDATE 2024" card - Maps old law (IPC/CrPC/IEA, strikethrough red) → new law (BNS/BNSS/BSA, green check) - Triggered by meta.remapped_laws **VetoCard** (VetoCard.jsx, 144 lines): - Collapsible scrutiny result with severity levels - Serious: red pulsing, blocking gate (Consult Lawyer / Draft Demand Letter) - Warning/Info: gold/teal, acknowledgment checkbox - Sections: Limitation Act, Remedy Not Recognized, Law Updated BNS/BNSS - Auto-corrections display **UrgencyBanner** (UrgencyBanner.jsx, 83 lines): - Critical (<30d): red pulsing, siren icon - Warning (<90d): amber static, clock icon - Shows limitation days + deadline date - Triggered by urgency_flags or limitation_days **JurisdictionBadge** (JurisdictionBadge.jsx, 151 lines): - Court level: 8 types (Supreme Court gold, High Court teal, District Court green, etc.) - Jurisdiction type: 8 icons (Civil, Criminal, Consumer, Family, Revenue, etc.) - Territorial + pecuniary info - Court description footnote **TriageCards** (TriageCards.jsx, 121 lines): - "Strategic Options" with info banners (limitation, jurisdiction) - Clickable option cards (gold label + description + arrow) - Action row: SWOT toggle, "Explain These Options", "Advocate Mode" - Expandable SWOT analysis (4 color-coded boxes) **PipelineMeta:** Collapsible debug panel showing mode, domain, laws, graph insights, case law, elapsed time, citations, validation status, confidence, hallucination warnings. **Export Bar:** Copy (clipboard), Download PDF (jsPDF), Download .docx (backend URL). ### 2.5 Conversation Management **Source:** saulgpt-ui/src/ConversationsSidebar.jsx (87 lines) - Left panel (260px) with mobile backdrop overlay - Header: "Chats (N)" + New (+) + Close (X) - Conversation list: title (truncated 28 chars), relative time, delete on hover - Active: gold border highlight - Pagination: "Load more (N remaining)" button - useEffect: fetches on mount + refreshTrigger change, AbortController cleanup - Sidebar toggle via hamburger button **loadConversation():** Clears UI → sets convId early → fetches messages → populates → handles error with message in chat **newConversation():** Clears UI → setConvId(null) → creates on backend → triggers sidebar refresh **deleteConversation():** Deletes on backend → clears local state if active → triggers sidebar refresh ### 2.6 Authentication & Session Management **AuthPage** (AuthPage.jsx, 66 lines): - Tabbed login/signup form - Migration overlay (guest session takeover spinner) - JWT stored in localStorage **Session Features:** - Page refresh recovery (loads last conversation from API) - Guest message persistence (last 6 in localStorage) - Guest session takeover (bulk-import on login) - Cross-tab auth sync (storage event listener → auto-logout) - 401 interceptor (expired token → logout) ### 2.7 Supporting Utilities **LegalGlossary** (LegalGlossary.js, 287 lines): - 200+ Indian legal terms with plain-language definitions - 10 categories: Constitutional, Criminal Law, Criminal Procedure, Commercial Law, Civil Procedure, Consumer Law, Labour Law, Property Law, Family Law, General - Functions: scanForTerms(), getTermDefinition(), getTermsByCategory(), getCategories() - Glossary sidebar with category filter + search **PDF Generation** (usePDF.js, 405 lines): - jsPDF-based A4 PDF generator - Professional formatting: letterhead, gold rules, document type label, validation badge, citations block, auto page breaks - Color palette: gold, ink, sage, red, amber - Section starters for 13 pattern types - 25mm margins (Indian legal standard) --- ## 3. Agent Architecture ### 3.1 Central LLM Client **Source:** ackend/agents/llm_client.py 4 pre-initialized ChatGroq instances: - Researcher: mixtral-8x7b-32768 (temperature 0.1) - Drafter: llama-3.1-8b-instant (temperature 0.1) - Reviewer: llama-3.1-8b-instant (temperature 0.1) - Triage: llama-3.1-8b-instant (temperature 0.1) All load GROQ_API_KEY from .env. ### 3.2 Agent Manager & Routing **Source:** ackend/agents/manager.py AgentManager with mode detection (regex patterns) and route dispatch: - legal_query → ResearcherAgent - case_analysis → ResearcherAgent (analysis mode) - pathfinder → ResearcherAgent (pathfinder mode) - document → DrafterAgent - interviewing → DrafterAgent - evaluate → ReviewerAgent - scrutiny → ReviewerAgent ### 3.3 Sub-Agents **TriageAgent** (gents/triage.py): Query classification (LLM + keyword fallback), TOWS analysis generation. **ResearcherAgent** (gents/researcher.py): Knowledge Q&A, case analysis (FACTS/ISSUES/LAW/OUTCOME), pathfinder (step-by-step). Includes IPC/CrPC→BNS/BNSS mapping. **DrafterAgent** (gents/drafter.py): Document type detection, field collection, LLM document generation. **ReviewerAgent** (gents/reviewer.py): Contract evaluation, pre-draft scrutiny, limitation check, red flag detection, veto check. --- ## 4. Data Layer & Cloud Persistence ### 4.1 Supabase Managed PostgreSQL (Primary Cloud Database) - **Host:** `aws-0-ap-southeast-1.pooler.supabase.com` - **Port:** `5432` (Session Mode) / `6543` (Transaction Mode) - **Engine:** IPv4 Connection Pooler bypassing IPv6 container restrictions - **Tables:** `users`, `conversations`, `messages` - **Indexes:** `idx_conversations_user_id`, `idx_messages_conv_id`, `idx_messages_conversation_id` - **Concurrency:** Multi-device simultaneous read/write with zero file-locking bottlenecks ### 4.2 Local SQLite Fallback - **File:** `backend/saulgpt.db` - **Mode:** WAL (Write-Ahead Logging) for concurrent access - Automatically activated if `DATABASE_URL` is omitted in local development ### 4.3 ChromaDB (Vector Store) - **Collection:** `saulgpt_indian_laws` & `landmark_precedents` - **Embeddings:** `sentence-transformers/all-MiniLM-L6-v2` pinned to `device="cpu"` - **Total Chunks:** 2,449+ statutory and case law segments - **Path:** `data/vector_db/` ### 4.4 JSON Raw Data Sources - **Path:** `data/raw_data/` - Contains canonical acts: BNS 2023, BNSS 2023, BSA 2023, CPC 1908, NIA 1881, HMA 1955, MVA 1988, IDA 1869, Constitution of India ### 4.5 Relational GNN Knowledge Graph (In-Memory) - NetworkX DiGraph + PyTorch continuous embeddings (TransE/RotatE in $\mathbb{R}^{64}$) - 73 canonical legal relations, 268 nodes, 172 triples --- ## 5. Pre-Trial Studio & Moot Court Arena **Source:** `backend/trial_studio/`, `saulgpt-ui/src/TrialStudio.jsx` Interactive adversarial courtroom simulation providing rigorous trial preparation before an actual hearing. ### 5.1 Hostile Section 146 BSA Cross-Examiner - Implements aggressive cross-examination tactics targeting documentary gaps, oral inconsistencies, and tax filing contradictions under Section 146 of the Bharatiya Sakshya Adhiniyam, 2023. - Formulates multi-turn traps designed to impeach witness credibility. ### 5.2 Confidential Corner Coach & Tactical Counsel - Operates in real time alongside the courtroom examination. - Real-time exposure gauge (Low / Medium / High Risk). - Flags formal procedural objections (e.g. hearsay, leading questions, questions without foundation). - Provides verbatim, safe witness rejoinders that avoid fatal admissions. - Suggests tangible evidentiary plugs to introduce into the record. ### 5.3 Precedent Intelligence Engine - Indexed database of **50,000+ landmark Supreme Court and High Court judgments** across 8 frameworks: BNS, BNSS, BSA, NI Act, CPA 2019, Contract Act, Limitation Act, Arbitration Act. - Fallback keyword detection matches dispute patterns to governing precedents. ### 5.4 Split-Chamber UI - Left Column: Formal Courtroom Chamber with judge/counsel dialogue stream and witness stand. - Right Column: Confidential Corner Coach Console with live exposure meter and objection arsenal. --- ## 6. Section 63 BSA Digital Evidence Grounding **Source:** `backend/evidence_processor.py`, `saulgpt-ui/src/EvidenceUploader.jsx` End-to-end processing and certification of electronic records under Section 63 of the Bharatiya Sakshya Adhiniyam, 2023 (formerly Section 65B IEA). ### 6.1 Cryptographic Hash Verification - Dual-tier SHA-256 integrity calculation: computed client-side in the browser on file selection, and independently re-verified server-side on upload. - Detects any bitwise tampering during transit. ### 6.2 Cheque OCR & 30-Day Statutory Clock - Extracts bank return memos, dishonour codes (e.g. "Funds Insufficient", "Account Closed"), drawer/payee names, and amount. - Automatically calculates the mandatory 30-day statutory notice window under Section 138 NIA. ### 6.3 Debtor Audio Admission & Limitation Extender - Transcribes and semantically parses voice admissions and debt promises. - Applies Section 18 of the Limitation Act, 1963 to compute revised limitation expiry dates based on valid acknowledgments of liability. ### 6.4 Court-Admissible Electronic Certificate Generation - Automatically drafts a formal Section 63 BSA compliance certificate. - Details device identifiers, cryptographic hash, extraction date, custodian signature block, and truth verification. - 1-click integration transmits certified evidence directly into the Pre-Trial Studio. --- ## 7. Actor-Critic Fine-Grained Process Reward Model (FG-PRM) **Source:** `backend/actor_critic.py`, `backend/layer4_validation.py` Neuro-symbolic reinforcement validation that scrutinizes reasoning chains before emitting legal counsel. ### 7.1 Multi-Dimensional Step Evaluation - Evaluates four orthogonal dimensions: 1. **Factuality & Citation Validity:** Verifies whether cited sections actually exist and match the proposition. 2. **Statutory Applicability:** Prevents application of repealed statutes (IPC/CrPC) or struck-down provisions. 3. **Logical Soundness & Neutrality:** Checks for non-sequiturs or premature conclusions. 4. **Tone & Client Empathy:** Ensures professional, measured legal counsel matching client distress. ### 7.2 Dynamic Token Budgeting (`max_tokens=800`) - PRM feedback loop strictly constrained to `max_tokens=800`. - Eliminates Groq free-tier 1000 OTPM rate limit exceptions (`429 rate_limit_exceeded`) while preserving comprehensive critique. ### 7.3 Fast-Path Bypasses - Low-complexity queries bypass secondary critic passes, ensuring sub-second response latency. --- ## 8. High-Capacity Contract Evaluator (Layer 6) **Source:** `backend/layer6_evaluator.py`, `saulgpt-ui/src/App.jsx` Deep structural analysis of commercial and employment agreements. ### 8.1 25,000-Character Single-Pass Ingestion - Evaluates extensive multi-page contracts in a unified prompt context, eliminating fragmentation and cross-chunk context loss. ### 8.2 Indian Contract Act 1872 Auditing - **Section 27 (Restraint of Trade):** Flags void post-employment non-compete clauses. - **Section 28 (Restraint of Legal Proceedings):** Identifies illegal time limits on litigation. - **Section 74 (Liquidated Damages vs. Penalties):** Scrutinizes disproportionate penalty clauses. ### 8.3 Tri-Level Risk Scoring - 🔴 **High Risk:** Void/unlawful terms requiring immediate deletion. - 🟡 **Medium Risk:** Unbalanced commercial exposure (unilateral indemnity, unlimited liability). - 🟢 **Low Risk:** Fair, reciprocal covenants. - Outputs concrete, redlined clause replacements ready for negotiation. --- ## 9. 4-Family Court-Grade Document Factory **Source:** `backend/interview_state.py`, `backend/document_generator.py` Synthesizes print-ready, legally enforceable documents in Microsoft Word (`.docx`) and vector PDF formats. ### 9.1 Supported Document Families 1. **Letter / Notice Family (`letter`):** - Section 138 NIA Cheque Bounce Notices, Demand Notices for Unpaid Salary, Tenancy Default Notices. - Formal RPAD header, Sender `FROM:` block, Recipient `TO:` block, 15-day statutory demand clause, advocate signature block. 2. **Pleading Family (`pleading`):** - Civil Plaints under Order VII Rule 1 CPC, Section 223 BNSS Criminal Complaints. - Enforces the **Triad of Survival:** Cause of Action & Limitation, Territorial/Pecuniary Jurisdiction, and Court Valuation with Order VI Rule 15 verification split. 3. **Affidavit Family (`affidavit`):** - Sworn deponent affidavits with 5.5-inch stamp paper top margin and dual notary verification (personal knowledge vs. legal advice). 4. **Agreement Family (`agreement`):** - Commercial Leases, SLAs, NDAs with recitals, operative covenants, Section 7 Arbitration clause, and dual witness blocks. ### 9.2 Zero Prompt Leakage & Clean Formatting - **Sanitization Pipeline:** Strips all `[User Goal: document]` tags, instruction strings, and raw dictionary keys. - **Deterministic Fallback Spec Engine:** If the LLM spec generator times out, `build_fallback_spec()` automatically constructs an authentic, clause-complete legal document. - **Resilient Cloud Delivery:** Cached in memory and on disk (`./generated_docs/`), delivered via Axios blob stream with fallback browser navigation. --- ## 10. Security, Cloud Infrastructure & BYOK Architecture ### 10.1 Hugging Face Spaces ZeroGPU Backend - Configured via `app.py` unifying Gradio 5.20 and FastAPI on port 7860. - Dynamic GPU allocation (`zero-a10g`) with PyTorch embeddings strictly pinned to CPU to prevent ZeroGPU CUDA supervisor aborts. ### 10.2 Bring Your Own Key (BYOK) - Users can provide their personal Groq API keys (`gsk_...`) in `ApiKeyModal.jsx`. - Stored exclusively in the user's browser `localStorage` and passed per-request via the `X-Groq-Api-Key` HTTP header. - Zero server-side key logging or persistence. --- ## File Reference Summary **Backend (25 root + 4 trial_studio + 6 agents + 8 prompts + 4 scraper + 3 tests = 50 Python files)** - `app.py` — ZeroGPU Gradio 5.20 + FastAPI server entrypoint - `deploy_hf.py` — Automated deployment script for Hugging Face Spaces - `api_server.py` — Core FastAPI controller and route dispatcher - `pipeline_orchestrator.py` — 6-layer deterministic RAG controller - `actor_critic.py` — Actor-Critic Fine-Grained Process Reward Model - `evidence_processor.py` — Section 63 BSA electronic evidence & certification - `layer1_understanding.py` — Query understanding, Hindi HyDE, spaCy NER - `layer2_retrieval.py` — ChromaDB vector retrieval & Cross-Encoder (CPU) - `layer3_reasoning.py` — LLM response generation via Groq - `layer4_validation.py` — DeBERTa NLI & SC Struck-Down Firewall - `layer5_external.py` — IndianKanoon / DuckDuckGo live search fallback - `layer6_evaluator.py` — 25,000-character contract risk evaluation - `layer6_knowledge_graph.py` — Relational legal knowledge graph (NetworkX) - `interview_state.py` — Document drafting state machine & fallback spec engine - `document_generator.py` — 4-family .docx generation (Letter, Pleading, Affidavit, Agreement) - `dynamic_drafter.py` — Dynamic field scoping - `scrutiny_agent.py` — Pre-draft limitation and validity scrutiny - `discovery_agent.py` — Phase 1: 3-turn empathetic investigation - `strategy_agent.py` — Phase 2: SWOT matrix & 4-path generation - `irac_agent.py` — Advocate Mode IRAC structured brief generator - `triage_state.py` — 3-phase flow state machine - `database.py` — Supabase PostgreSQL + SQLite dual CRUD engine - `auth.py` — JWT authentication and bcrypt password hashing - `eval_pipeline.py` — Automated RAG benchmarking suite - `trial_studio/cross_examiner_agent.py` — Hostile Sec 146 BSA cross-examiner - `trial_studio/defense_fortifier_agent.py` — Corner Coach procedural objections - `trial_studio/precedent_engine.py` — 50,000+ landmark judgments index - `trial_studio/session_manager.py` — Moot court session persistence **Frontend (16 script + 6 CSS files)** - `App.jsx` — Core Omni-Box chat interface & session controller - `AuthPage.jsx` — JWT Login/Signup & guest session migration - `ConversationsSidebar.jsx` — Supabase cloud-synced conversation list - `TrialStudio.jsx` — Split-Chamber Pre-Trial Moot Court Arena - `EvidenceUploader.jsx` — Sec 63 BSA evidence uploader with hash verification - `TriageCards.jsx` — Strategic SWOT 4-path cards - `VetoCard.jsx` — Scrutiny blocker & limitation warning card - `BNSCorrectionNotice.jsx` — 2024 Transition notification banner - `JurisdictionBadge.jsx` — Court pecuniary & territorial indicator - `UrgencyBanner.jsx` — Statutory limitation countdown banner - `ApiKeyModal.jsx` — Bring-Your-Own-Key (BYOK) modal - `LegalGlossary.js` — 200+ Indian legal term dictionary - `usePDF.js` — Client-side jsPDF A4 vector rendering engine - `App.css`, `TrialStudio.css`, `EvidenceUploader.css` — Courtroom styling