From Intelligo
Compare Intelligo background-check reports and report what changed or what overlaps. Use this skill whenever the user wants to compare, diff, or cross-reference Intelligo reports or profiles — including "what changed since the last report", "refresh comparison", "compare this profile's new and old report", "what's common between these two profiles", "do these subjects share anything", or comparing every profile in an Intelligo project against each other. Trigger on phrases like "compare reports", "what's new in this refresh", "diff these profiles", "shared connections between profiles", "what did the upgrade add", "compare the two report levels", and on any request that names two or more Intelligo profiles/reports and asks how they relate. Three modes: REFRESH (same profile over time, same level), LEVEL CHANGE (same profile, two different report levels — upgrade or interim), and CROSS-PROFILE (two or more distinct profiles, including a whole project). Read-only — never writes back to Intelligo.
How this skill is triggered — by the user, by Claude, or both
Slash command
/intelligo:intelligo-compare-reportsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Compare Intelligo background-check reports and explain — in plain
Compare Intelligo background-check reports and explain — in plain language, facts only — what changed or what overlaps. Picking the right kind of comparison is the first decision, so start there.
Refresh — same subject, same level, different points in time. One profile, a newer report and an older one at the same report level. Question: what changed since last time? Same person/entity and same coverage scope, so you align records one-to-one and report transitions — findings newly present, findings gone, flags escalated or cleared, new dated hits since the prior report.
Level Change — same subject, two different report levels. One profile, two
reports at different levels (e.g. Now → Advantage, Advantage L1 → Advantage L2/3).
This covers both upgrades (moving to a higher level for deeper coverage) and
interim runs (running a lower level to cover a time gap before the deal closes).
Question: what did the level change add or remove — in coverage and in findings?
Coverage scope changed, so findings can appear or disappear simply because the new
level covers more (or less) — not because the subject changed. You must separate
coverage-driven differences from genuine finding changes, and always run a coverage
diff via compareCoverage.
Cross-profile — different subjects, compared as peers. Two or more distinct profiles (or every profile in a project). Question: what do they share, and where do they diverge? No time axis — you compute set intersection and difference: shared employers, addresses, associates, companies, legal entities, and what's unique to each. Overlap is usually the signal the analyst wants (hidden or undisclosed connections).
Deciding which:
If genuinely ambiguous, state your inferred mode in one line and proceed — don't stall on a question you can answer by checking whether the subject and level match.
This skill compares reports the user already has in mind or that live in a named project. It is not the account-wide "who is connected to X" screening search — that's a separate operation.
Intelligo profiles can hold several report types (background check, social media analysis, credit check, others). Compare background-check reports by default; when a profile or project has more than one type, pick the background check without asking.
If the user explicitly asks for another type, don't silently ignore it and don't refuse: tell them other types exist and that this skill is built around background checks, then default to background checks unless they confirm they want the other type — so they stay aware of what's being compared.
Social media and credit reports are PDFs, not structured data, so you can only compare them if you can actually read the PDF content. If it isn't available, ask the user to upload it (both for a refresh, all of them for a cross-comparison). If you still can't read it, stop — don't guess from a filename or metadata and don't fabricate. A missing PDF is a hard stop. Once you have the content, the mode logic and facts-only output below apply unchanged.
Relies on the Intelligo MCP connector.
references/profile-resolution.md. It handles searching profiles and projects
in parallel, the case where one name matches both a profile and a project,
reusing a subject already resolved earlier in the conversation, disambiguating
duplicates, and the never-silently-combine rule. It uses get_profiles,
get_projects, and get_profile.get_report_content, one call per report (the heavy
call). The resolved profile/project objects tell you a profile's available
reports and a project's members — rely on what the connector returns, never
invent fields.compareCoverage, used in Level Change mode only.
Call it with both report levels to get what coverage was added, removed, or
changed between the two levels. Run this before fetching report content so the
coverage picture is ready when you interpret findings.Every time you reference a report in a question, list, or output — use the three things the user actually recognizes:
Combine them like this whenever you list a report for the user to choose from or reference one in output:
John Smith — Advantage · 14 Feb 2026 · US + UK
This format applies everywhere: selection lists, confirmation dialogs, diff headers, and any inline reference in a summary.
references/profile-resolution.md — into one profile
(Refresh / Level Change) or several profiles / a project (Cross-profile).compareCoverage before
fetching report content.get_report_content.A report is only safe to compare once it's final. Check every report's status first:
(preliminary — unverified) and repeat the caveat in the summary.A profile can have more than two reports — don't assume "latest vs the one before."
[Subject name] — [Level name] · [Published date] · [Jurisdiction(s)] This is the one place in Refresh worth a question — the wrong baseline silently produces a misleading diff.
If the two reports differ in level, stop — this is a Level Change scenario, not a Refresh. Apply the Level Change detection logic below before proceeding.
If the reports differ in jurisdictions covered (but same level), an apparent "new" or "removed" finding may just be different coverage, not a real change. Note the mismatch at the top of the output and flag coverage-driven differences as such.
A useful diff is about what changed substantively, not which words moved. Don't flag rewordings; don't miss a real shift hidden behind similar wording. Match records by a stable identifier (case number, employer, license, article) rather than by position, then for each candidate change ask what it means:
[old state] → [new state],
outcome as stated — one transition, not two findings. This includes flag
changes: if a finding's flag level changed (e.g. 🟡 → 🔴, or 🔴 → cleared),
that is a change and must be reported — it's often the most important signal
in a refresh.Always show the current flag (🔴 / 🟡 / ⚪ unflagged) alongside every finding in the output. Never omit the flag — even if the finding hasn't changed, the flag is part of its identity.
Lead with what's material. A refresh where nothing changed is a valid, valuable answer — say so plainly rather than padding.
A refresh almost always pulls in new articles, so news needs the legal lens: is each new article a genuinely new event, or another copy of one already in the baseline?
Group news by underlying event — "one event, N sources," not N findings. Signal, not length.
Use this structure. Drop any section that has nothing to show — don't include empty headers. Every finding gets its own row or bullet; no prose blocks inside sections.
🔄 Refresh — [Subject name] 📅 Baseline: [date · level · jurisdiction(s)] → Current: [date · level · jurisdiction(s)]
📊 Change summary
| Category | New | Flag changed | Changed | Removed |
|---|---|---|---|---|
| Legal / Court | # | # | # | # |
| Regulatory | # | # | # | # |
| Sanctions / Watchlists | # | # | # | # |
| Adverse Media | # | # | # | # |
| Employment | # | # | # | # |
| [other sections with changes] | # | # | # | # |
(Only include rows with at least one non-zero count. "Flag changed" counts findings where only the flag level changed — escalated or cleared — with no other state change. If nothing changed at all, replace the table with: "No changes found across all sections.")
🆕 New findings (Present in current report, absent in baseline. Lead with red flags, then yellow.)
🔴 [Section] — [finding, stated factually] 🟡 [Section] — [finding, stated factually] ⚪ [Section] — [finding with no flag]
🔀 Changed (Same record, moved state — including flag escalations and clearances.)
(Show the flag transition as [old flag]→[new flag] before the finding text when the flag changed. If the flag didn't change, show only the current flag: 🔴 **[Section]** — ...)
🗑 Removed since baseline (In baseline, gone now — lower urgency.)
📝 What this means [2–3 factual sentences: counts by category, the notable transitions. No risk verdict unless the user explicitly asks.]
When a profile has two background-check reports at different levels, detect this automatically and ask the user to confirm the intent before proceeding:
"I can see two reports for [Subject name] at different levels:
- [Exact level name A] — published [date] · [jurisdiction(s)]
- [Exact level name B] — published [date] · [jurisdiction(s)]
Was this an upgrade (moving to a higher level for deeper coverage) or an interim run (running a lower level to cover the time gap before the deal)? This affects how I frame the comparison."
Use the subject's actual name and the exact level names from the connector — never "level 1 / level 2" or "old / new." Wait for the user's answer. Do not infer intent from the level order alone — a lower-level report dated after a higher one is a strong signal for interim, but still ask. Once confirmed, label the mode clearly in the output header.
Call compareCoverage with both report levels before fetching report content.
Present the coverage diff as its own section in the output, before findings.
Organize it as:
This section is factual and mechanical — list what changed, not why it matters. The findings section below is where coverage changes get applied.
A finding that appears only in the higher-level report may exist because:
You must distinguish these. For every new finding in the higher-level report, ask:
"Is this in a section or jurisdiction that compareCoverage shows was added?"
[new coverage]. It's a real finding, but its absence from
the prior report means nothing about the subject's history — it was simply
outside scope before.[new finding].[removed] and note it; may
warrant checking.For interim runs (lower level run after a higher one): the lower level will naturally have fewer findings. Don't treat missing findings as "removed" — they're outside the interim report's scope. Focus on what the interim period added: new findings present in the lower-level report that weren't in the higher-level baseline, within the overlapping coverage.
Use this structure. Drop any section with nothing to show. Every item gets its own line — no prose blocks inside sections.
⬆️ Level Change — [Subject name] · [Upgrade / Interim run] 📅 Baseline: [date · level · jurisdiction(s)] → New report: [date · level · jurisdiction(s)]
📦 Coverage changes
| Details | |
|---|---|
| ➕ Added | [source / check type / jurisdiction], [source / check type / jurisdiction] |
| ➖ Removed | [source / check type / jurisdiction] (mainly interim runs) |
| ✅ Unchanged | [brief list of shared baseline checks] |
📊 Findings summary
| Category | New coverage 🆕 | Genuine new | Changed | Removed |
|---|---|---|---|---|
| Legal / Court | # | # | # | # |
| Regulatory | # | # | # | # |
| Sanctions / Watchlists | # | # | # | # |
| Adverse Media | # | # | # | # |
| Employment | # | # | # | # |
| [other sections with changes] | # | # | # | # |
🆕 New findings — expanded coverage (Findings that appear because the new level covers sources/jurisdictions the old one didn't. Their absence from the prior report says nothing about the subject — they were simply out of scope.)
🔴 [Section] — [finding] · new coverage: [source/jurisdiction]
🟡 [Section] — [finding] · new coverage: [source/jurisdiction]
⚪ [Section] — [finding] · new coverage: [source/jurisdiction]
⚠️ Genuine changes (within overlapping coverage)
Added 🔴 [Section] — [finding, stated factually] 🟡 [Section] — [finding, stated factually]
Flag escalated / cleared
Changed
Removed
📝 What this means [2–4 factual sentences: what the level change added in scope, count of new-coverage findings vs genuine changes, and any notable genuine transitions. No risk verdict.]
A useful diff is about what changed substantively, not which words moved. Don't flag rewordings; don't miss a real shift hidden behind similar wording. Match records by a stable identifier (case number, employer, license, article) rather than by position, then for each candidate change ask what it means:
[old state] → [new state],
outcome as stated — one transition, not two findings. This includes flag
changes: if a finding's flag level changed (e.g. 🟡 → 🔴, or 🔴 → cleared),
report it — flag escalations are often the most actionable signal.Always show the current flag (🔴 / 🟡 / ⚪ unflagged) alongside every finding in the output. Never omit the flag.
Lead with what's material. A refresh where nothing changed is a valid, valuable answer — say so plainly rather than padding.
A refresh almost always pulls in new articles, so news needs the legal lens: is each new article a genuinely new event, or another copy of one already in the baseline?
Group news by underlying event — "one event, N sources," not N findings. Signal, not length.
# Refresh comparison — [Subject name]
Baseline: [date, level, jurisdiction(s)] → Current: [date, level, jurisdiction(s)]
## What's new
- [section] [red/yellow flag if labeled]: [finding, stated factually]
## Changed
- [section]: [old state] → [new state], outcome: [as stated]
## Removed since baseline
- [section]: [finding]
## Summary of changes
[1–3 sentences, factual: what changed, e.g. counts by category and the notable
transitions. No verdict on whether risk rose or fell.]
Use each profile's most recent report by default (no need to ask unless the user names a specific one). When the input is a project:
Treat the profiles as peers: for each attribute type, take the intersection across profiles and the per-profile remainder. The strongest connection signals: shared employers/companies, addresses, associated people, overlapping legal entities or case parties, shared directorships. Surface softer overlaps (same city, same education) but rank them lower.
For a project (N profiles), report each overlap as "shared by [which profiles]" so the analyst sees who is connected through what. Highlight overlaps involving a red/yellow-flagged entity (the flag is the report's, a fact) so they're easy to spot.
Organize around what you found — add, drop, or rename sections based on what actually surfaced. Every item gets its own line. No prose blocks inside sections. Keep constant: the header, overlaps first, divergence second, summary last.
🔗 Cross-profile — [Profile A] · [Profile B] (or: Project [name] · N profiles)
📊 Overlap summary
| Attribute | Shared value | Profiles | Flag |
|---|---|---|---|
| Employer | [company name] | A, B | 🔴 / 🟡 / — |
| Address | [city, country] | A, C | — |
| Associate | [name] | A, B | 🟡 |
| Legal entity | [entity name] | B, C | 🔴 |
| [other attribute] | [value] | [which] | — |
(Only include attribute types that actually surfaced. If no meaningful overlap: "No shared employers, addresses, associates, or legal entities found.")
↔️ Notable divergence
| Profile | Attribute | Flag | Detail |
|---|---|---|---|
| [Profile A] | [type] | 🔴/🟡/— | [unique finding] |
| [Profile B] | [type] | 🔴/🟡/— | [unique finding] |
📝 What this means [2–3 factual sentences: what's shared and through what, where they diverge. No strength rating or verdict.]
(If internet expansion was accepted, add a clearly separated section:)
🌐 External leads [unverified — not Intelligo data]
After the Intelligo comparison, you may offer to extend the search to the internet
for connections the reports don't capture (co-mentions in news, shared filings).
Opt-in — ask first. If the user accepts, state plainly why this data is weaker:
it is not human-verified the way Intelligo content is, and an LLM searching
the open web is materially less accurate than Intelligo's own automated data
collection — wrong-entity matches, stale or low-quality sources, and missed
context are all likely. So mark every non-Intelligo finding [external data — unverified], keep it visually distinct, and treat such findings as leads to
verify, never as facts. Intelligo data is the trusted baseline; internet results
are a lead, not a conclusion.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub intelligogroup/intelligo-agents-plugins --plugin intelligo