From aeab7d3b187f6dc0cf85dda208baeef3eb012567 Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Thu, 14 May 2026 15:10:32 +0100 Subject: [PATCH] Rename Legal Agent to Risk & Control Agent across frontend and backend Updates all display labels (PDF report, campaign page, Knowledge Base card, analytics, status dashboard, checks overview) and aligns internal agent name in backend. Adds migration 010 to update the knowledge base display_name in production DB. Co-Authored-By: Claude Sonnet 4.6 --- .../versions/006_add_knowledge_base.py | 2 +- .../010_rename_legal_kb_to_risk_control.py | 29 +++++++++++++++++++ backend/app/agents/lead_agent.py | 6 ++-- backend/app/agents/legal_agent.py | 2 +- backend/app/main.py | 2 +- backend/app/services/analysis_service.py | 8 ++--- frontend/components/Analytics.tsx | 2 +- frontend/components/Campaigns.tsx | 2 +- frontend/components/ChecksOverview.tsx | 2 +- frontend/components/FeedbackReport.tsx | 2 +- frontend/components/PDFReport.tsx | 2 +- frontend/components/Projects.tsx | 2 +- frontend/components/StatusDashboard.tsx | 2 +- frontend/constants.ts | 2 +- frontend/types.ts | 2 +- 15 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 backend/alembic/versions/010_rename_legal_kb_to_risk_control.py 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';