import hashlib import sqlite3 import os from typing import List, Optional from fastapi import FastAPI, HTTPException, UploadFile, File from fastapi.responses import FileResponse from pydantic import BaseModel from PyPDF2 import PdfReader from gtts import gTTS import uvicorn from io import BytesIO import tempfile # ========================= # CONFIG # ========================= HOST = os.getenv("HOST", "0.0.0.0") PORT = 7860 DB_PATH = os.getenv("DB_PATH", "ouroboros_datavault.db") OWNER = os.getenv("OWNER", "Dwayne Anthony Brian Galloway") SIGNATURE = os.getenv("SIGNATURE", "DABG-OUROBOROS-SIGNED") # ========================= # DATA MODELS # ========================= class FactEntry(BaseModel): date: str actor: str description: str evidenceid: Optional[str] = None class CaseProject(BaseModel): name: str facts: List[FactEntry] class DamagesInput(BaseModel): projectid: int general_damages: float aggravated_damages: float exemplary_damages: float # ========================= # FASTAPI APP # ========================= app = FastAPI( title="Ouroboros Decision Engine - 2026 Unified Build", description="Forensic litigation decision-support system powered by Honey Badger Protocol", version="2026.1.0-OUROBOROS" ) # ========================= # DATABASE # ========================= def get_db_connection(): conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row return conn @app.on_event("startup") def setup_vault(): conn = get_db_connection() conn.executescript(""" CREATE TABLE IF NOT EXISTS projects ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, owner TEXT DEFAULT 'Dwayne Anthony Brian Galloway', status TEXT DEFAULT 'Active', created_ts TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS evidencevault ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, factdate TEXT NOT NULL, actor TEXT NOT NULL, factdescription TEXT NOT NULL, statutemapping TEXT NOT NULL, evidencehash TEXT NOT NULL, exhibitid TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS auditlog ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, timestamp TEXT DEFAULT CURRENT_TIMESTAMP, action TEXT NOT NULL, integrityscore REAL, hashchain TEXT ); CREATE TABLE IF NOT EXISTS regulatory_triggers ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, regulator TEXT NOT NULL, breach_statute TEXT NOT NULL, severity TEXT NOT NULL, hook_template TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS damages_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, general_damages REAL, aggravated_damages REAL, exemplary_damages REAL, total_damages REAL, opa_participation REAL, timestamp TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS documents ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER, filename TEXT, extracted_text TEXT, audio_path TEXT, timestamp TEXT DEFAULT CURRENT_TIMESTAMP ); """) conn.commit() conn.close() # ========================= # STATUTORY BREACH MAPPING # ========================= def match_statute_breach(description: str) -> str: desc = description.lower() if any(k in desc for k in ["refund", "defect", "warranty", "fault", "brake", "faulty", "non-conforming"]): return "CRA 2015 s.19(14)" if any(k in desc for k in ["disability", "adjustment", "wheelchair", "adhd", "discrimination", "reasonable"]): return "EqA 2010 s.20/s.29" if any(k in desc for k in ["data", "sar", "dsar", "missing", "call recording", "deleted"]): return "DPA 2018 s.45/s.170" if any(k in desc for k in ["lie", "distort", "false", "misled", "fraud", "misrepresent"]): return "Fraud Act 2006 s.3/s.4" if any(k in desc for k in ["fca", "ombudsman", "fin", "regulated", "treating customers fairly", "prin"]): return "FSMA 2000 Sch.17/FCA PRIN 6" return "General Law (FCA PRIN)" # ========================= # DOCUMENT PROCESSOR # ========================= @app.post("/upload/documents") async def upload_documents(projectid: int = 0, case_name: str = "Document Intake", files: List[UploadFile] = File(...)): conn = get_db_connection() if projectid > 0: project = conn.execute("SELECT id FROM projects WHERE id = ?", (projectid,)).fetchone() if not project: conn.close() raise HTTPException(status_code=404, detail="Project not found") target_pid = projectid is_new = False else: cursor = conn.execute("INSERT INTO projects (name, owner) VALUES (?, ?)", (case_name, OWNER)) target_pid = cursor.lastrowid is_new = True hashchain = [] all_breaches = [] combined_text = "" file_results = [] for idx, upload_file in enumerate(files): filename = upload_file.filename ext = os.path.splitext(filename)[1].lower() extracted_text = "" try: content = await upload_file.read() if ext == ".pdf": reader = PdfReader(BytesIO(content)) for page in reader.pages: page_text = page.extract_text() if page_text: extracted_text += page_text + "\n" elif ext in [".txt", ".md", ".csv"]: extracted_text = content.decode("utf-8", errors="ignore") else: continue except Exception as e: file_results.append({"file": filename, "status": f"error: {str(e)}"}) continue if not extracted_text.strip(): file_results.append({"file": filename, "status": "no text extracted"}) continue combined_text += f"\n\n--- {filename} ---\n\n" + extracted_text statute = match_statute_breach(extracted_text) if statute != "General Law (FCA PRIN)": all_breaches.append({"file": filename, "statute": statute}) fact_string = f"2026-06-23|DOCUMENT|{filename}: {extracted_text[:800]}...|DOC-{idx+1}" fact_hash = hashlib.sha256(fact_string.encode("utf-8")).hexdigest() hashchain.append(fact_hash) conn.execute( """INSERT INTO evidencevault (projectid, factdate, actor, factdescription, statutemapping, evidencehash, exhibitid) VALUES (?, ?, ?, ?, ?, ?, ?)""", (target_pid, "2026-06-23", "DOCUMENT_PROCESSOR", f"{filename}: {extracted_text[:800]}...", statute, fact_hash, f"DOC-{target_pid}-{idx+1}") ) file_results.append({"file": filename, "status": "processed", "statute": statute, "chars": len(extracted_text)}) if hashchain: conn.execute( """INSERT INTO auditlog (projectid, action, integrityscore, hashchain) VALUES (?, ?, ?, ?)""", (target_pid, f"DOCUMENT_INTAKE_{len(hashchain)}_FILES", 1.0, "|".join(hashchain)) ) audio_path = None tts_text = combined_text[:3000] if tts_text.strip(): try: tts = gTTS(text=tts_text, lang="en", slow=False) tmp_audio = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3", dir="/tmp") tts.save(tmp_audio.name) audio_path = tmp_audio.name conn.execute("INSERT INTO documents (projectid, filename, extracted_text, audio_path) VALUES (?, ?, ?, ?)", (target_pid, "combined_tts", combined_text[:2000], audio_path)) except Exception: pass conn.commit() conn.close() return { "status": f"{'Created' if is_new else 'Added to'} Project {target_pid}", "projectid": target_pid, "files_processed": len(file_results), "file_results": file_results, "breaches_detected": len(all_breaches), "breaches": all_breaches, "audio_generated": audio_path is not None, "signature": SIGNATURE } @app.get("/audio/{projectid}") async def get_audio(projectid: int): conn = get_db_connection() doc = conn.execute("SELECT audio_path FROM documents WHERE projectid = ? ORDER BY id DESC LIMIT 1", (projectid,)).fetchone() conn.close() if not doc or not doc["audio_path"]: raise HTTPException(status_code=404, detail="No audio found") return FileResponse(doc["audio_path"], media_type="audio/mpeg") # ========================= # CORE ENDPOINTS # ========================= @app.get("/") async def root(): return {"system": "Ouroboros Litigation Station", "version": "2026.1.0-OUROBOROS", "docs": "/docs", "signature": SIGNATURE} @app.get("/health") async def health_check(): return { "status": "Operational", "system": "Ouroboros Decision Engine", "owner": OWNER, "version": "2026.1.0-OUROBOROS", "opa_rate": "20%", "ip_royalty": "10% (Coding Demon)", "signature": SIGNATURE } @app.post("/intake/restless") async def intake_evidence(case: CaseProject): conn = get_db_connection() cursor = conn.execute("INSERT INTO projects (name, owner) VALUES (?, ?)", (case.name, OWNER)) projectid = cursor.lastrowid hashchain = [] for fact in case.facts: fact_string = f"{fact.date}|{fact.actor}|{fact.description}|{fact.evidenceid or 'NONE'}" fact_hash = hashlib.sha256(fact_string.encode("utf-8")).hexdigest() hashchain.append(fact_hash) statute = match_statute_breach(fact.description) exhibit_id = fact.evidenceid or f"EX-{len(hashchain)}" conn.execute( """INSERT INTO evidencevault (projectid, factdate, actor, factdescription, statutemapping, evidencehash, exhibitid) VALUES (?, ?, ?, ?, ?, ?, ?)""", (projectid, fact.date, fact.actor, fact.description, statute, fact_hash, exhibit_id) ) conn.execute( """INSERT INTO auditlog (projectid, action, integrityscore, hashchain) VALUES (?, ?, ?, ?)""", (projectid, "INTAKE_RESTLESS", 1.0, "|".join(hashchain)) ) conn.commit() conn.close() return { "status": "Intake Complete", "projectid": projectid, "evidence_count": len(case.facts), "integrity": 1.0, "signature": SIGNATURE } @app.get("/audit/1440") async def run_temporal_cascade(projectid: int): conn = get_db_connection() evidence_rows = conn.execute("SELECT * FROM evidencevault WHERE projectid = ?", (projectid,)).fetchall() if not evidence_rows: conn.close() raise HTTPException(status_code=400, detail="No evidence found") regulatory_triggers = [] for evidence in evidence_rows: statute = evidence["statutemapping"] if "CRA" in statute: regulatory_triggers.append({"regulator": "FCA", "breach": statute}) if "EqA" in statute: regulatory_triggers.append({"regulator": "EHRC", "breach": statute}) if "DPA" in statute: regulatory_triggers.append({"regulator": "ICO", "breach": statute}) if "Fraud" in statute: regulatory_triggers.append({"regulator": "NCA", "breach": statute}) if "FSMA" in statute: regulatory_triggers.append({"regulator": "FCA", "breach": statute}) module_passes = 15 integrity_score = min(1.0, module_passes / 15) ownergate = "OPEN" if integrity_score >= 0.8 else "LOCKED" conn.execute( """INSERT INTO auditlog (projectid, action, integrityscore) VALUES (?, ?, ?)""", (projectid, "TEMPORAL_CASCADE_1440", integrity_score) ) for trigger in regulatory_triggers: conn.execute( """INSERT OR IGNORE INTO regulatory_triggers (projectid, regulator, breach_statute, severity, hook_template) VALUES (?, ?, ?, ?, ?)""", (projectid, trigger["regulator"], trigger["breach"], "HIGH", f"Complaint hook for {trigger['regulator']} - {trigger['breach']}") ) conn.commit() conn.close() return { "status": "Cascade Complete", "projectid": projectid, "integrity_score": integrity_score, "ownergate": ownergate, "regulatory_triggers": len(regulatory_triggers), "signature": SIGNATURE } @app.post("/generate/procedural") async def generate_court_pack(projectid: int): conn = get_db_connection() project = conn.execute("SELECT * FROM projects WHERE id = ?", (projectid,)).fetchone() if not project: conn.close() raise HTTPException(status_code=404, detail="Project not found") evidence_list = conn.execute("SELECT * FROM evidencevault WHERE projectid = ?", (projectid,)).fetchall() conn.close() if len(evidence_list) < 3: raise HTTPException(status_code=400, detail="INCOMPLETE PACK - FIX BEFORE EXPORT") forms = { "N1_Claim_Form": { "title": "Particulars of Claim", "breach_heads": [e["statutemapping"] for e in evidence_list], "exhibits": [e["exhibitid"] for e in evidence_list] }, "N244_Application": { "title": "Application Notice (Interim Relief)", "grounds": "Serious harm if interim relief not granted; risk of asset dissipation", "remedy_sought": "Mareva Freezing Injunction / Anton Piller Search Order" }, "EX160_Fee_Remission": { "title": "Application for Help with Court Fees", "disability_flag": True, "hardship_evidence": True } } return { "status": "Pack Ready", "projectid": projectid, "forms_generated": list(forms.keys()), "forms": forms, "signature": SIGNATURE } @app.post("/sweep/regulators") async def regulatory_shotgun(projectid: int): conn = get_db_connection() triggers = conn.execute( "SELECT DISTINCT regulator, breach_statute FROM regulatory_triggers WHERE projectid = ?", (projectid,) ).fetchall() if not triggers: conn.close() raise HTTPException(status_code=400, detail="No regulatory triggers identified") modules = { "Modular-FCA": { "target": "FCA / PRA", "breach": "PRIN 6 & BCOBS", "message": "Institutional reliance on vendor fraud; Treating Customers Fairly breach", "precedent": "FCA enforcement cases", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-ICO": { "target": "ICO", "breach": "DPA 2018 s.45", "message": "Incomplete DSAR; adverse inference on missing call recordings", "precedent": "Gurieva v CSD", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-SRA": { "target": "SRA / BSB", "breach": "Principles 2 & 5", "message": "Solicitor file distortion; misstatement of law", "precedent": "SRA enforcement decisions", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-EHRC": { "target": "EHRC", "breach": "EqA 2010 s.20", "message": "Systematic disability discrimination; failure to adjust", "precedent": "Archibald v Fife", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-Parliament": { "target": "Parliament", "breach": "Legislative gap", "message": "Systemic consumer protection failure", "precedent": "Legislative review", "registers": ["Plain English", "QC Forensic", "Parliamentary"] } } conn.close() return { "status": "Regulatory Shotgun Complete", "projectid": projectid, "modules": list(modules.keys()), "module_details": modules, "signature": SIGNATURE } @app.post("/damages/calculate") async def calculate_damages(damages: DamagesInput): total = damages.general_damages + damages.aggravated_damages + damages.exemplary_damages opa_20_percent = total * 0.20 net_to_claimant = total - opa_20_percent ip_royalty = total * 0.10 conn = get_db_connection() conn.execute( """INSERT INTO damages_log (projectid, general_damages, aggravated_damages, exemplary_damages, total_damages, opa_participation) VALUES (?, ?, ?, ?, ?, ?)""", (damages.projectid, damages.general_damages, damages.aggravated_damages, damages.exemplary_damages, total, opa_20_percent) ) conn.commit() conn.close() return { "status": "Damages Calculated", "projectid": damages.projectid, "general_damages": damages.general_damages, "aggravated_damages": damages.aggravated_damages, "exemplary_damages": damages.exemplary_damages, "total_damages": total, "opa_participation_20percent": opa_20_percent, "net_to_claimant": net_to_claimant, "ip_royalty_10percent": ip_royalty, "signature": SIGNATURE } @app.get("/project/{projectid}") async def get_project_summary(projectid: int): conn = get_db_connection() project = conn.execute("SELECT * FROM projects WHERE id = ?", (projectid,)).fetchone() if not project: conn.close() raise HTTPException(status_code=404, detail="Project not found") evidence = conn.execute("SELECT COUNT(*) as count FROM evidencevault WHERE projectid = ?", (projectid,)).fetchone() audit_logs = conn.execute("SELECT * FROM auditlog WHERE projectid = ? ORDER BY timestamp DESC LIMIT 10", (projectid,)).fetchall() triggers = conn.execute("SELECT * FROM regulatory_triggers WHERE projectid = ?", (projectid,)).fetchall() damages = conn.execute("SELECT * FROM damages_log WHERE projectid = ? ORDER BY timestamp DESC LIMIT 1", (projectid,)).fetchone() conn.close() return { "project_id": projectid, "project_name": project["name"], "owner": project["owner"], "status": project["status"], "created": project["created_ts"], "evidence_count": evidence["count"], "audit_trail": [dict(log) for log in audit_logs], "regulatory_triggers": len(triggers), "triggers_detail": [dict(t) for t in triggers], "damages_calculated": dict(damages) if damages else None, "signature": SIGNATURE } @app.get("/docs_framework") async def framework_documentation(): return { "frameworks": [ "1. Ouroboros Temporal Cascade (1,440-loop daily cycle)", "2. Coding Demon (IP protection + cryptographic attribution)", "3. Mega Honey Badger Matrix (statutory breach mapping)", "4. Restless Honey Badger (evidence intake & hashing)", "5. Strategy Demon (Hurricane Stress Test)", "6. Regulatory Shotgun (multi-agency pressure)", "7. Ms.Nala Queen Nala (data ingestion pipeline)", "8. Beast Protocol (nuclear remedy deployment)", "9. Circular Logic Trap (pierce FOS immunity)", "10. Natalia Contradiction (disability discrimination)", "11. Piercing Immunity Matrix (4 statutory strategies)", "12. VIBES Cycle (6-hour operational rhythm)", "13. OPA Model (20% outcome participation)" ], "legal_weapons": [ "Hurricane Stress Test", "Fumbulance Maneuver", "Burden Flip Referral", "Electromagnet Checklist", "Dragonfly Eye Analysis", "Mareva + Anton Piller", "Hardship Fast-Track", "Qualified Privilege Defeat", "Circular Logic Trap", "Natalia Contradiction", "Regulatory Shotgun", "Evidence Spoliation Clock" ], "signature": SIGNATURE } if __name__ == "__main__": uvicorn.run(app, host=HOST, port=PORT) import hashlib import sqlite3 import os from typing import List, Optional from fastapi import FastAPI, HTTPException, UploadFile, File from fastapi.responses import FileResponse from pydantic import BaseModel from PyPDF2 import PdfReader from gtts import gTTS import uvicorn from io import BytesIO import tempfile # ========================= # CONFIG # ========================= HOST = os.getenv("HOST", "0.0.0.0") PORT = int(os.getenv("PORT", "8000")) DB_PATH = os.getenv("DB_PATH", "ouroboros_datavault.db") OWNER = os.getenv("OWNER", "Dwayne Anthony Brian Galloway") SIGNATURE = os.getenv("SIGNATURE", "DABG-OUROBOROS-SIGNED") # ========================= # DATA MODELS # ========================= class FactEntry(BaseModel): date: str actor: str description: str evidenceid: Optional[str] = None class CaseProject(BaseModel): name: str facts: List[FactEntry] class DamagesInput(BaseModel): projectid: int general_damages: float aggravated_damages: float exemplary_damages: float # ========================= # FASTAPI APP # ========================= app = FastAPI( title="Ouroboros Decision Engine - 2026 Unified Build", description="Forensic litigation decision-support system powered by Honey Badger Protocol", version="2026.1.0-OUROBOROS" ) # ========================= # DATABASE # ========================= def get_db_connection(): conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row return conn @app.on_event("startup") def setup_vault(): conn = get_db_connection() conn.executescript(""" CREATE TABLE IF NOT EXISTS projects ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, owner TEXT DEFAULT 'Dwayne Anthony Brian Galloway', status TEXT DEFAULT 'Active', created_ts TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS evidencevault ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, factdate TEXT NOT NULL, actor TEXT NOT NULL, factdescription TEXT NOT NULL, statutemapping TEXT NOT NULL, evidencehash TEXT NOT NULL, exhibitid TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS auditlog ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, timestamp TEXT DEFAULT CURRENT_TIMESTAMP, action TEXT NOT NULL, integrityscore REAL, hashchain TEXT ); CREATE TABLE IF NOT EXISTS regulatory_triggers ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, regulator TEXT NOT NULL, breach_statute TEXT NOT NULL, severity TEXT NOT NULL, hook_template TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS damages_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER NOT NULL, general_damages REAL, aggravated_damages REAL, exemplary_damages REAL, total_damages REAL, opa_participation REAL, timestamp TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS documents ( id INTEGER PRIMARY KEY AUTOINCREMENT, projectid INTEGER, filename TEXT, extracted_text TEXT, audio_path TEXT, timestamp TEXT DEFAULT CURRENT_TIMESTAMP ); """) conn.commit() conn.close() # ========================= # STATUTORY BREACH MAPPING # ========================= def match_statute_breach(description: str) -> str: desc = description.lower() if any(k in desc for k in ["refund", "defect", "warranty", "fault", "brake", "faulty", "non-conforming"]): return "CRA 2015 s.19(14)" if any(k in desc for k in ["disability", "adjustment", "wheelchair", "adhd", "discrimination", "reasonable"]): return "EqA 2010 s.20/s.29" if any(k in desc for k in ["data", "sar", "dsar", "missing", "call recording", "deleted"]): return "DPA 2018 s.45/s.170" if any(k in desc for k in ["lie", "distort", "false", "misled", "fraud", "misrepresent"]): return "Fraud Act 2006 s.3/s.4" if any(k in desc for k in ["fca", "ombudsman", "fin", "regulated", "treating customers fairly", "prin"]): return "FSMA 2000 Sch.17/FCA PRIN 6" return "General Law (FCA PRIN)" # ========================= # DOCUMENT PROCESSOR # ========================= @app.post("/upload/documents") async def upload_documents(projectid: int = 0, case_name: str = "Document Intake", files: List[UploadFile] = File(...)): conn = get_db_connection() if projectid > 0: project = conn.execute("SELECT id FROM projects WHERE id = ?", (projectid,)).fetchone() if not project: conn.close() raise HTTPException(status_code=404, detail="Project not found") target_pid = projectid is_new = False else: cursor = conn.execute("INSERT INTO projects (name, owner) VALUES (?, ?)", (case_name, OWNER)) target_pid = cursor.lastrowid is_new = True hashchain = [] all_breaches = [] combined_text = "" file_results = [] for idx, upload_file in enumerate(files): filename = upload_file.filename ext = os.path.splitext(filename)[1].lower() extracted_text = "" try: content = await upload_file.read() if ext == ".pdf": reader = PdfReader(BytesIO(content)) for page in reader.pages: page_text = page.extract_text() if page_text: extracted_text += page_text + "\n" elif ext in [".txt", ".md", ".csv"]: extracted_text = content.decode("utf-8", errors="ignore") else: continue except Exception as e: file_results.append({"file": filename, "status": f"error: {str(e)}"}) continue if not extracted_text.strip(): file_results.append({"file": filename, "status": "no text extracted"}) continue combined_text += f"\n\n--- {filename} ---\n\n" + extracted_text statute = match_statute_breach(extracted_text) if statute != "General Law (FCA PRIN)": all_breaches.append({"file": filename, "statute": statute}) fact_string = f"2026-06-23|DOCUMENT|{filename}: {extracted_text[:800]}...|DOC-{idx+1}" fact_hash = hashlib.sha256(fact_string.encode("utf-8")).hexdigest() hashchain.append(fact_hash) conn.execute( """INSERT INTO evidencevault (projectid, factdate, actor, factdescription, statutemapping, evidencehash, exhibitid) VALUES (?, ?, ?, ?, ?, ?, ?)""", (target_pid, "2026-06-23", "DOCUMENT_PROCESSOR", f"{filename}: {extracted_text[:800]}...", statute, fact_hash, f"DOC-{target_pid}-{idx+1}") ) file_results.append({"file": filename, "status": "processed", "statute": statute, "chars": len(extracted_text)}) if hashchain: conn.execute( """INSERT INTO auditlog (projectid, action, integrityscore, hashchain) VALUES (?, ?, ?, ?)""", (target_pid, f"DOCUMENT_INTAKE_{len(hashchain)}_FILES", 1.0, "|".join(hashchain)) ) audio_path = None tts_text = combined_text[:3000] if tts_text.strip(): try: tts = gTTS(text=tts_text, lang="en", slow=False) tmp_audio = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3", dir="/tmp") tts.save(tmp_audio.name) audio_path = tmp_audio.name conn.execute("INSERT INTO documents (projectid, filename, extracted_text, audio_path) VALUES (?, ?, ?, ?)", (target_pid, "combined_tts", combined_text[:2000], audio_path)) except Exception: pass conn.commit() conn.close() return { "status": f"{'Created' if is_new else 'Added to'} Project {target_pid}", "projectid": target_pid, "files_processed": len(file_results), "file_results": file_results, "breaches_detected": len(all_breaches), "breaches": all_breaches, "audio_generated": audio_path is not None, "signature": SIGNATURE } @app.get("/audio/{projectid}") async def get_audio(projectid: int): conn = get_db_connection() doc = conn.execute("SELECT audio_path FROM documents WHERE projectid = ? ORDER BY id DESC LIMIT 1", (projectid,)).fetchone() conn.close() if not doc or not doc["audio_path"]: raise HTTPException(status_code=404, detail="No audio found") return FileResponse(doc["audio_path"], media_type="audio/mpeg") # ========================= # CORE ENDPOINTS # ========================= @app.get("/") async def root(): return {"system": "Ouroboros Litigation Station", "version": "2026.1.0-OUROBOROS", "docs": "/docs", "signature": SIGNATURE} @app.get("/health") async def health_check(): return { "status": "Operational", "system": "Ouroboros Decision Engine", "owner": OWNER, "version": "2026.1.0-OUROBOROS", "opa_rate": "20%", "ip_royalty": "10% (Coding Demon)", "signature": SIGNATURE } @app.post("/intake/restless") async def intake_evidence(case: CaseProject): conn = get_db_connection() cursor = conn.execute("INSERT INTO projects (name, owner) VALUES (?, ?)", (case.name, OWNER)) projectid = cursor.lastrowid hashchain = [] for fact in case.facts: fact_string = f"{fact.date}|{fact.actor}|{fact.description}|{fact.evidenceid or 'NONE'}" fact_hash = hashlib.sha256(fact_string.encode("utf-8")).hexdigest() hashchain.append(fact_hash) statute = match_statute_breach(fact.description) exhibit_id = fact.evidenceid or f"EX-{len(hashchain)}" conn.execute( """INSERT INTO evidencevault (projectid, factdate, actor, factdescription, statutemapping, evidencehash, exhibitid) VALUES (?, ?, ?, ?, ?, ?, ?)""", (projectid, fact.date, fact.actor, fact.description, statute, fact_hash, exhibit_id) ) conn.execute( """INSERT INTO auditlog (projectid, action, integrityscore, hashchain) VALUES (?, ?, ?, ?)""", (projectid, "INTAKE_RESTLESS", 1.0, "|".join(hashchain)) ) conn.commit() conn.close() return { "status": "Intake Complete", "projectid": projectid, "evidence_count": len(case.facts), "integrity": 1.0, "signature": SIGNATURE } @app.get("/audit/1440") async def run_temporal_cascade(projectid: int): conn = get_db_connection() evidence_rows = conn.execute("SELECT * FROM evidencevault WHERE projectid = ?", (projectid,)).fetchall() if not evidence_rows: conn.close() raise HTTPException(status_code=400, detail="No evidence found") regulatory_triggers = [] for evidence in evidence_rows: statute = evidence["statutemapping"] if "CRA" in statute: regulatory_triggers.append({"regulator": "FCA", "breach": statute}) if "EqA" in statute: regulatory_triggers.append({"regulator": "EHRC", "breach": statute}) if "DPA" in statute: regulatory_triggers.append({"regulator": "ICO", "breach": statute}) if "Fraud" in statute: regulatory_triggers.append({"regulator": "NCA", "breach": statute}) if "FSMA" in statute: regulatory_triggers.append({"regulator": "FCA", "breach": statute}) module_passes = 15 integrity_score = min(1.0, module_passes / 15) ownergate = "OPEN" if integrity_score >= 0.8 else "LOCKED" conn.execute( """INSERT INTO auditlog (projectid, action, integrityscore) VALUES (?, ?, ?)""", (projectid, "TEMPORAL_CASCADE_1440", integrity_score) ) for trigger in regulatory_triggers: conn.execute( """INSERT OR IGNORE INTO regulatory_triggers (projectid, regulator, breach_statute, severity, hook_template) VALUES (?, ?, ?, ?, ?)""", (projectid, trigger["regulator"], trigger["breach"], "HIGH", f"Complaint hook for {trigger['regulator']} - {trigger['breach']}") ) conn.commit() conn.close() return { "status": "Cascade Complete", "projectid": projectid, "integrity_score": integrity_score, "ownergate": ownergate, "regulatory_triggers": len(regulatory_triggers), "signature": SIGNATURE } @app.post("/generate/procedural") async def generate_court_pack(projectid: int): conn = get_db_connection() project = conn.execute("SELECT * FROM projects WHERE id = ?", (projectid,)).fetchone() if not project: conn.close() raise HTTPException(status_code=404, detail="Project not found") evidence_list = conn.execute("SELECT * FROM evidencevault WHERE projectid = ?", (projectid,)).fetchall() conn.close() if len(evidence_list) < 3: raise HTTPException(status_code=400, detail="INCOMPLETE PACK - FIX BEFORE EXPORT") forms = { "N1_Claim_Form": { "title": "Particulars of Claim", "breach_heads": [e["statutemapping"] for e in evidence_list], "exhibits": [e["exhibitid"] for e in evidence_list] }, "N244_Application": { "title": "Application Notice (Interim Relief)", "grounds": "Serious harm if interim relief not granted; risk of asset dissipation", "remedy_sought": "Mareva Freezing Injunction / Anton Piller Search Order" }, "EX160_Fee_Remission": { "title": "Application for Help with Court Fees", "disability_flag": True, "hardship_evidence": True } } return { "status": "Pack Ready", "projectid": projectid, "forms_generated": list(forms.keys()), "forms": forms, "signature": SIGNATURE } @app.post("/sweep/regulators") async def regulatory_shotgun(projectid: int): conn = get_db_connection() triggers = conn.execute( "SELECT DISTINCT regulator, breach_statute FROM regulatory_triggers WHERE projectid = ?", (projectid,) ).fetchall() if not triggers: conn.close() raise HTTPException(status_code=400, detail="No regulatory triggers identified") modules = { "Modular-FCA": { "target": "FCA / PRA", "breach": "PRIN 6 & BCOBS", "message": "Institutional reliance on vendor fraud; Treating Customers Fairly breach", "precedent": "FCA enforcement cases", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-ICO": { "target": "ICO", "breach": "DPA 2018 s.45", "message": "Incomplete DSAR; adverse inference on missing call recordings", "precedent": "Gurieva v CSD", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-SRA": { "target": "SRA / BSB", "breach": "Principles 2 & 5", "message": "Solicitor file distortion; misstatement of law", "precedent": "SRA enforcement decisions", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-EHRC": { "target": "EHRC", "breach": "EqA 2010 s.20", "message": "Systematic disability discrimination; failure to adjust", "precedent": "Archibald v Fife", "registers": ["Plain English", "QC Forensic", "Parliamentary"] }, "Modular-Parliament": { "target": "Parliament", "breach": "Legislative gap", "message": "Systemic consumer protection failure", "precedent": "Legislative review", "registers": ["Plain English", "QC Forensic", "Parliamentary"] } } conn.close() return { "status": "Regulatory Shotgun Complete", "projectid": projectid, "modules": list(modules.keys()), "module_details": modules, "signature": SIGNATURE } @app.post("/damages/calculate") async def calculate_damages(damages: DamagesInput): total = damages.general_damages + damages.aggravated_damages + damages.exemplary_damages opa_20_percent = total * 0.20 net_to_claimant = total - opa_20_percent ip_royalty = total * 0.10 conn = get_db_connection() conn.execute( """INSERT INTO damages_log (projectid, general_damages, aggravated_damages, exemplary_damages, total_damages, opa_participation) VALUES (?, ?, ?, ?, ?, ?)""", (damages.projectid, damages.general_damages, damages.aggravated_damages, damages.exemplary_damages, total, opa_20_percent) ) conn.commit() conn.close() return { "status": "Damages Calculated", "projectid": damages.projectid, "general_damages": damages.general_damages, "aggravated_damages": damages.aggravated_damages, "exemplary_damages": damages.exemplary_damages, "total_damages": total, "opa_participation_20percent": opa_20_percent, "net_to_claimant": net_to_claimant, "ip_royalty_10percent": ip_royalty, "signature": SIGNATURE } @app.get("/project/{projectid}") async def get_project_summary(projectid: int): conn = get_db_connection() project = conn.execute("SELECT * FROM projects WHERE id = ?", (projectid,)).fetchone() if not project: conn.close() raise HTTPException(status_code=404, detail="Project not found") evidence = conn.execute("SELECT COUNT(*) as count FROM evidencevault WHERE projectid = ?", (projectid,)).fetchone() audit_logs = conn.execute("SELECT * FROM auditlog WHERE projectid = ? ORDER BY timestamp DESC LIMIT 10", (projectid,)).fetchall() triggers = conn.execute("SELECT * FROM regulatory_triggers WHERE projectid = ?", (projectid,)).fetchall() damages = conn.execute("SELECT * FROM damages_log WHERE projectid = ? ORDER BY timestamp DESC LIMIT 1", (projectid,)).fetchone() conn.close() return { "project_id": projectid, "project_name": project["name"], "owner": project["owner"], "status": project["status"], "created": project["created_ts"], "evidence_count": evidence["count"], "audit_trail": [dict(log) for log in audit_logs], "regulatory_triggers": len(triggers), "triggers_detail": [dict(t) for t in triggers], "damages_calculated": dict(damages) if damages else None, "signature": SIGNATURE } @app.get("/docs_framework") async def framework_documentation(): return { "frameworks": [ "1. Ouroboros Temporal Cascade (1,440-loop daily cycle)", "2. Coding Demon (IP protection + cryptographic attribution)", "3. Mega Honey Badger Matrix (statutory breach mapping)", "4. Restless Honey Badger (evidence intake & hashing)", "5. Strategy Demon (Hurricane Stress Test)", "6. Regulatory Shotgun (multi-agency pressure)", "7. Ms.Nala Queen Nala (data ingestion pipeline)", "8. Beast Protocol (nuclear remedy deployment)", "9. Circular Logic Trap (pierce FOS immunity)", "10. Natalia Contradiction (disability discrimination)", "11. Piercing Immunity Matrix (4 statutory strategies)", "12. VIBES Cycle (6-hour operational rhythm)", "13. OPA Model (20% outcome participation)" ], "legal_weapons": [ "Hurricane Stress Test", "Fumbulance Maneuver", "Burden Flip Referral", "Electromagnet Checklist", "Dragonfly Eye Analysis", "Mareva + Anton Piller", "Hardship Fast-Track", "Qualified Privilege Defeat", "Circular Logic Trap", "Natalia Contradiction", "Regulatory Shotgun", "Evidence Spoliation Clock" ], "signature": SIGNATURE } if __name__ == "__main__": uvicorn.run(app, host=HOST, port=PORT)