Regulatory Alert Analysis

SkillMonitoring & ops

Analyze regulatory alerts for business impact, identify affected policies, controls, and citations, and generate impact assessments with recommended actions for compliance teams

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Regulatory Alert Analysis skill

What this skill tells your AI

The instructions your AI receives, as published by happy-technologies-llc/happy-platform-skills in skills/grc/regulatory-alert-analysis/SKILL.md and read by ahel’s review.

Overview

This skill analyzes regulatory alerts in ServiceNow GRC to assess their business impact and drive compliance response. It covers:

  • Retrieving and triaging incoming regulatory alerts by urgency and scope
  • Identifying policies, controls, and citations affected by regulatory changes
  • Generating structured impact assessments for compliance leadership
  • Creating regulatory change tasks to track required updates
  • Mapping alerts to existing compliance frameworks and control objectives
  • Producing recommended action plans for the compliance team

When to use:

  • When new regulatory alerts arrive requiring impact analysis
  • During regulatory landscape monitoring and horizon scanning
  • When regulations change and existing compliance programs need updating
  • Before compliance committee meetings to present regulatory developments
  • When assessing whether new regulations require new controls or policy updates

Prerequisites

  • Roles: sn_compliance.manager, sn_grc.manager, or admin
  • Plugins: com.sn_compliance, com.sn_grc
  • Access: Read/write to sn_regulatory_alert, sn_regulatory_change_task, sn_compliance_policy, sn_compliance_citation tables
  • Knowledge: Understanding of applicable regulatory landscape and organizational compliance obligations

Key Regulatory Tables

TablePurposeKey Fields
sn_regulatory_alertIncoming regulatory alertsnumber, short_description, description, state, priority, regulation, authority, effective_date, alert_type, impact_level
sn_regulatory_change_taskTasks to implement regulatory changesnumber, short_description, state, assigned_to, due_date, alert, change_type
sn_compliance_policyCompliance policies potentially affectednumber, short_description, state, owner, policy_statement, effective_date
sn_compliance_citationRegulatory citations requiring updatenumber, short_description, reference, regulation, authority, citation_text
sn_compliance_controlControls affected by regulatory changesnumber, short_description, state, control_objective, owner, effectiveness
sn_compliance_control_objectiveControl objectives requiring revisionnumber, short_description, framework, effectiveness, owner

Procedure

Step 1: Retrieve Pending Regulatory Alerts

Query unprocessed or recently received regulatory alerts.

Using MCP (Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sn_regulatory_alert
  query: active=true^stateIN1,2^ORDERBYDESCpriority
  fields: sys_id,number,short_description,description,state,priority,regulation,authority,effective_date,alert_type,impact_level,sys_created_on
  limit: 50

Using REST API:

GET /api/now/table/sn_regulatory_alert?sysparm_query=active=true^stateIN1,2^ORDERBYDESCpriority&sysparm_fields=sys_id,number,short_description,description,state,priority,regulation,authority,effective_date,alert_type,impact_level&sysparm_limit=50

Step 2: Identify Affected Citations and Regulations

For each alert, find existing citations that reference the same regulation or authority.

Using MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_citation
  query: active=true^regulationLIKE[regulation_name]
  fields: sys_id,number,short_description,reference,regulation,authority,citation_text
  limit: 50

Search by authority (e.g., SEC, CNIL, HHS):

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_citation
  query: active=true^authorityLIKE[authority_name]
  fields: sys_id,number,short_description,reference,regulation,authority,citation_text
  limit: 50

Using REST API:

GET /api/now/table/sn_compliance_citation?sysparm_query=active=true^regulationLIKE[regulation_name]&sysparm_fields=sys_id,number,short_description,reference,regulation,authority,citation_text&sysparm_limit=50

Step 3: Identify Affected Policies

Find policies linked to the affected regulation:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_policy
  query: active=true^short_descriptionLIKE[regulation_keyword]^ORdescriptionLIKE[regulation_keyword]
  limit: 25

Structured query for policy impact:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_policy
  query: active=true^short_descriptionLIKE[regulation_keyword]^ORdescriptionLIKE[regulation_keyword]
  fields: sys_id,number,short_description,state,owner,policy_statement,effective_date
  limit: 30

Step 4: Identify Affected Controls and Objectives

Query controls related to the affected regulation:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var regulationKeyword = 'GDPR'; // Replace with target regulation
    var affected = {
      controls: [],
      objectives: [],
      total_controls: 0,
      total_objectives: 0
    };

    // Find affected control objectives
    var obj = new GlideRecord('sn_compliance_control_objective');
    obj.addQuery('active', true);
    obj.addEncodedQuery('short_descriptionLIKE' + regulationKeyword + '^ORdescriptionLIKE' + regulationKeyword + '^ORframeworkLIKE' + regulationKeyword);
    obj.query();

    while (obj.next()) {
      affected.total_objectives++;
      affected.objectives.push({
        number: obj.number.toString(),
        title: obj.short_description.toString(),
        framework: obj.framework.getDisplayValue() || '',
        effectiveness: obj.effectiveness.getDisplayValue() || 'Not Assessed',
        owner: obj.owner.getDisplayValue()
      });

      // Find controls for each objective
      var ctrl = new GlideRecord('sn_compliance_control');
      ctrl.addQuery('control_objective', obj.sys_id.toString());
      ctrl.addQuery('active', true);
      ctrl.query();

      while (ctrl.next()) {
        affected.total_controls++;
        affected.controls.push({
          number: ctrl.number.toString(),
          title: ctrl.short_description.toString(),
          state: ctrl.state.getDisplayValue(),
          effectiveness: ctrl.effectiveness.getDisplayValue() || '',
          objective: obj.number.toString(),
          owner: ctrl.owner.getDisplayValue()
        });
      }
    }

    gs.info('AFFECTED CONTROLS AND OBJECTIVES:\n' + JSON.stringify(affected, null, 2));
  description: "GRC: Identify controls and objectives affected by a regulatory change"

Step 5: Generate Impact Assessment

Produce a structured impact assessment for the compliance team:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var alertNumber = 'REG0001234'; // Replace with target alert
    var gr = new GlideRecord('sn_regulatory_alert');
    gr.addQuery('number', alertNumber);
    gr.query();

    if (gr.next()) {
      var assessment = {
        alert: {
          number: gr.number.toString(),
          title: gr.short_description.toString(),
          description: gr.description.toString(),
          regulation: gr.regulation.getDisplayValue() || gr.regulation.toString(),
          authority: gr.authority.getDisplayValue() || gr.authority.toString(),
          effective_date: gr.effective_date.toString(),
          priority: gr.priority.getDisplayValue(),
          impact_level: gr.impact_level.getDisplayValue() || ''
        },
        impact_analysis: {
          affected_citations: 0,
          affected_policies: 0,
          affected_controls: 0,
          affected_objectives: 0,
          affected_profiles: 0
        },
        affected_citations: [],
        affected_policies: [],
        compliance_gaps: [],
        recommended_actions: [],
        timeline: {}
      };

      var regName = gr.regulation.toString() || gr.short_description.toString();

      // Count affected citations
      var cite = new GlideRecord('sn_compliance_citation');
      cite.addEncodedQuery('regulationLIKE' + regName + '^ORauthorityLIKE' + regName);
      cite.addQuery('active', true);
      cite.query();
      while (cite.next()) {
        assessment.impact_analysis.affected_citations++;
        assessment.affected_citations.push({
          number: cite.number.toString(),
          reference: cite.reference.toString(),
          title: cite.short_description.toString()
        });
      }

      // Count affected policies
      var pol = new GlideRecord('sn_compliance_policy');
      pol.addEncodedQuery('short_descriptionLIKE' + regName + '^ORdescriptionLIKE' + regName);
      pol.addQuery('active', true);
      pol.query();
      while (pol.next()) {
        assessment.impact_analysis.affected_policies++;
        assessment.affected_policies.push({
          number: pol.number.toString(),
          title: pol.short_description.toString(),
          owner: pol.owner.getDisplayValue(),
          state: pol.state.getDisplayValue()
        });
      }

      // Count affected controls
      var ctrl = new GlideAggregate('sn_compliance_control');
      ctrl.addEncodedQuery('short_descriptionLIKE' + regName + '^ORdescriptionLIKE' + regName);
      ctrl.addQuery('active', true);
      ctrl.addAggregate('COUNT');
      ctrl.query();
      if (ctrl.next()) assessment.impact_analysis.affected_controls = parseInt(ctrl.getAggregate('COUNT'));

      // Determine impact level and timeline
      var priority = parseInt(gr.priority) || 3;
      var effectiveDate = gr.effective_date.toString();

      if (priority <= 2 || assessment.impact_analysis.affected_policies >= 3) {
        assessment.timeline = {
          impact_level: 'HIGH',
          initial_review_days: 5,
          policy_update_days: 30,
          control_update_days: 60,
          full_compliance_days: 90,
          escalation: 'Immediate notification to Chief Compliance Officer and General Counsel'
        };
      } else if (priority == 3) {
        assessment.timeline = {
          impact_level: 'MEDIUM',
          initial_review_days: 10,
          policy_update_days: 60,
          control_update_days: 90,
          full_compliance_days: 120,
          escalation: 'Include in next compliance committee agenda'
        };
      } else {
        assessment.timeline = {
          impact_level: 'LOW',
          initial_review_days: 30,
          policy_update_days: 90,
          control_update_days: 120,
          full_compliance_days: 180,
          escalation: 'Standard quarterly reporting'
        };
      }

      // Generate recommended actions
      if (assessment.impact_analysis.affected_citations > 0) {
        assessment.recommended_actions.push('Review and update ' + assessment.impact_analysis.affected_citations + ' affected citations to reflect new regulatory language');
      }
      if (assessment.impact_analysis.affected_policies > 0) {
        assessment.recommended_actions.push('Revise ' + assessment.impact_analysis.affected_policies + ' policies to align with updated regulatory requirements');
      }
      if (assessment.impact_analysis.affected_controls > 0) {
        assessment.recommended_actions.push('Reassess ' + assessment.impact_analysis.affected_controls + ' controls for continued effectiveness under new requirements');
      }
      if (assessment.impact_analysis.affected_citations === 0) {
        assessment.recommended_actions.push('Create new compliance citations to capture this regulatory requirement');
      }
      assessment.recommended_actions.push('Conduct training and awareness for affected control owners');
      assessment.recommended_actions.push('Schedule post-implementation review to verify compliance');

      gs.info('REGULATORY IMPACT ASSESSMENT:\n' + JSON.stringify(assessment, null, 2));
    }
  description: "GRC: Generate regulatory alert impact assessment"

Step 6: Create Regulatory Change Tasks

Create tasks to track compliance response activities:

Using MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sn_regulatory_change_task
  fields:
    short_description: "Update data privacy policies for GDPR amendment on AI processing"
    description: "Review and update all data privacy policies to address new GDPR requirements for AI-based data processing. Ensure updated policies reference new Article 22a requirements for algorithmic transparency."
    assigned_to: [compliance_manager_sys_id]
    due_date: 2026-05-15
    priority: 2
    state: 1
    alert: [regulatory_alert_sys_id]
    change_type: policy_update

Using REST API:

POST /api/now/table/sn_regulatory_change_task
Content-Type: application/json

{
  "short_description": "Update data privacy policies for GDPR amendment on AI processing",
  "description": "Review and update data privacy policies for new GDPR AI processing requirements.",
  "assigned_to": "[user_sys_id]",
  "due_date": "2026-05-15",
  "priority": "2",
  "state": "1",
  "alert": "[alert_sys_id]"
}

Create additional tasks for control updates:

Tool: SN-Create-Record
Parameters:
  table_name: sn_regulatory_change_task
  fields:
    short_description: "Reassess access controls for updated GDPR AI transparency requirements"
    description: "Evaluate existing access controls and data processing controls against new GDPR AI requirements. Design additional controls if gaps are identified. Update control testing procedures."
    assigned_to: [control_owner_sys_id]
    due_date: 2026-06-30
    priority: 2
    state: 1
    alert: [regulatory_alert_sys_id]
    change_type: control_update

Step 7: Update Alert with Assessment Results

Using MCP:

Tool: SN-Update-Record
Parameters:
  table_name: sn_regulatory_alert
  sys_id: [alert_sys_id]
  fields:
    work_notes: |
      === IMPACT ASSESSMENT COMPLETED ===
      Assessment Date: 2026-03-19
      Impact Level: HIGH

      Affected Components:
      - Citations: 4 existing citations require update
      - Policies: 2 policies require revision
      - Controls: 8 controls require reassessment
      - Objectives: 3 control objectives may need update

      Regulatory Change Tasks Created: 3
      Target Compliance Date: 2026-06-30
      Escalation: CCO and General Counsel notified

      Recommended Actions:
      1. Update citations with new regulatory language
      2. Revise affected policies within 30 days
      3. Reassess controls within 60 days
      4. Conduct control owner training
    state: 3

Using REST API:

PATCH /api/now/table/sn_regulatory_alert/[sys_id]
Content-Type: application/json

{
  "work_notes": "Impact assessment completed. HIGH impact. 3 change tasks created.",
  "state": "3"
}

Step 8: Generate Regulatory Landscape Dashboard Data

Produce aggregate data for compliance dashboard:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var dashboard = {
      generated_date: new GlideDateTime().toString(),
      alert_summary: { total_open: 0, high_impact: 0, medium_impact: 0, low_impact: 0, overdue: 0 },
      by_regulation: {},
      by_authority: {},
      pending_tasks: { total: 0, overdue: 0 },
      recent_alerts: []
    };

    var now = new GlideDateTime();

    // Alert overview
    var gr = new GlideRecord('sn_regulatory_alert');
    gr.addQuery('active', true);
    gr.orderByDesc('sys_created_on');
    gr.query();

    while (gr.next()) {
      dashboard.alert_summary.total_open++;

      var pri = parseInt(gr.priority) || 3;
      if (pri <= 2) dashboard.alert_summary.high_impact++;
      else if (pri == 3) dashboard.alert_summary.medium_impact++;
      else dashboard.alert_summary.low_impact++;

      // Regulation breakdown
      var reg = gr.regulation.getDisplayValue() || 'Unspecified';
      dashboard.by_regulation[reg] = (dashboard.by_regulation[reg] || 0) + 1;

      // Authority breakdown
      var auth = gr.authority.getDisplayValue() || 'Unspecified';
      dashboard.by_authority[auth] = (dashboard.by_authority[auth] || 0) + 1;

      // Recent alerts (top 5)
      if (dashboard.recent_alerts.length < 5) {
        dashboard.recent_alerts.push({
          number: gr.number.toString(),
          title: gr.short_description.toString(),
          regulation: reg,
          priority: gr.priority.getDisplayValue(),
          effective_date: gr.effective_date.toString(),
          created: gr.sys_created_on.toString()
        });
      }
    }

    // Pending regulatory change tasks
    var task = new GlideRecord('sn_regulatory_change_task');
    task.addQuery('active', true);
    task.query();
    while (task.next()) {
      dashboard.pending_tasks.total++;
      if (task.due_date.toString() && new GlideDateTime(task.due_date.toString()).compareTo(now) < 0) {
        dashboard.pending_tasks.overdue++;
      }
    }

    gs.info('REGULATORY LANDSCAPE DASHBOARD:\n' + JSON.stringify(dashboard, null, 2));
  description: "GRC: Generate regulatory landscape dashboard data"

Tool Usage

OperationMCP ToolREST Endpoint
Query AlertsSN-Query-TableGET /api/now/table/sn_regulatory_alert
Search AlertsSN-Natural-Language-SearchN/A
Query CitationsSN-Query-TableGET /api/now/table/sn_compliance_citation
Query PoliciesSN-Query-TableGET /api/now/table/sn_compliance_policy
Create Change TasksSN-Create-RecordPOST /api/now/table/sn_regulatory_change_task
Update AlertSN-Update-RecordPATCH /api/now/table/sn_regulatory_alert
Impact AnalysisSN-Execute-Background-ScriptPOST /api/now/table/sys_trigger
Schema DiscoverySN-Discover-Table-SchemaGET /api/now/table/sys_dictionary

Best Practices

  • Timely Triage: Process regulatory alerts within 48 hours of receipt; high-impact alerts within 24 hours
  • Regulatory Mapping: Always map alerts to specific citations and policies, not just general framework references
  • Effective Date Tracking: Prioritize based on compliance deadline proximity, not just severity
  • Stakeholder Communication: Notify affected policy and control owners immediately upon completing impact assessment
  • Cross-Regulation Analysis: Check if a single regulatory change affects multiple compliance frameworks
  • Evidence Preservation: Document the original alert text and assessment rationale in work notes for audit trail
  • Feedback Loop: After implementing changes, validate with legal counsel that the response adequately addresses the regulatory requirement

Troubleshooting

Regulatory Alert Table Not Found

Symptom: Query to sn_regulatory_alert returns table not found Cause: The table may be named differently or require an additional plugin Solution:

Tool: SN-Discover-Table-Schema
Parameters:
  table_name: sn_regulatory_alert

If not found, check for sn_compliance_alert, sn_grc_regulatory_alert, or sn_reg_change_alert. The Regulatory Change Management module may require com.sn_compliance_regulatory plugin.

No Citation Matches for Alert

Symptom: Impact analysis finds no matching citations for a regulatory alert Cause: Citations may not yet exist for the new regulation, or naming conventions differ Solution: Broaden the search to use keywords from the alert description rather than exact regulation name. If no citations exist, the recommended action should include creating new citation records.

Regulatory Change Task Table Unavailable

Symptom: Cannot create records in sn_regulatory_change_task Cause: The table may require additional plugin activation or use an alternative table Solution: Fall back to sn_compliance_task for tracking regulatory change activities. Set a category or tag field to distinguish regulatory change tasks from other compliance tasks.

Alert Effective Date Parsing Issues

Symptom: Effective date comparisons fail or return incorrect results Cause: Date format inconsistencies between alert source and ServiceNow internal format Solution: Use GlideDateTime for all date comparisons. If the effective_date field is a string rather than a date type, parse it before comparison.

Examples

Example 1: GDPR Amendment Impact Analysis

Scenario: New GDPR amendment on AI transparency requires analysis

Tool: SN-Query-Table
Parameters:
  table_name: sn_regulatory_alert
  query: 123TEXTQUERY321=GDPR artificial intelligence automated processing
  limit: 10

Impact Assessment Output:

  • Alert: REG0002341 - GDPR Amendment: AI Transparency Requirements
  • Authority: European Data Protection Board
  • Effective Date: 2026-09-01
  • Impact Level: HIGH
  • Affected Citations: 4 (Articles 13, 14, 15, 22)
  • Affected Policies: 2 (Data Privacy Policy, AI Ethics Policy)
  • Affected Controls: 6 (consent management, algorithmic transparency, data subject access)
  • Recommended Actions:
    1. Update privacy notices to include AI processing disclosures (by June 2026)
    2. Implement algorithmic impact assessment process (by July 2026)
    3. Revise data subject access request workflow for AI decisions (by August 2026)
    4. Train data processing teams on new requirements (by August 2026)

Example 2: Multi-Regulation Alert Triage

Scenario: Compliance team needs to triage a batch of recent regulatory alerts

Tool: SN-Query-Table
Parameters:
  table_name: sn_regulatory_alert
  query: active=true^state=1^ORDERBYpriority
  fields: sys_id,number,short_description,regulation,authority,priority,effective_date
  limit: 20

Triage Output:

AlertRegulationPriorityEffective DateAction
REG0002341GDPRCritical2026-09-01Full impact assessment required
REG0002342SOXHigh2026-07-01Review ICFR controls
REG0002343HIPAAHigh2026-08-15Update PHI handling procedures
REG0002344PCI-DSSMedium2026-12-01Schedule Q3 control review
REG0002345Local PrivacyLow2027-01-01Monitor; include in quarterly review

Related Skills

  • grc/control-objective-management - Update control objectives affected by regulatory changes
  • grc/issue-action-plan - Create action plans for compliance issues from regulatory gaps
  • grc/issue-summarization - Summarize issues created from regulatory alert findings
  • grc/risk-assessment-summarization - Assess risk impact of regulatory changes
  • security/audit-compliance - Audit trail for regulatory response activities

References

Signals

GitHub stars
37
Forks
13
Last commit
Jul 2026
Advanced
Catalog kind
skill
Gateway key
regulatory-alert-analysis
Source
github.com/happy-technologies-llc/happy-platform-skills