# Hrsd Sentiment Analysis

> Analyze employee sentiment from HR cases, surveys, and interactions to track trends, identify flight risk indicators, and flag cases needing manager attention

- Skill: `happy-technologies-llc/hrsd-sentiment-analysis` (Agent Skill)
- Install (CLI): `npx skillmds@latest add happy-technologies-llc/hrsd-sentiment-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/happy-technologies-llc/hrsd-sentiment-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Happy-Technologies-LLC (https://skillmd.com/u/happy-technologies-llc)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/happy-technologies-llc/hrsd-sentiment-analysis

---


# Employee Sentiment Analysis

## Overview

This skill analyzes employee sentiment across HR Service Delivery touchpoints including cases, surveys, chat interactions, and feedback. It helps you:

- Assess sentiment polarity (positive, neutral, negative) from HR case communications
- Aggregate survey responses and satisfaction scores for trend analysis
- Identify flight risk indicators based on case patterns and sentiment decline
- Flag cases with escalating negativity for proactive manager outreach
- Track department-level and organization-wide sentiment trends over time
- Correlate sentiment signals with employee lifecycle events (tenure, role changes, reviews)

**When to use:** When HR leaders need visibility into employee satisfaction trends, when agents need to prioritize cases with negative sentiment, or when identifying employees at risk of attrition.

## Prerequisites

- **Roles:** `sn_hr_core.manager`, `sn_hr_core.case_reader`, or `sn_hr_core.admin`
- **Plugins:** `com.sn_hr_service_delivery` (HR Service Delivery), `com.glide.assessment` (Assessment/Survey)
- **Access:** Read access to `sn_hr_core_case`, `sn_hr_core_profile`, `sys_journal_field`, `interaction`, `asmt_assessment_instance`, and `survey_response`
- **Knowledge:** Understanding of your organization's survey cadence, HR case types, and attrition indicators

## Procedure

### Step 1: Retrieve HR Cases for Sentiment Analysis

Fetch recent HR cases for the target scope (individual, department, or organization).

**Using MCP (Individual Employee):**
```
Tool: SN-Query-Table
Parameters:
  table_name: sn_hr_core_case
  query: subject_person=[employee_sys_id]^ORDERBYDESCopened_at
  fields: sys_id,number,short_description,description,state,priority,hr_service,opened_at,closed_at,contact_type,resolution_code,satisfaction_rating,reopened,reopen_count
  limit: 20
```

**Using MCP (Department-wide):**
```
Tool: SN-Query-Table
Parameters:
  table_name: sn_hr_core_case
  query: subject_person.department=[department_sys_id]^opened_at>=javascript:gs.beginningOfLast90Days()^ORDERBYDESCopened_at
  fields: sys_id,number,short_description,state,priority,hr_service,opened_at,subject_person,satisfaction_rating,contact_type
  limit: 100
```

**Using REST API:**
```bash
GET /api/now/table/sn_hr_core_case?sysparm_query=subject_person.department=[department_sys_id]^opened_at>=javascript:gs.beginningOfLast90Days()^ORDERBYDESCopened_at&sysparm_fields=sys_id,number,short_description,state,priority,hr_service,opened_at,subject_person,satisfaction_rating,contact_type&sysparm_display_value=true&sysparm_limit=100
```

### Step 2: Extract Case Communications for Sentiment Scoring

Pull work notes, comments, and additional details from cases to analyze language and tone.

**Using MCP:**
```
Tool: SN-Query-Table
Parameters:
  table_name: sys_journal_field
  query: element_id=[case_sys_id]^element=comments^ORelement=work_notes^ORDERBYsys_created_on
  fields: sys_id,element,value,sys_created_on,sys_created_by,element_id
  limit: 50
```

**Using REST API:**
```bash
GET /api/now/table/sys_journal_field?sysparm_query=element_id=[case_sys_id]^element=comments^ORelement=work_notes^ORDERBYsys_created_on&sysparm_fields=sys_id,element,value,sys_created_on,sys_created_by,element_id&sysparm_limit=50
```

### Step 3: Retrieve Chat and Interaction History

Fetch interaction records to analyze sentiment from live conversations.

**Using MCP:**
```
Tool: SN-Query-Table
Parameters:
  table_name: interaction
  query: opened_for=[employee_sys_id]^ORDERBYDESCopened_at
  fields: sys_id,number,type,channel,state,opened_at,closed_at,short_description,wrap_up_comment,satisfaction,direction
  limit: 25
```

**Using REST API:**
```bash
GET /api/now/table/interaction?sysparm_query=opened_for=[employee_sys_id]^ORDERBYDESCopened_at&sysparm_fields=sys_id,number,type,channel,state,opened_at,closed_at,short_description,wrap_up_comment,satisfaction,direction&sysparm_display_value=true&sysparm_limit=25
```

### Step 4: Retrieve Survey and Assessment Responses

Pull employee survey responses for structured satisfaction data.

**Using MCP (Assessment Instances):**
```
Tool: SN-Query-Table
Parameters:
  table_name: asmt_assessment_instance
  query: user=[employee_sys_id]^metric_type.nameLIKEemployee^ORmetric_type.nameLIKEHR^ORDERBYDESCtaken_on
  fields: sys_id,metric_type,taken_on,percent,state,user,category_scores
  limit: 10
```

**Using MCP (Individual Question Responses):**
```
Tool: SN-Query-Table
Parameters:
  table_name: asmt_assessment_instance_question
  query: instance.user=[employee_sys_id]^instance.metric_type.nameLIKEemployee
  fields: sys_id,instance,metric,value,string_value,actual_value,category
  limit: 50
```

**Using REST API:**
```bash
GET /api/now/table/asmt_assessment_instance?sysparm_query=user=[employee_sys_id]^metric_type.nameLIKEemployee^ORDERBYDESCtaken_on&sysparm_fields=sys_id,metric_type,taken_on,percent,state,user,category_scores&sysparm_display_value=true&sysparm_limit=10
```

### Step 5: Fetch Employee Profile and Lifecycle Context

Retrieve the employee's HR profile to correlate sentiment with lifecycle events.

**Using MCP:**
```
Tool: SN-Query-Table
Parameters:
  table_name: sn_hr_core_profile
  query: user=[employee_sys_id]
  fields: sys_id,user,department,location,employment_type,hire_date,manager,job_title,cost_center,last_review_date,last_promotion_date,years_in_role,employee_type
  limit: 1
```

**Using REST API:**
```bash
GET /api/now/table/sn_hr_core_profile?sysparm_query=user=[employee_sys_id]&sysparm_fields=sys_id,user,department,location,employment_type,hire_date,manager,job_title,cost_center,last_review_date,last_promotion_date,years_in_role&sysparm_display_value=true&sysparm_limit=1
```

### Step 6: Analyze Case Type Patterns

Examine the types of cases filed to identify concerning patterns.

**Using MCP:**
```
Tool: SN-Query-Table
Parameters:
  table_name: sn_hr_core_case
  query: subject_person=[employee_sys_id]^opened_at>=javascript:gs.beginningOfLast12Months()
  fields: sys_id,hr_service,hr_service.name,opened_at,state,priority
  limit: 50
```

Map case types to sentiment-relevant categories:

```
=== CASE TYPE PATTERN ANALYSIS ===

High-Risk Case Types (negative sentiment indicators):
- Workplace Complaint / Grievance
- Accommodation Request (especially repeated)
- Policy Dispute / Exception Request
- Manager Escalation
- Exit / Separation Inquiry

Neutral Case Types:
- Benefits Enrollment / Change
- Address / Personal Info Update
- Payroll Inquiry
- General HR Question

Positive Case Types:
- Internal Mobility / Transfer Request
- Training / Development Request
- Recognition Nomination
- Promotion Processing
```

### Step 7: Compile Sentiment Assessment

Assemble findings into a structured sentiment report:

```
=== EMPLOYEE SENTIMENT ASSESSMENT ===

Employee: Jane Smith | Engineering | Senior Software Engineer
Tenure: 4.8 years | Last Promotion: 18 months ago
Manager: Bob Johnson

--- Overall Sentiment Score ---
Composite Score: 42/100 (Declining - was 68/100 six months ago)
Trend: Negative trajectory over 3 months
Risk Level: ELEVATED

--- Case Sentiment Breakdown ---
Total Cases (12 months): 7
| Period        | Cases | Avg Sentiment | Dominant Tone     |
|---------------|-------|---------------|-------------------|
| Last 30 days  | 3     | Negative      | Frustrated        |
| 30-90 days    | 2     | Neutral       | Matter-of-fact    |
| 90-365 days   | 2     | Positive      | Appreciative      |

--- Survey Scores ---
| Survey                  | Date       | Score | Org Average |
|-------------------------|------------|-------|-------------|
| Q1 Engagement Pulse     | 2026-03-01 | 3.2/5 | 4.1/5       |
| Q4 Annual Engagement    | 2025-12-15 | 3.8/5 | 4.0/5       |
| Q3 Engagement Pulse     | 2025-09-01 | 4.2/5 | 4.1/5       |

--- Flight Risk Indicators ---
[!] Case volume increasing (3 cases in 30 days vs 2 in prior 60)
[!] Engagement survey score dropped 1.0 point in 6 months
[!] Filed policy exception request (potential dissatisfaction)
[!] No promotion in 18 months (above team average of 14 months)
[ ] No internal mobility applications detected
[ ] No exit-related case types filed

--- Sentiment Signals from Communications ---
- Case HRC0012456: "I've raised this issue multiple times..."
  Signal: Repeat frustration, unresolved concern
- Case HRC0012501: "The process seems unnecessarily complicated"
  Signal: Process dissatisfaction
- Case HRC0012523: "I need to understand my options"
  Signal: Ambiguous; may indicate exploration of alternatives

--- Recommended Actions ---
1. IMMEDIATE: Flag for manager 1-on-1 conversation
2. SHORT-TERM: Resolve open cases within SLA to rebuild trust
3. MEDIUM-TERM: Career development conversation recommended
4. TRACKING: Add to monthly sentiment watch list
```

### Step 8: Flag Case for Manager Attention

If sentiment analysis reveals risk, add a work note and flag for review.

**Using MCP:**
```
Tool: SN-Add-Work-Notes
Parameters:
  table_name: sn_hr_core_case
  sys_id: [latest_case_sys_id]
  work_notes: "SENTIMENT ALERT: Employee shows declining sentiment trend (score 42/100, down from 68). Flight risk indicators detected: increasing case volume, declining survey scores, no recent career advancement. Recommend manager outreach and career development discussion."
```

## Tool Usage

### MCP Tools Reference

| Tool | When to Use |
|------|-------------|
| `SN-Query-Table` | Query cases, profiles, surveys, interactions, journal entries |
| `SN-Natural-Language-Search` | Natural language search for cases with specific sentiment keywords |
| `SN-Get-Record` | Retrieve detailed single records for deep-dive analysis |
| `SN-Add-Work-Notes` | Document sentiment findings on case records |
| `SN-Update-Record` | Update profile risk indicators or sentiment scores |

### REST API Reference

| Endpoint | Method | Purpose |
|----------|--------|---------|
| `/api/now/table/sn_hr_core_case` | GET | HR cases for sentiment extraction |
| `/api/now/table/sys_journal_field` | GET | Case communications and comments |
| `/api/now/table/interaction` | GET | Chat and phone interaction history |
| `/api/now/table/asmt_assessment_instance` | GET | Survey/assessment response data |
| `/api/now/table/asmt_assessment_instance_question` | GET | Individual survey question responses |
| `/api/now/table/sn_hr_core_profile` | GET | Employee lifecycle context |
| `/api/now/table/sn_hr_le_case_type` | GET | Case type classification |

## Best Practices

- **Use multiple signals:** Never rely on a single data point; combine case sentiment, survey scores, and interaction tone for accuracy
- **Establish baselines:** Compare individual sentiment against department and organization averages for meaningful context
- **Track trends, not snapshots:** A single negative case is less concerning than a sustained declining trend
- **Respect privacy:** Sentiment data is sensitive; share only with authorized HR personnel and the employee's direct chain
- **Avoid bias in scoring:** Focus on observable patterns (case frequency, survey scores) rather than subjective interpretation of isolated comments
- **Calibrate flight risk thresholds:** Work with HR leadership to define what score thresholds trigger specific interventions
- **Consider lifecycle context:** New hires in their first 90 days may show different patterns than tenured employees; adjust analysis accordingly
- **Document methodology:** Record the scoring criteria and data sources used so results are reproducible and auditable

## Troubleshooting

### "Survey responses not found"

**Cause:** Surveys may use a different assessment type name or may be in a separate survey plugin
**Solution:** Query `asmt_metric_type` to list available assessment types. Also check `survey_response` table as an alternative storage location

### "Journal entries return too much data"

**Cause:** High-volume cases may have hundreds of journal entries
**Solution:** Filter by date range using `sys_created_on>=javascript:gs.daysAgo(90)` and limit to `element=comments` for employee-facing communications

### "Satisfaction rating field is empty"

**Cause:** Not all case types collect CSAT; it may be captured post-closure
**Solution:** Check `sn_hr_core_case` for `close_notes` and check if a separate satisfaction survey is triggered on case closure via `asmt_assessment_instance`

### "Department-level query times out"

**Cause:** Large departments with many cases over 12 months can exceed query limits
**Solution:** Break the query into monthly chunks or use `sysparm_query=subject_person.department=[id]^opened_at>=YYYY-MM-DD^opened_at<=YYYY-MM-DD` with pagination

## Examples

### Example 1: Individual Employee Sentiment Check

**Input:** "Analyze sentiment for employee Jane Smith over the past 6 months"

**Steps:**
1. Look up employee sys_id from `sn_hr_core_profile`
2. Query cases, interactions, and surveys
3. Score sentiment from communications
4. Compile individual sentiment report

### Example 2: Department Sentiment Dashboard

**Input:** "Show sentiment trends for the Engineering department"

```
Tool: SN-Query-Table
Parameters:
  table_name: sn_hr_core_case
  query: subject_person.department.name=Engineering^opened_at>=javascript:gs.beginningOfLast12Months()
  fields: number,subject_person,hr_service,opened_at,satisfaction_rating,state,priority
  limit: 200
```

Aggregate by month and case type to produce trend visualization data.

### Example 3: Flight Risk Report for HR Leadership

**Input:** "Identify employees with highest flight risk indicators"

```
Tool: SN-Query-Table
Parameters:
  table_name: sn_hr_core_case
  query: hr_service.nameLIKEexit^ORhr_service.nameLIKEseparation^ORhr_service.nameLIKEresignation^opened_at>=javascript:gs.daysAgo(90)
  fields: number,subject_person,hr_service,opened_at,state,subject_person.department
  limit: 50
```

Cross-reference with declining survey scores and increasing case volumes to prioritize the list.

## Related Skills

- `hrsd/case-summarization` - Detailed case context for sentiment-flagged cases
- `hrsd/chat-reply-recommendation` - Adjust reply tone based on sentiment analysis
- `hrsd/persona-assistant` - Personalized support for at-risk employees
- `reporting/trend-analysis` - Visualization of sentiment trends over time
- `reporting/executive-dashboard` - Executive-level sentiment metrics

