Purpose
Compare enrollment records across two or more source systems (SIS, LMS, CRM, billing, or a manual roster) and surface every mismatch, orphaned record, duplicate, and broken identity linkage — then rank each finding by severity so operations staff know exactly what to fix first before census, invoicing, or reporting deadlines.
When to Use
Invoke this skill when the user asks to:
- Reconcile a student roster between two systems (e.g., SIS vs. LMS) that show different headcounts
- Investigate why an enrollment count doesn't match across a CRM and billing system
- Find students who are enrolled in one system but missing from another
- Detect duplicate enrollments, split records, or mismatched identity fields before a census or audit date
- Clean an enrollment export before uploading it to a downstream system or state reporting file
Inputs Required
Before starting, collect:
- Source A data: Pasted roster/enrollment records from the first system (CSV, table, or delimited text) with a header row
- Source B data: Pasted records from the second system to compare against (same format expectation)
- Match key(s): The field(s) used to link records across systems — e.g., student ID, email, or first+last+DOB
- Systems named: What each source represents (e.g., "Source A = Banner SIS, Source B = Canvas LMS")
- Reconciliation goal: What "correct" looks like — should the two match exactly, or is A the system of record?
- Status filters: Which statuses count as enrolled vs. dropped/withdrawn/waitlisted (if a status field exists)
- Additional sources (optional): A third dataset (e.g., payment system) for three-way reconciliation
If no explicit match key is given, default to student ID; if that field is absent, fall back to a composite of email + last name and flag the reduced match confidence in the output.
Instructions
Step 1: Normalize and Profile Both Datasets
Before comparing, standardize the data to prevent false discrepancies:
- Trim whitespace, normalize case on IDs and emails (lowercase emails), and strip formatting from ID fields (leading zeros, hyphens, spaces)
- Standardize name fields for comparison (trim, collapse double spaces) without altering the displayed value
- Note the row count of each source and the count of unique match-key values
- Flag any rows with a null or blank match key immediately — these cannot be linked and become their own discrepancy category
Report the profile up front: Source A rows, Source B rows, unique keys in each, and any duplicate keys within a single source.
Step 2: Perform the Cross-System Match
Link records using the match key. Bucket every record into one of four match states:
- Matched cleanly: Present in both sources with consistent identity fields
- Present in A, missing in B: Orphaned in Source A
- Present in B, missing in A: Orphaned in Source B
- Matched key, mismatched fields: Same key links the records, but name, email, status, or section differs
For three-way reconciliation, extend the match matrix to show which of the three systems each record appears in (A/B/C presence pattern).
Step 3: Run the Discrepancy Checks
Systematically test for each anomaly type:
Missing records — a student in the system of record absent from a downstream system, or vice versa. Note direction (which system is missing the record).
Duplicate enrollments — the same match key appearing more than once within a single source, or the same person appearing under two different keys (detect via matching email/name across differing IDs).
Identity/linkage mismatches — same key but conflicting name spelling, email, date of birth, or program/section. Distinguish likely data-entry typos (one-character name differences) from genuine record collisions (completely different people sharing an ID).
Status conflicts — enrolled in one system but withdrawn/dropped/inactive in another. These are high-risk because they distort headcount and billing.
Section/program misalignment — same student enrolled in different sections, cohorts, or programs across systems.
Format/data-quality issues — malformed IDs, missing required fields, emails failing basic pattern validation, impossible values.
Step 4: Assign Severity to Each Finding
Rate every discrepancy on a three-level scale with explicit criteria:
- Critical: Affects billing, official headcount, census, or compliance reporting — e.g., a paying student missing from the SIS, or a status conflict on an active enrollee
- High: Data integrity issue that will cause downstream errors if propagated — e.g., duplicate records, identity collisions, orphaned records in the system of record
- Medium: Cleanup needed but no immediate operational impact — e.g., formatting inconsistencies, minor name-spelling mismatches, section misalignment on inactive records
Step 5: Determine Likely Root Cause and Resolution
For each discrepancy, state the most probable cause (e.g., "sync lag between SIS and LMS," "manual entry typo," "student re-registered under a new ID," "record dropped but not synced") and the specific corrective action, naming which system to update and what value it should hold.
Step 6: Assemble the Prioritized Discrepancy List
Sort all findings Critical → High → Medium. Number them for tracking. Lead with a one-line reconciliation summary (matched count, total discrepancies by severity).
Output Format
- Structure: Reconciliation summary at top → data profile → prioritized discrepancy table → resolution notes → next-step checklist
- Length: 500–900 words plus the discrepancy table (scales with volume of discrepancies found)
- Format: Table for the discrepancy list; short prose for summary and profile; bulleted next-step checklist
- Sections: Reconciliation Summary → Data Profile → Prioritized Discrepancy List (table) → Resolution Guidance → Recommended Next Steps
- Tone: Precise, non-alarmist, operations-analyst register — every claim tied to a specific record or field, no speculation beyond the data
The discrepancy table columns: # | Match Key | Discrepancy Type | Severity | Systems Affected | Detail | Likely Cause | Recommended Action
Quality Checklist
Before delivering output, verify:
- [ ] The reconciliation summary states matched count and a discrepancy count for each severity level (Critical/High/Medium)
- [ ] Every record appearing in only one source is accounted for in the discrepancy list — none silently dropped
- [ ] Each discrepancy names the specific match key and the specific field(s) in conflict — not a vague "mismatch"
- [ ] Severity assignments follow the Step 4 criteria and the list is sorted Critical → High → Medium
- [ ] Every finding includes both a likely cause and a system-specific recommended action
- [ ] Normalization assumptions (case, trimming, match-key fallback) are stated so the user can verify no false positives were introduced
Notes
- False discrepancies most often come from formatting, not real data problems — always normalize (Step 1) before comparing, and report what was normalized.
- If the two datasets use different header names for the same field, map them explicitly and state the mapping rather than guessing silently.
- Duplicate detection is strongest when both an ID field and an email/name field are present, because it catches the same person under two IDs — request both fields if only one is supplied.
- When the system of record is specified, frame every resolution as "update the non-authoritative system to match" unless the record is missing from the system of record itself, which is escalated to Critical.
- For large rosters, if the pasted data appears truncated, note the row counts and flag that the analysis covers only the visible records.
How to use this skill
This file is a Claude Code skill in Anthropic's standard format — markdown with YAML frontmatter at the top.
Installing in Claude Code:
~/.claude/skills/<folder-name>/SKILL.md— auto-loads in every session anywhere on your machine (recommended for skills you'll use across multiple projects)<your-project>/.claude/skills/<folder-name>/SKILL.md— auto-loads only when working in that project (recommended for project-specific skills)
Restart Claude Code or open a new session to register.
Using in Claude.ai, ChatGPT, Gemini, or other AI tools:
- Drag this file into a new chat, or copy and paste its contents
- Send your task or request as your next message — the AI will apply the skill where it fits
For Claude Code skill details: https://docs.anthropic.com/en/docs/claude-code/skills