关于 issue-action-plan
此 ServiceNow GRC 技能为风险与合规问题制定结构化整改计划,面向 GRC 团队及审计响应场景。它关联风险、控制和责任人,并支持创建合规任务及保留审计记录。
主要功能
- 01检索并分析未结 GRC 问题
- 02按风险和合规影响排序
- 03生成整改步骤、责任人与期限
- 04定义可衡量的完成标准
- 05创建合规任务并记录计划
适用场景
- 01制定审计发现的整改方案
- 02安排合规缺口的纠正行动
- 03风险评审后规划问题处理优先级
MCP 相关
技能说明使用 ServiceNow MCP 工具查询 GRC 问题、风险和控制,创建合规任务,并更新问题记录以保留行动计划。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill issue-action-plan安装后在 Claude Code 中输入/issue-action-plan确认已加载。
详细介绍
GRC 问题行动计划生成
概述
此技能可为 ServiceNow 中的治理、风险与合规(GRC)问题生成结构化行动计划。内容包括:
- 检索并分析未解决的 GRC 问题及其关联的风险、控制措施和档案
- 根据风险评级、合规影响和业务关键性确定问题优先级
- 制定补救步骤,明确负责人和截止日期
- 定义可衡量的成功标准和验证检查点
- 创建合规任务以跟踪补救进度
- 生成可供审计的行动计划文档
适用场景:
- GRC 问题需要制定正式补救计划时
- 审计发现需要结构化响应计划时
- 合规差距需要记录纠正措施时
- 定期风险审查需要更新行动计划时
- 管理层要求制定优先级问题解决路线图时
先决条件
- 角色:
sn_grc.manager、sn_compliance.manager或admin - 插件:
com.sn_grc、com.sn_compliance、com.sn_risk - 访问权限: 对 sn_grc_issue、sn_compliance_task、sn_grc_risk 表具有读写权限
- 知识: 了解组织的风险承受能力和合规框架
GRC 关键表
| 表 | 用途 | 关键字段 |
|---|---|---|
sn_grc_issue | GRC 问题和发现 | number、short_description、state、priority、risk_rating、profile、item |
sn_grc_risk | 风险记录 | number、short_description、risk_score、state、treatment、profile |
sn_compliance_control | 合规控制措施 | number、short_description、state、control_objective、owner |
sn_compliance_task | 合规补救任务 | number、short_description、state、assigned_to、due_date |
sn_grc_item | GRC 内容项 | number、short_description、item_type、profile |
sn_grc_profile | GRC 实体档案 | number、short_description、profile_type、applies_to |
流程
步骤 1:检索未解决的 GRC 问题
查询所有未解决的 GRC 问题,并按风险评级和优先级排序。
使用 MCP(Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sn_grc_issue
query: active=true^stateIN1,2,3^ORDERBYDESCrisk_rating
fields: sys_id,number,short_description,description,state,priority,risk_rating,profile,item,assigned_to,due_date,category,sys_created_on
limit: 50
使用 REST API:
GET /api/now/table/sn_grc_issue?sysparm_query=active=true^stateIN1,2,3^ORDERBYDESCrisk_rating&sysparm_fields=sys_id,number,short_description,description,state,priority,risk_rating,profile,item,assigned_to,due_date,category&sysparm_limit=50
步骤 2:分析相关风险和控制措施
针对每个高优先级问题,检索相关风险和控制措施的背景信息。
获取相关风险:
Tool: SN-Query-Table
Parameters:
table_name: sn_grc_risk
query: profile=[issue_profile_sys_id]^active=true
fields: sys_id,number,short_description,risk_score,state,treatment,residual_risk,inherent_risk,category
limit: 20
获取相关控制措施:
Tool: SN-Query-Table
Parameters:
table_name: sn_compliance_control
query: profile=[issue_profile_sys_id]^active=true
fields: sys_id,number,short_description,state,control_objective,owner,effectiveness,test_result
limit: 20
使用 REST API:
GET /api/now/table/sn_grc_risk?sysparm_query=profile=[profile_sys_id]^active=true&sysparm_fields=sys_id,number,short_description,risk_score,state,treatment,residual_risk,inherent_risk&sysparm_limit=20
步骤 3:按风险和合规影响确定问题优先级
生成带评分的优先级问题列表:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var issues = [];
var gr = new GlideRecord('sn_grc_issue');
gr.addQuery('active', true);
gr.addQuery('state', 'IN', '1,2,3');
gr.orderByDesc('risk_rating');
gr.query();
while (gr.next()) {
var riskScore = 0;
var controlGaps = 0;
// Get associated risk score
var risk = new GlideRecord('sn_grc_risk');
risk.addQuery('profile', gr.profile.toString());
risk.addQuery('active', true);
risk.query();
while (risk.next()) {
var score = parseInt(risk.risk_score.toString()) || 0;
if (score > riskScore) riskScore = score;
}
// Count failing controls
var ctrl = new GlideRecord('sn_compliance_control');
ctrl.addQuery('profile', gr.profile.toString());
ctrl.addQuery('state', 'NOT IN', 'compliant,passed');
ctrl.query();
controlGaps = ctrl.getRowCount();
var compositeScore = (riskScore * 0.6) + (controlGaps * 10 * 0.2) + (parseInt(gr.risk_rating) || 0) * 20 * 0.2;
issues.push({
number: gr.number.toString(),
description: gr.short_description.toString(),
risk_rating: gr.risk_rating.toString(),
priority: gr.priority.toString(),
max_risk_score: riskScore,
control_gaps: controlGaps,
composite_score: Math.round(compositeScore),
profile: gr.profile.getDisplayValue(),
due_date: gr.due_date.toString()
});
}
issues.sort(function(a, b) { return b.composite_score - a.composite_score; });
gs.info('PRIORITIZED GRC ISSUES:\n' + JSON.stringify(issues.slice(0, 20), null, 2));
description: "GRC: Prioritize issues by composite risk and compliance score"
步骤 4:为问题生成行动计划
制定全面的补救行动计划:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var issueNumber = 'ISSUE0001234'; // Replace with target issue
var gr = new GlideRecord('sn_grc_issue');
gr.addQuery('number', issueNumber);
gr.query();
if (gr.next()) {
var plan = {
issue: {
number: gr.number.toString(),
description: gr.short_description.toString(),
detail: gr.description.toString(),
risk_rating: gr.risk_rating.toString(),
priority: gr.priority.toString(),
profile: gr.profile.getDisplayValue(),
current_state: gr.state.getDisplayValue()
},
related_risks: [],
affected_controls: [],
remediation_steps: [],
timeline: {},
success_criteria: []
};
// Gather related risks
var risk = new GlideRecord('sn_grc_risk');
risk.addQuery('profile', gr.profile.toString());
risk.addQuery('active', true);
risk.query();
while (risk.next()) {
plan.related_risks.push({
number: risk.number.toString(),
description: risk.short_description.toString(),
score: risk.risk_score.toString(),
treatment: risk.treatment.getDisplayValue()
});
}
// Gather affected controls
var ctrl = new GlideRecord('sn_compliance_control');
ctrl.addQuery('profile', gr.profile.toString());
ctrl.query();
while (ctrl.next()) {
plan.affected_controls.push({
number: ctrl.number.toString(),
description: ctrl.short_description.toString(),
state: ctrl.state.getDisplayValue(),
owner: ctrl.owner.getDisplayValue()
});
}
// Define timeline based on risk rating
var riskRating = parseInt(gr.risk_rating) || 3;
if (riskRating >= 4) {
plan.timeline = { target_days: 30, review_frequency: 'Weekly', escalation: 'Immediate executive notification' };
} else if (riskRating >= 3) {
plan.timeline = { target_days: 60, review_frequency: 'Bi-weekly', escalation: 'Management review within 48 hours' };
} else {
plan.timeline = { target_days: 90, review_frequency: 'Monthly', escalation: 'Standard reporting cycle' };
}
// Define success criteria
plan.success_criteria = [
'All related controls return to compliant state',
'Residual risk score reduced below organizational threshold',
'Remediation evidence documented and reviewed',
'Control owner sign-off obtained',
'Post-remediation testing completed successfully'
];
gs.info('ACTION PLAN:\n' + JSON.stringify(plan, null, 2));
}
description: "GRC: Generate comprehensive action plan for a specific issue"
步骤 5:创建补救合规任务
创建与问题关联的结构化补救任务:
使用 MCP:
Tool: SN-Create-Record
Parameters:
table_name: sn_compliance_task
fields:
short_description: "Remediate control gap identified in ISSUE0001234"
description: "Implement corrective action for control failure. Review control design and operating effectiveness. Document remediation evidence."
assigned_to: [responsible_user_sys_id]
due_date: 2026-04-30
priority: 2
state: 1
parent: [issue_sys_id]
使用 REST API:
POST /api/now/table/sn_compliance_task
Content-Type: application/json
{
"short_description": "Remediate control gap identified in ISSUE0001234",
"description": "Implement corrective action for control failure.",
"assigned_to": "[user_sys_id]",
"due_date": "2026-04-30",
"priority": "2",
"state": "1"
}
步骤 6:在问题中添加行动计划引用
使用 MCP:
Tool: SN-Update-Record
Parameters:
table_name: sn_grc_issue
sys_id: [issue_sys_id]
fields:
work_notes: |
=== ACTION PLAN GENERATED ===
Composite Risk Score: 85/100
Remediation Timeline: 30 days
Review Frequency: Weekly
Compliance Tasks Created: 3
Responsible Party: [Control Owner Name]
Success Criteria:
1. All related controls return to compliant state
2. Residual risk score reduced below threshold
3. Evidence documented and reviewed
4. Control owner sign-off obtained
state: 2
使用 REST API:
PATCH /api/now/table/sn_grc_issue/[sys_id]
Content-Type: application/json
{
"work_notes": "ACTION PLAN GENERATED - See compliance tasks for details",
"state": "2"
}
工具用法
| 操作 | MCP 工具 | REST 端点 |
|---|---|---|
| 查询问题 | SN-Query-Table | GET /api/now/table/sn_grc_issue |
| 搜索问题 | SN-Natural-Language-Search | N/A |
| 分析风险 | SN-Query-Table | GET /api/now/table/sn_grc_risk |
| 创建任务 | SN-Create-Record | POST /api/now/table/sn_compliance_task |
| 更新问题 | SN-Update-Record | PATCH /api/now/table/sn_grc_issue |
| 复杂分析 | SN-Execute-Background-Script | POST /api/now/table/sys_trigger |
| 架构发现 | SN-Discover-Table-Schema | GET /api/now/table/sys_dictionary |
最佳实践
- 基于风险的优先级排序: 始终根据综合风险评分而非单个问题的优先级来安排行动计划
- SMART 标准: 将成功标准定义为具体、可衡量、可实现、相关且有时限
- 明确责任归属: 每个补救步骤都必须由一名明确负责的人员承担,而不是由一个群体负责
- 证据要求: 明确必须收集哪些证据来证明补救工作已完成
- 升级途径: 为逾期或停滞的补救工作制定明确的升级流程
- 定期审查: 安排定期检查点,依据行动计划时间表核实进度
- 审计跟踪: 在工作备注中记录所有计划变更和决策,以做好审计准备
故障排除
查询未返回问题
症状: 查询活跃的 GRC 问题时返回空结果 原因: 问题可能使用自定义状态,或者 GRC 插件尚未完全激活 解决方案:
Tool: SN-Discover-Table-Schema
Parameters:
table_name: sn_grc_issue
确认 state 字段的选项,并相应调整查询筛选条件。
风险评级字段为空
症状: 问题缺少优先级排序所需的 risk_rating 值
原因: 尚未执行风险评估,或者 risk_rating 是一个计算字段
解决方案: 检查 risk_rating 是否通过风险评估工作流填充。查询 sn_risk_definition 表,以确认风险评分配置。
合规任务未关联到问题
症状: 创建的任务未显示在父问题下
原因: 父字段引用不正确,或者需要使用关系表
解决方案: 使用 sn_grc_item 作为中间表,或者检查问题与任务之间是否存在多对多关系表。
示例
示例 1:关键合规差距行动计划
场景: 审计发现揭示了影响 SOX 的关键访问控制故障
Tool: SN-Query-Table
Parameters:
table_name: sn_grc_issue
query: active=true^priority=1^risk_ratingIN1,2^123TEXTQUERY321=SOX
limit: 10
生成的行动计划:
- 问题: ISSUE0004521 - 财务审批中的职责分离违规
- 风险评分: 92/100
- 时间安排: 15 个工作日(加急)
- 步骤:
- 立即撤销冲突的角色分配(第 1 天)
- 在过渡期间实施补偿性控制(第 1 至 3 天)
- 重新设计审批工作流,确保适当分离(第 3 至 10 天)
- 使用示例交易测试新的工作流(第 10 至 12 天)
- 获得内部审计签字确认(第 12 至 15 天)
- 成功标准: 不存在冲突角色,所有测试交易均通过,并记录审计批准
示例 2:批量生成行动计划
场景: 季度风险审查后,为所有高优先级问题生成行动计划
Tool: SN-Execute-Background-Script
Parameters:
script: |
var gr = new GlideRecord('sn_grc_issue');
gr.addQuery('active', true);
gr.addQuery('priority', 'IN', '1,2');
gr.addQuery('state', '1'); // New issues only
gr.query();
var planCount = 0;
while (gr.next()) {
var task = new GlideRecord('sn_compliance_task');
task.initialize();
task.short_description = 'Action Plan: ' + gr.short_description.toString();
task.description = 'Remediation task for ' + gr.number.toString() + '. Review associated controls and implement corrective actions.';
task.priority = gr.priority.toString();
task.state = '1';
var daysToAdd = (gr.priority == '1') ? 30 : 60;
var dueDate = new GlideDateTime();
dueDate.addDaysUTC(daysToAdd);
task.due_date = dueDate;
task.insert();
planCount++;
// Update issue state to In Progress
gr.state = '2';
gr.work_notes = 'Action plan generated. Compliance task created with ' + daysToAdd + '-day remediation window.';
gr.update();
}
gs.info('Action plans generated for ' + planCount + ' issues');
description: "GRC: Bulk generate action plans for high-priority issues"
相关技能
grc/issue-summarization- 汇总 GRC 问题,用于高管报告grc/risk-assessment-summarization- 了解问题背后的风险背景grc/control-objective-management- 管理与问题关联的控制措施grc/regulatory-alert-analysis- 识别问题的监管驱动因素security/audit-compliance- 分析 GRC 调查的审计跟踪