Control Objective Management

SkillDev tools

Manage control objectives including creation, assessment, effectiveness evaluation, regulatory mapping, and gap identification across SOX, GDPR, and HIPAA frameworks

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 Control Objective Management skill

What this skill tells your AI

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

Overview

This skill provides comprehensive management of compliance control objectives in ServiceNow GRC. It covers:

  • Creating and updating control objectives with regulatory context
  • Assessing control effectiveness through testing and evidence review
  • Mapping control objectives to SOX, GDPR, HIPAA, and other regulatory requirements
  • Identifying control gaps where objectives lack adequate controls or testing
  • Analyzing control coverage across profiles, policies, and citations
  • Generating control effectiveness reports for audit and compliance review

When to use:

  • When establishing or updating a control framework for regulatory compliance
  • During control effectiveness assessments and testing cycles
  • When mapping controls to new or changing regulatory requirements
  • To identify gaps in control coverage across business processes
  • When preparing for SOX, GDPR, HIPAA, or other regulatory audits
  • During annual control rationalization and optimization exercises

Prerequisites

  • Roles: sn_compliance.manager, sn_grc.manager, or admin
  • Plugins: com.sn_compliance, com.sn_grc
  • Access: Read/write to sn_compliance_control_objective, sn_compliance_control, sn_compliance_policy, sn_compliance_citation tables
  • Knowledge: Understanding of compliance frameworks (SOX, GDPR, HIPAA) and control design principles

Key Compliance Tables

TablePurposeKey Fields
sn_compliance_control_objectiveControl objectivesnumber, short_description, description, state, owner, policy, framework, effectiveness
sn_compliance_controlControls implementing objectivesnumber, short_description, state, control_objective, owner, effectiveness, test_result, test_date, profile
sn_compliance_policyCompliance policiesnumber, short_description, state, owner, policy_statement, effective_date
sn_compliance_citationRegulatory citationsnumber, short_description, reference, regulation, authority, citation_text
sn_compliance_taskCompliance tasksnumber, short_description, state, assigned_to, due_date, control
sn_grc_profileGRC entity profilesnumber, short_description, profile_type, applies_to

Procedure

Step 1: Retrieve Existing Control Objectives

Query current control objectives to understand the baseline framework.

Using MCP (Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control_objective
  query: active=true^ORDERBYnumber
  fields: sys_id,number,short_description,description,state,owner,policy,framework,effectiveness,sys_created_on,sys_updated_on
  limit: 100

Using REST API:

GET /api/now/table/sn_compliance_control_objective?sysparm_query=active=true^ORDERBYnumber&sysparm_fields=sys_id,number,short_description,description,state,owner,policy,framework,effectiveness&sysparm_limit=100

Step 2: Create a New Control Objective

Using MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sn_compliance_control_objective
  fields:
    short_description: "Ensure access to personal data is restricted to authorized personnel"
    description: "Control objective to verify that access controls are in place to restrict personal data access per GDPR Article 25 and Article 32 requirements. Includes role-based access, least privilege enforcement, and periodic access reviews."
    owner: [owner_sys_id]
    policy: [policy_sys_id]
    state: draft
    framework: GDPR

Using REST API:

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

{
  "short_description": "Ensure access to personal data is restricted to authorized personnel",
  "description": "Control objective to verify access controls per GDPR Article 25 and 32.",
  "owner": "[owner_sys_id]",
  "policy": "[policy_sys_id]",
  "state": "draft",
  "framework": "GDPR"
}

Step 3: Map Control Objectives to Regulatory Citations

Query existing citations for mapping:

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

Map objectives to SOX citations:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_citation
  query: active=true^regulationLIKESOX^ORregulationLIKESarbanes
  fields: sys_id,number,short_description,reference,regulation,authority
  limit: 50

Map objectives to HIPAA citations:

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

Step 4: Assess Control Effectiveness

Query controls and their test results for a specific objective:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control
  query: control_objective=[objective_sys_id]^active=true
  fields: sys_id,number,short_description,state,effectiveness,test_result,test_date,owner,profile
  limit: 50

Generate effectiveness assessment across all objectives:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var assessment = {
      generated_date: new GlideDateTime().toString(),
      total_objectives: 0,
      effectiveness_summary: { effective: 0, partially_effective: 0, ineffective: 0, not_tested: 0 },
      by_framework: {},
      objectives_detail: []
    };

    var obj = new GlideRecord('sn_compliance_control_objective');
    obj.addQuery('active', true);
    obj.query();

    while (obj.next()) {
      assessment.total_objectives++;

      var framework = obj.framework.getDisplayValue() || 'General';
      if (!assessment.by_framework[framework]) {
        assessment.by_framework[framework] = { total: 0, effective: 0, gaps: 0 };
      }
      assessment.by_framework[framework].total++;

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

      var totalControls = 0, passingControls = 0, failingControls = 0, untestedControls = 0;
      while (ctrl.next()) {
        totalControls++;
        var testResult = ctrl.test_result.getDisplayValue().toLowerCase();
        var state = ctrl.state.getDisplayValue().toLowerCase();

        if (testResult === 'pass' || state === 'compliant') passingControls++;
        else if (testResult === 'fail' || state === 'non-compliant') failingControls++;
        else untestedControls++;
      }

      // Determine effectiveness
      var effectiveness = 'Not Tested';
      if (totalControls === 0) {
        effectiveness = 'No Controls';
      } else if (failingControls === 0 && untestedControls === 0) {
        effectiveness = 'Effective';
        assessment.effectiveness_summary.effective++;
        assessment.by_framework[framework].effective++;
      } else if (failingControls === 0 && passingControls > 0) {
        effectiveness = 'Partially Effective';
        assessment.effectiveness_summary.partially_effective++;
      } else if (failingControls > 0) {
        effectiveness = 'Ineffective';
        assessment.effectiveness_summary.ineffective++;
        assessment.by_framework[framework].gaps++;
      } else {
        assessment.effectiveness_summary.not_tested++;
      }

      assessment.objectives_detail.push({
        number: obj.number.toString(),
        title: obj.short_description.toString(),
        framework: framework,
        total_controls: totalControls,
        passing: passingControls,
        failing: failingControls,
        untested: untestedControls,
        effectiveness: effectiveness
      });
    }

    gs.info('CONTROL EFFECTIVENESS ASSESSMENT:\n' + JSON.stringify(assessment, null, 2));
  description: "GRC: Assess control effectiveness across all objectives"

Step 5: Identify Control Gaps

Find objectives without adequate control coverage:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var gaps = [];

    var obj = new GlideRecord('sn_compliance_control_objective');
    obj.addQuery('active', true);
    obj.query();

    while (obj.next()) {
      var ctrl = new GlideAggregate('sn_compliance_control');
      ctrl.addQuery('control_objective', obj.sys_id.toString());
      ctrl.addQuery('active', true);
      ctrl.addAggregate('COUNT');
      ctrl.query();

      var controlCount = 0;
      if (ctrl.next()) controlCount = parseInt(ctrl.getAggregate('COUNT'));

      // Gap: No controls or all controls failing
      if (controlCount === 0) {
        gaps.push({
          type: 'NO_CONTROLS',
          objective_number: obj.number.toString(),
          objective_title: obj.short_description.toString(),
          framework: obj.framework.getDisplayValue() || 'General',
          owner: obj.owner.getDisplayValue(),
          severity: 'CRITICAL',
          recommendation: 'Design and implement controls to address this objective'
        });
      } else {
        // Check for all-failing scenario
        var failCtrl = new GlideAggregate('sn_compliance_control');
        failCtrl.addQuery('control_objective', obj.sys_id.toString());
        failCtrl.addQuery('active', true);
        failCtrl.addQuery('state', 'NOT IN', 'compliant,passed');
        failCtrl.addAggregate('COUNT');
        failCtrl.query();

        var failCount = 0;
        if (failCtrl.next()) failCount = parseInt(failCtrl.getAggregate('COUNT'));

        if (failCount === controlCount) {
          gaps.push({
            type: 'ALL_CONTROLS_FAILING',
            objective_number: obj.number.toString(),
            objective_title: obj.short_description.toString(),
            framework: obj.framework.getDisplayValue() || 'General',
            total_controls: controlCount,
            failing_controls: failCount,
            severity: 'HIGH',
            recommendation: 'All controls ineffective; redesign control approach or add compensating controls'
          });
        }

        // Check for stale testing (no test in last 180 days)
        var staleCtrl = new GlideRecord('sn_compliance_control');
        staleCtrl.addQuery('control_objective', obj.sys_id.toString());
        staleCtrl.addQuery('active', true);
        staleCtrl.addQuery('test_date', '<', gs.daysAgo(180));
        staleCtrl.query();
        var staleCount = staleCtrl.getRowCount();

        if (staleCount > 0) {
          gaps.push({
            type: 'STALE_TESTING',
            objective_number: obj.number.toString(),
            objective_title: obj.short_description.toString(),
            framework: obj.framework.getDisplayValue() || 'General',
            stale_controls: staleCount,
            severity: 'MEDIUM',
            recommendation: 'Schedule control re-testing; ' + staleCount + ' controls not tested in 180+ days'
          });
        }
      }
    }

    gaps.sort(function(a, b) {
      var sevOrder = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3 };
      return (sevOrder[a.severity] || 3) - (sevOrder[b.severity] || 3);
    });

    gs.info('CONTROL GAPS IDENTIFIED: ' + gaps.length + '\n' + JSON.stringify(gaps, null, 2));
  description: "GRC: Identify control gaps across all objectives"

Step 6: Update Control Objective with Assessment Results

Using MCP:

Tool: SN-Update-Record
Parameters:
  table_name: sn_compliance_control_objective
  sys_id: [objective_sys_id]
  fields:
    effectiveness: effective
    work_notes: |
      === CONTROL EFFECTIVENESS ASSESSMENT ===
      Assessment Date: 2026-03-19
      Total Controls: 5
      Passing: 4 (80%)
      Failing: 0
      Untested: 1
      Overall Effectiveness: Effective

      Regulatory Mapping: SOX Section 404, GDPR Article 32
      Next Review: 2026-06-19
    state: reviewed

Using REST API:

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

{
  "effectiveness": "effective",
  "work_notes": "Control effectiveness assessment completed. 4/5 controls passing.",
  "state": "reviewed"
}

Step 7: Create Compliance Tasks for Gap Remediation

Using MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sn_compliance_task
  fields:
    short_description: "Design controls for unaddressed control objective CO0001456"
    description: "Control objective CO0001456 has no implementing controls. Design and implement at least one preventive and one detective control. Map to GDPR Article 32 requirements for data processing security."
    assigned_to: [control_owner_sys_id]
    due_date: 2026-05-01
    priority: 2
    state: 1

Using REST API:

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

{
  "short_description": "Design controls for unaddressed control objective CO0001456",
  "description": "No implementing controls exist. Design preventive and detective controls.",
  "assigned_to": "[owner_sys_id]",
  "due_date": "2026-05-01",
  "priority": "2",
  "state": "1"
}

Regulatory Framework Context

SOX (Sarbanes-Oxley Act)

SectionControl Objective FocusKey Fields
Section 302CEO/CFO certification of financial controlsDisclosure controls, material weakness
Section 404Internal control over financial reporting (ICFR)Control design, operating effectiveness
Section 409Real-time disclosure of material changesMonitoring controls, event-driven assessments

GDPR (General Data Protection Regulation)

ArticleControl Objective FocusKey Fields
Article 25Data protection by design and defaultPrivacy controls, data minimization
Article 30Records of processing activitiesProcessing inventory controls
Article 32Security of processingTechnical and organizational measures
Article 35Data protection impact assessmentDPIA process controls

HIPAA (Health Insurance Portability and Accountability Act)

RuleControl Objective FocusKey Fields
164.312(a)Access controlsUnique user ID, emergency access, auto-logoff
164.312(c)Integrity controlsMechanism to authenticate ePHI
164.312(d)AuthenticationPerson or entity authentication
164.312(e)Transmission securityEncryption, integrity controls

Tool Usage

OperationMCP ToolREST Endpoint
Query ObjectivesSN-Query-TableGET /api/now/table/sn_compliance_control_objective
Create ObjectiveSN-Create-RecordPOST /api/now/table/sn_compliance_control_objective
Update ObjectiveSN-Update-RecordPATCH /api/now/table/sn_compliance_control_objective
Query ControlsSN-Query-TableGET /api/now/table/sn_compliance_control
Query CitationsSN-Query-TableGET /api/now/table/sn_compliance_citation
Gap AnalysisSN-Execute-Background-ScriptPOST /api/now/table/sys_trigger
Schema DiscoverySN-Discover-Table-SchemaGET /api/now/table/sys_dictionary

Best Practices

  • Framework Alignment: Always map objectives to specific regulatory articles or sections, not just framework names
  • Control Layering: Each objective should have both preventive and detective controls for defense in depth
  • Testing Cadence: Establish risk-based testing frequencies -- critical controls quarterly, standard controls annually
  • Gap Prioritization: Prioritize gaps by regulatory exposure and business impact, not just count
  • Ownership Model: Assign both a control objective owner (strategic) and control owners (operational)
  • Evidence Standards: Define acceptable evidence types for each control before testing begins
  • Cross-Framework Mapping: Identify controls satisfying multiple frameworks to reduce duplication

Troubleshooting

Control Objective Table Not Found

Symptom: Query to sn_compliance_control_objective returns table not found error Cause: The Compliance plugin may not be activated or may use a different table name Solution:

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

If not found, check for alternative tables like sn_compliance_objective or sn_grc_control_objective. Verify com.sn_compliance plugin is active.

Framework Field Not Available

Symptom: The framework field does not exist on control objective records Cause: Framework tracking may use a reference field to a separate framework table or a custom field Solution: Check the schema for fields like regulation, compliance_framework, or a reference to sn_compliance_citation. Use category or policy reference as an alternative grouping mechanism.

Control-to-Objective Link Missing

Symptom: Controls exist but are not linked to control objectives Cause: The control_objective reference field on sn_compliance_control may not be populated Solution: Check if controls are linked via sn_grc_item or through a many-to-many relationship table. Query sn_grc_m2m_control_objective_control if it exists.

Examples

Example 1: SOX 404 Control Objective Assessment

Scenario: Preparing for annual SOX audit, need to assess ICFR control objectives

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control_objective
  query: 123TEXTQUERY321=SOX Section 404 internal control financial reporting
  limit: 30

Assessment Output:

  • Total SOX Objectives: 24
  • Effective: 18 (75%)
  • Partially Effective: 4 (17%) -- untested controls pending Q1 review
  • Ineffective: 1 (4%) -- segregation of duties control failure
  • No Controls: 1 (4%) -- new objective added for IT general controls
  • Key Gap: CO0002341 - "IT change management controls over financial systems" has no implementing controls
  • Action Required: Create 2 compliance tasks for gap remediation before audit fieldwork

Example 2: GDPR Control Coverage Analysis

Scenario: DPO needs to verify control coverage for GDPR compliance

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control_objective
  query: active=true^frameworkLIKEGDPR^ORdescriptionLIKEGDPR
  fields: sys_id,number,short_description,state,effectiveness,owner
  limit: 50

Coverage Report:

  • GDPR Objectives Defined: 15
  • With Active Controls: 12 (80% coverage)
  • Fully Effective: 9 (60%)
  • Gaps Identified:
    1. Article 17 (Right to Erasure) -- no automated deletion control
    2. Article 20 (Data Portability) -- export mechanism untested
    3. Article 35 (DPIA) -- process control not yet implemented
  • Recommendation: Prioritize Article 17 gap as it carries highest regulatory fine risk

Related Skills

  • grc/issue-action-plan - Remediate issues arising from control failures
  • grc/issue-summarization - Summarize issues linked to control gaps
  • grc/risk-assessment-summarization - Assess risks mitigated by controls
  • grc/regulatory-alert-analysis - Track regulatory changes affecting control requirements
  • security/audit-compliance - Audit trail for control testing evidence

References

Signals

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