关于 generate-talking-points
generate-talking-points 是面向管理者的 ServiceNow 人才管理技能,可汇总员工档案、目标、反馈和评审记录,生成用于绩效讨论和发展规划的结构化要点。
主要功能
- 01获取员工技能与职业兴趣
- 02汇总目标进度和里程碑
- 03收集反馈与过往评审
- 04综合数据生成讨论主题
- 05按讨论场景组织谈话框架
适用场景
- 01准备年度或年中绩效评审
- 02为定期一对一会议收集背景
- 03开展职业发展或晋升讨论
- 04为人才校准准备依据
MCP 相关
该技能使用 ServiceNow MCP 工具查询员工档案、目标、反馈和评审记录,并可执行后台脚本生成摘要。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill generate-talking-points安装后在 Claude Code 中输入/generate-talking-points确认已加载。
详细介绍
生成经理谈话要点
概述
此技能可为准备与员工进行绩效讨论的经理生成结构化谈话要点。它涵盖:
- 获取员工人才档案,包括技能、能力和职业抱负
- 汇总目标进度数据,包括完成率和里程碑跟踪
- 收集同事反馈、自我评估和以往的评审评分
- 将绩效指标综合为可执行的讨论主题
- 为评审、1:1 和发展规划会议生成对话框架
适用场景:
- 年度或年中绩效评审前
- 为与直属下属定期进行 1:1 会议做准备
- 作为新任经理入职、需要了解团队背景时
- 需要基于证据进行讨论的人才校准会议期间
- 职业发展或晋升讨论前
前提条件
- 角色:
sn_hr_talent.manager、sn_hr_core.manager、sn_hr_talent.admin或admin - 插件:
com.sn_hr_talent(人才管理)、com.sn_hr_core(HR 核心) - 访问权限: 对 sn_hr_talent_profile、sn_hr_talent_goal、sn_hr_talent_review、sn_hr_talent_feedback 表具有读取权限
- 所需知识: 了解所在组织的绩效评级标准、能力框架和评审周期
主要人才表
| 表 | 用途 | 主要字段 |
|---|---|---|
sn_hr_talent_profile | 员工人才档案 | user、skills、competencies、career_interests、potential_rating、risk_of_loss、last_review_date |
sn_hr_talent_goal | 员工目标和工作目的 | user、short_description、category、status、percent_complete、due_date、weight、metric_value |
sn_hr_talent_review | 绩效评审记录 | user、review_cycle、overall_rating、reviewer、state、comments、review_date |
sn_hr_talent_feedback | 同事和经理反馈 | user、feedback_type、provider、content、rating、created_on |
sys_user | 员工档案 | name、title、department、manager、location、date_joined |
操作步骤
步骤 1:获取员工人才档案
查询员工的人才档案,了解其技能、能力和职业信息。
使用 MCP(Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_talent_profile
query: user=[employee_sys_id]
fields: sys_id,user,skills,competencies,career_interests,potential_rating,risk_of_loss,strengths,development_areas,last_review_date,current_role_tenure
limit: 1
使用 REST API:
GET /api/now/table/sn_hr_talent_profile?sysparm_query=user=[employee_sys_id]&sysparm_fields=sys_id,user,skills,competencies,career_interests,potential_rating,risk_of_loss,strengths,development_areas,last_review_date&sysparm_limit=1&sysparm_display_value=true
步骤 2:收集目标进度
查询员工当前的目标及其完成状态。
使用 MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_talent_goal
query: user=[employee_sys_id]^active=true^ORDERBYDESCdue_date
fields: sys_id,short_description,category,status,percent_complete,due_date,weight,metric_value,metric_target,comments,created_on
limit: 20
使用 REST API:
GET /api/now/table/sn_hr_talent_goal?sysparm_query=user=[employee_sys_id]^active=true^ORDERBYDESCdue_date&sysparm_fields=sys_id,short_description,category,status,percent_complete,due_date,weight,metric_value,metric_target,comments&sysparm_limit=20&sysparm_display_value=true
步骤 3:收集反馈和评审记录
提取同事反馈和以往的评审评分。
使用 MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_talent_feedback
query: user=[employee_sys_id]^ORDERBYDESCsys_created_on
fields: sys_id,feedback_type,provider,content,rating,sys_created_on
limit: 20
使用 REST API:
GET /api/now/table/sn_hr_talent_feedback?sysparm_query=user=[employee_sys_id]^ORDERBYDESCsys_created_on&sysparm_fields=sys_id,feedback_type,provider,content,rating,sys_created_on&sysparm_limit=20&sysparm_display_value=true
提取以往的评审历史:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_talent_review
query: user=[employee_sys_id]^ORDERBYDESCreview_date
fields: sys_id,review_cycle,overall_rating,reviewer,state,comments,review_date,strengths_noted,areas_for_improvement
limit: 5
步骤 4:生成谈话要点
根据汇总的数据构建结构化谈话要点:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var empSysId = '[employee_sys_id]'; // Replace with target employee
var talkingPoints = {
generated_date: new GlideDateTime().toString(),
employee: {},
goal_summary: { total: 0, on_track: 0, at_risk: 0, completed: 0, avg_completion: 0 },
strengths: [],
development_areas: [],
feedback_themes: { positive: [], constructive: [] },
review_history: [],
discussion_topics: [],
suggested_questions: []
};
// Employee info
var user = new GlideRecord('sys_user');
user.get(empSysId);
talkingPoints.employee = {
name: user.name.toString(),
title: user.title.toString(),
department: user.department.getDisplayValue(),
manager: user.manager.getDisplayValue(),
tenure: user.date_joined ? gs.dateDiff(user.date_joined.toString(), new GlideDateTime().toString(), true) + ' days' : 'Unknown'
};
// Goal progress
var goals = new GlideRecord('sn_hr_talent_goal');
goals.addQuery('user', empSysId);
goals.addQuery('active', true);
goals.query();
var completionTotal = 0;
while (goals.next()) {
talkingPoints.goal_summary.total++;
var pct = parseInt(goals.percent_complete.toString()) || 0;
completionTotal += pct;
if (pct >= 100) talkingPoints.goal_summary.completed++;
else if (pct >= 50) talkingPoints.goal_summary.on_track++;
else talkingPoints.goal_summary.at_risk++;
}
if (talkingPoints.goal_summary.total > 0) {
talkingPoints.goal_summary.avg_completion = Math.round(completionTotal / talkingPoints.goal_summary.total);
}
// Talent profile
var profile = new GlideRecord('sn_hr_talent_profile');
profile.addQuery('user', empSysId);
profile.query();
if (profile.next()) {
talkingPoints.strengths = profile.strengths.toString().split(',').map(function(s) { return s.trim(); }).filter(Boolean);
talkingPoints.development_areas = profile.development_areas.toString().split(',').map(function(s) { return s.trim(); }).filter(Boolean);
}
// Feedback themes
var fb = new GlideRecord('sn_hr_talent_feedback');
fb.addQuery('user', empSysId);
fb.addQuery('sys_created_on', '>=', gs.monthsAgo(6));
fb.query();
while (fb.next()) {
var content = fb.content.toString().substring(0, 200);
var rating = parseInt(fb.rating.toString()) || 3;
if (rating >= 4) talkingPoints.feedback_themes.positive.push(content);
else if (rating <= 2) talkingPoints.feedback_themes.constructive.push(content);
}
// Review history
var review = new GlideRecord('sn_hr_talent_review');
review.addQuery('user', empSysId);
review.orderByDesc('review_date');
review.setLimit(3);
review.query();
while (review.next()) {
talkingPoints.review_history.push({
cycle: review.review_cycle.getDisplayValue(),
rating: review.overall_rating.getDisplayValue(),
date: review.review_date.toString()
});
}
// Generate discussion topics based on data
if (talkingPoints.goal_summary.at_risk > 0)
talkingPoints.discussion_topics.push('Address ' + talkingPoints.goal_summary.at_risk + ' at-risk goals and identify blockers');
if (talkingPoints.goal_summary.completed > 0)
talkingPoints.discussion_topics.push('Recognize completion of ' + talkingPoints.goal_summary.completed + ' goals');
if (talkingPoints.development_areas.length > 0)
talkingPoints.discussion_topics.push('Review progress on development areas: ' + talkingPoints.development_areas.join(', '));
if (talkingPoints.feedback_themes.constructive.length > 0)
talkingPoints.discussion_topics.push('Discuss constructive feedback themes (' + talkingPoints.feedback_themes.constructive.length + ' items)');
// Suggested questions
talkingPoints.suggested_questions = [
'What accomplishments are you most proud of this period?',
'What obstacles are slowing your progress on current goals?',
'How can I better support your development in [development_area]?',
'Where do you see yourself in the next 12-18 months?',
'What skills would you like to develop next?'
];
gs.info('MANAGER TALKING POINTS:\n' + JSON.stringify(talkingPoints, null, 2));
description: "Talent: Generate manager talking points for performance discussion"
步骤 5:按主题搜索背景信息
使用编码查询获取更多背景信息:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_talent_feedback
query: user.nameLIKE[employee_name]^rating>=4^123TEXTQUERY321=leadership collaboration^sys_created_on>=javascript:gs.daysAgoStart(90)
limit: 10
工具用法
| 操作 | MCP 工具 | REST 端点 |
|---|---|---|
| 查询人才档案 | SN-Query-Table | GET /api/now/table/sn_hr_talent_profile |
| 查询目标 | SN-Query-Table | GET /api/now/table/sn_hr_talent_goal |
| 查询反馈 | SN-Query-Table | GET /api/now/table/sn_hr_talent_feedback |
| 查询评审记录 | SN-Query-Table | GET /api/now/table/sn_hr_talent_review |
| 按主题搜索 | SN-Natural-Language-Search | N/A |
| 生成摘要 | SN-Execute-Background-Script | POST /api/now/table/sys_trigger |
| 架构发现 | SN-Discover-Table-Schema | GET /api/now/table/sys_dictionary |
最佳实践
- 数据隐私: 切勿将未经处理的同事反馈原文分享给员工;应综合归纳为主题,以保护反馈者的保密性
- 平衡观点: 始终兼顾优势与待发展领域,避免近因偏差或光环效应
- 目标对齐: 在团队和组织目标的背景下讨论目标
- 基于证据: 每个讨论要点都应以具体数据(目标指标、反馈引文、评审评级)为依据,而非主观印象
- 面向未来: 至少将 40% 的讨论要点用于未来发展,而不只是回顾过往表现
- 校准背景: 评审前,查看员工的评级与团队及部门平均水平的对比情况
- 文化敏感性: 根据组织文化和个人沟通偏好调整讨论要点的语气和结构
- 后续跟踪: 将讨论中商定的行动项记录为新的目标或任务
故障排除
人才档案未返回数据
症状: 查询已知员工时未返回人才档案
原因: 人才档案可能不会自动创建;需要经理或 HR 执行初始化操作
解决方案: 改为检查员工是否在 sn_hr_core_profile 中有 HR 档案。某些组织使用不同的档案表,或者人才模块可能尚未完全部署。
所有目标的完成百分比均为零
症状: 尽管已有进展,所有目标的完成度仍显示为 0%
原因: 目标跟踪可能采用基于里程碑的完成方式,而非百分比;也可能在相关任务表中跟踪进度
解决方案: 检查是否存在用于计算完成度的 sn_hr_talent_goal_task 或 sn_hr_talent_milestone 表。使用 sys_db_object 查询 nameLIKEgoal,查找相关表。
反馈内容已加密或受限
症状: 反馈内容字段返回空值或编码后的值
原因: HR 反馈可能受到字段级加密保护,或受 ACL 限制而无法被经理访问
解决方案: 确认查询用户拥有 sn_hr_talent.manager 角色。检查内容字段是否通过 sys_dictionary 中的 encryption 属性启用了加密。
示例
示例 1:年度评审准备
场景: 经理为年度绩效评审做准备
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_talent_goal
query: user=[employee_sys_id]^active=true^due_dateONThis year@javascript:gs.beginningOfThisYear()@javascript:gs.endOfThisYear()
fields: short_description,status,percent_complete,weight,metric_value,metric_target
limit: 15
生成的讨论要点:
- 开场:“感谢你今年作出的贡献。让我们回顾一下你的进展,并规划下一步。”
- 目标进展: 设定了 8 个目标,已完成 5 个(63%),2 个进展顺利,1 个有风险(Q4 营收目标完成度为 35%)
- 优势(来自反馈): 团队间协作和技术指导能力持续获得认可
- 待发展领域: 演讲能力(在 3 条反馈中提及)、授权能力(本人认定)
- 评级背景: 上次评审:超出预期。当前趋势:达到/超出预期
- 讨论问题:“Q4 营收目标进度落后;你需要哪些支持才能缩小差距?”
- 发展计划: 建议参加公开演讲培训;考虑安排一项具有挑战性的任务,由其负责下一次全员会议
示例 2:每周 1:1 快速准备
场景: 经理需要在 30 分钟的 1:1 前快速了解背景
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_talent_feedback
query: user.nameLIKE[employee_name]^sys_created_on>=javascript:gs.daysAgoStart(14)
limit: 5
生成的快速笔记:
- 目标跟进: API 迁移项目完成度为 70%(上周为 55%);预计能赶上 3 月截止期限
- 近期反馈: QA 负责人肯定了测试覆盖率文档的改进
- 上次 1:1 的待办事项: 员工申请了云认证培训预算
- 建议开场:“API 迁移进展很棒。新的测试方法用起来怎么样?”
相关技能
hrsd/case-summarization- 用于绩效讨论的 HR 案例背景hrsd/sentiment-analysis- 员工情绪分析hrsd/resume-skill-extraction- 用于发展规划的技能清单hrsd/persona-assistant- 基于 HR 角色的协助admin/workflow-creation- 自动化评审周期工作流