diff --git a/backend/alembic/versions/006_add_knowledge_base.py b/backend/alembic/versions/006_add_knowledge_base.py index e59c668..229b4c7 100644 --- a/backend/alembic/versions/006_add_knowledge_base.py +++ b/backend/alembic/versions/006_add_knowledge_base.py @@ -117,7 +117,7 @@ def upgrade() -> None: conn = op.get_bind() kb_seeds = [ - ("legal", "Legal", "Legal compliance, advertising standards, disclaimers, and financial promotion rules."), + ("legal", "Risk & Control", "Legal compliance, advertising standards, disclaimers, and financial promotion rules."), ("brand_barclays", "Brand (Barclays)", "Barclays brand guidelines: logo usage, colors, typography, and design principles."), ("brand_barclaycard", "Brand (Barclaycard)", "Barclaycard brand guidelines: logo usage, colors, typography, and design principles."), ("channel_best_practices", "Channel Best Practices", "Channel-specific best practices for social, display, email, print, and OOH."), diff --git a/backend/alembic/versions/010_rename_legal_kb_to_risk_control.py b/backend/alembic/versions/010_rename_legal_kb_to_risk_control.py new file mode 100644 index 0000000..cce634b --- /dev/null +++ b/backend/alembic/versions/010_rename_legal_kb_to_risk_control.py @@ -0,0 +1,29 @@ +"""Rename Legal knowledge base to Risk & Control + +Revision ID: 010_rename_legal_kb +Revises: 009_production_agencies +Create Date: 2026-05-14 + +""" +from alembic import op + +revision: str = '010_rename_legal_kb' +down_revision: str = '009_production_agencies' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.execute(""" + UPDATE knowledge_bases + SET display_name = 'Risk & Control' + WHERE agent_key = 'legal' + """) + + +def downgrade() -> None: + op.execute(""" + UPDATE knowledge_bases + SET display_name = 'Legal' + WHERE agent_key = 'legal' + """) diff --git a/backend/app/agents/lead_agent.py b/backend/app/agents/lead_agent.py index 3438fcf..3a3a792 100755 --- a/backend/app/agents/lead_agent.py +++ b/backend/app/agents/lead_agent.py @@ -95,7 +95,7 @@ In your summary: Returns: Tuple of (overall_status, summary, financial_promotion_reason) """ - legal_review = reviews.get("Legal Agent") + legal_review = reviews.get("Risk & Control Agent") # Check for financial promotion (from Legal Agent) is_financial_promotion = ( @@ -129,7 +129,7 @@ Your task is to determine the final status and write a concise, professional sum {metadata_context} Here is the logic you must follow: -1. The Legal Agent has determined if this is a financial promotion: {is_financial_promotion}. +1. The Risk & Control Agent has determined if this is a financial promotion: {is_financial_promotion}. 2. If it IS a financial promotion, the final verdict MUST be 'Requires Manual Legal Review'. Your summary should state this clearly, explain that a separate manual legal review is required, and then summarize any other issues found by the other agents. 3. If it is NOT a financial promotion, follow the standard logic: a. If ANY specialist agent reports a 'ragStatus' of 'Error', the final verdict MUST be 'Analysis Error'. @@ -205,7 +205,7 @@ Now, provide your final status and summary as a JSON object. This can be used as a fallback or for faster processing. """ - legal_review = reviews.get("Legal Agent") + legal_review = reviews.get("Risk & Control Agent") # Check for financial promotion if legal_review and legal_review.isFinancialPromotion: diff --git a/backend/app/agents/legal_agent.py b/backend/app/agents/legal_agent.py index 257bdfc..557dbd5 100755 --- a/backend/app/agents/legal_agent.py +++ b/backend/app/agents/legal_agent.py @@ -9,7 +9,7 @@ from app.services.reference_docs import ReferenceDocsService class LegalAgent(BaseAgent): """Legal Agent - analyzes proofs for legal compliance using Gemini.""" - name = "Legal Agent" + name = "Risk & Control Agent" def __init__(self, gemini_service: GeminiService, reference_docs: ReferenceDocsService): """ diff --git a/backend/app/main.py b/backend/app/main.py index bec2a75..4cd1595 100755 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -134,7 +134,7 @@ async def info(user: dict = Depends(get_current_user)): return { "status": "ready", "user": user.get("name", "Unknown"), - "agents": ["Legal Agent", "Brand Agent", "Channel Best Practices Agent", "Channel Tech Specs Agent"], + "agents": ["Risk & Control Agent", "Brand Agent", "Channel Best Practices Agent", "Channel Tech Specs Agent"], "reference_docs": doc_summary, } return {"status": "initializing", "user": user.get("name", "Unknown")} diff --git a/backend/app/services/analysis_service.py b/backend/app/services/analysis_service.py index 8134872..27f8901 100755 --- a/backend/app/services/analysis_service.py +++ b/backend/app/services/analysis_service.py @@ -27,11 +27,11 @@ class AnalysisService: """ # Agent execution order - AGENT_ORDER = ["Legal Agent", "Brand Agent", "Channel Best Practices Agent", "Channel Tech Specs Agent"] + AGENT_ORDER = ["Risk & Control Agent", "Brand Agent", "Channel Best Practices Agent", "Channel Tech Specs Agent"] # Mapping from agent name to the key in AgentReview/previous_analysis dict AGENT_REVIEW_KEY_MAP = { - "Legal Agent": "legalAgentReview", + "Risk & Control Agent": "legalAgentReview", "Brand Agent": "brandAgentReview", "Channel Best Practices Agent": "channelBestPracticesAgentReview", "Channel Tech Specs Agent": "channelTechSpecsAgentReview", @@ -54,7 +54,7 @@ class AnalysisService: # Initialize agents self.agents = { - "Legal Agent": LegalAgent(gemini_service, reference_docs), + "Risk & Control Agent": LegalAgent(gemini_service, reference_docs), "Brand Agent": BrandAgent(gemini_service, reference_docs), "Channel Best Practices Agent": ChannelBestPracticesAgent(gemini_service, reference_docs), "Channel Tech Specs Agent": ChannelTechSpecsAgent(gemini_service, reference_docs), @@ -230,7 +230,7 @@ class AnalysisService: # Build the complete AgentReview return AgentReview( - legalAgentReview=reviews["Legal Agent"], + legalAgentReview=reviews["Risk & Control Agent"], brandAgentReview=reviews["Brand Agent"], channelBestPracticesAgentReview=reviews["Channel Best Practices Agent"], channelTechSpecsAgentReview=reviews["Channel Tech Specs Agent"], diff --git a/frontend/components/Analytics.tsx b/frontend/components/Analytics.tsx index 2a72267..d1c66d6 100755 --- a/frontend/components/Analytics.tsx +++ b/frontend/components/Analytics.tsx @@ -9,7 +9,7 @@ import apiService, { AnalyticsResponse, AgencyAnalyticsItem } from '../services/ // Agent performance is still static for now - would need separate API const agentPerformance = [ - { name: 'Legal Agent', passRate: 85, avgIssues: 1.2, trend: 'up' }, + { name: 'Risk & Control Agent', passRate: 85, avgIssues: 1.2, trend: 'up' }, { name: 'Brand Agent', passRate: 68, avgIssues: 2.5, trend: 'down' }, { name: 'Channel Best Practices Agent', passRate: 92, avgIssues: 0.8, trend: 'up' }, { name: 'Channel Tech Specs Agent', passRate: 71, avgIssues: 1.9, trend: 'stable' }, diff --git a/frontend/components/Campaigns.tsx b/frontend/components/Campaigns.tsx index d3bb65d..9f1df6f 100755 --- a/frontend/components/Campaigns.tsx +++ b/frontend/components/Campaigns.tsx @@ -1056,7 +1056,7 @@ const AnalysisErrorModal: React.FC<{ if (!isOpen || !feedback) return null; const agentEntries: { label: string; review: { ragStatus: string; feedback: string } }[] = [ - { label: 'Legal Agent', review: feedback.legalAgentReview }, + { label: 'Risk & Control Agent', review: feedback.legalAgentReview }, { label: 'Brand Agent', review: feedback.brandAgentReview }, { label: 'Channel Best Practices Agent', review: feedback.channelBestPracticesAgentReview }, { label: 'Channel Tech Specs Agent', review: feedback.channelTechSpecsAgentReview }, diff --git a/frontend/components/ChecksOverview.tsx b/frontend/components/ChecksOverview.tsx index e02fe4e..bf59918 100755 --- a/frontend/components/ChecksOverview.tsx +++ b/frontend/components/ChecksOverview.tsx @@ -14,7 +14,7 @@ interface CheckDetail { const specialistAgents: CheckDetail[] = [ { - name: 'Legal Agent', + name: 'Risk & Control Agent', icon: , role: 'Standards & Disclaimers', description: 'Ensures compliance with all regulatory requirements.' diff --git a/frontend/components/FeedbackReport.tsx b/frontend/components/FeedbackReport.tsx index 8659e3b..858af61 100755 --- a/frontend/components/FeedbackReport.tsx +++ b/frontend/components/FeedbackReport.tsx @@ -871,7 +871,7 @@ export const FeedbackReport: React.FC<{ }; const agentReviews = [ - { title: 'Legal Agent', review: feedback.legalAgentReview }, + { title: 'Risk & Control Agent', review: feedback.legalAgentReview }, { title: 'Brand Agent', review: feedback.brandAgentReview }, { title: 'Channel Best Practices Agent', review: feedback.channelBestPracticesAgentReview }, { title: 'Channel Tech Specs Agent', review: feedback.channelTechSpecsAgentReview }, diff --git a/frontend/components/PDFReport.tsx b/frontend/components/PDFReport.tsx index c94af27..ea82196 100755 --- a/frontend/components/PDFReport.tsx +++ b/frontend/components/PDFReport.tsx @@ -165,7 +165,7 @@ export const PDFReport: React.FC = ({ campaignName, proofs }) => const feedback: AgentReview = version.feedback; const agentReviews = [ - { title: 'Legal Agent', review: feedback.legalAgentReview, icon: }, + { title: 'Risk & Control Agent', review: feedback.legalAgentReview, icon: }, { title: 'Brand Agent', review: feedback.brandAgentReview, icon: }, { title: 'Channel Best Practices Agent', review: feedback.channelBestPracticesAgentReview, icon: }, { title: 'Channel Tech Specs Agent', review: feedback.channelTechSpecsAgentReview, icon: }, diff --git a/frontend/components/Projects.tsx b/frontend/components/Projects.tsx index 6d71986..2855e7c 100755 --- a/frontend/components/Projects.tsx +++ b/frontend/components/Projects.tsx @@ -490,7 +490,7 @@ const AnalysisErrorModal: React.FC<{ if (!isOpen || !feedback) return null; const agentEntries: { label: string; review: { ragStatus: string; feedback: string } }[] = [ - { label: 'Legal Agent', review: feedback.legalAgentReview }, + { label: 'Risk & Control Agent', review: feedback.legalAgentReview }, { label: 'Brand Agent', review: feedback.brandAgentReview }, { label: 'Channel Best Practices Agent', review: feedback.channelBestPracticesAgentReview }, { label: 'Channel Tech Specs Agent', review: feedback.channelTechSpecsAgentReview }, diff --git a/frontend/components/StatusDashboard.tsx b/frontend/components/StatusDashboard.tsx index 4917750..4127d02 100755 --- a/frontend/components/StatusDashboard.tsx +++ b/frontend/components/StatusDashboard.tsx @@ -19,7 +19,7 @@ interface StatusInfoProps { // FIX: Storing components instead of instantiated elements to avoid React.cloneElement type issues. const agentIcons: Record>> = { - 'Legal Agent': LegalIcon, + 'Risk & Control Agent': LegalIcon, 'Brand Agent': BrandIcon, 'Channel Best Practices Agent': ChannelIcon, 'Channel Tech Specs Agent': ChannelIcon, diff --git a/frontend/constants.ts b/frontend/constants.ts index fc5554c..0216722 100755 --- a/frontend/constants.ts +++ b/frontend/constants.ts @@ -1,4 +1,4 @@ import type { AgentName } from './types'; -export const AGENT_NAMES: AgentName[] = ['Legal Agent', 'Brand Agent', 'Channel Best Practices Agent', 'Channel Tech Specs Agent']; \ No newline at end of file +export const AGENT_NAMES: AgentName[] = ['Risk & Control Agent', 'Brand Agent', 'Channel Best Practices Agent', 'Channel Tech Specs Agent']; \ No newline at end of file diff --git a/frontend/types.ts b/frontend/types.ts index d700561..77a98cb 100755 --- a/frontend/types.ts +++ b/frontend/types.ts @@ -1,5 +1,5 @@ // Fix: Broke a circular dependency by defining the AgentName type directly in this file instead of importing it. -export type AgentName = 'Legal Agent' | 'Brand Agent' | 'Channel Best Practices Agent' | 'Channel Tech Specs Agent'; +export type AgentName = 'Risk & Control Agent' | 'Brand Agent' | 'Channel Best Practices Agent' | 'Channel Tech Specs Agent'; // RBAC types export type UserRole = 'super_admin' | 'oversight_admin' | 'agency_admin' | 'basic_user';