lawve-ai/screening-alert-adjudication-amir-fadavi
Adjudicates whether a hit generated by sanctions, PEP, or adverse-media screening is a true positive, false positive, or requires human escalation. Use whenever a user presents a screening alert, a name match against a watchlist (OFAC SDN, EU consolidated list, UK OFSI, UN list, PEP list, adverse media hit, etc.), or asks to clear a screening hit / reduce false positives / determine whether a flagged name is actually the listed party. Use even when the user describes the task casually — \"is this person actually on the sanctions list\", \"did we get a real match\", \"clear this alert\", \"I have a hit on X\" — these are all screening-adjudication tasks. Produces a deterministic determination with full audit trail (structured JSON + human-readable narrative). Designed for use by compliance analysts and screening systems.
npx skills add https://github.com/lawve-ai/awesome-legal-skills --skill screening-alert-adjudication-amir-fadavi
This skill adjudicates a single screening hit — a name that an upstream screening system flagged as a possible match against a sanctions list, PEP list, adverse-media source, or similar watchlist — and reaches one of three conclusions:
Screening systems generate enormous volumes of low-quality alerts. Analysts spend their time clearing alerts that should never have fired (wrong entity type, common name with no overlap on identifiers, partial-name matches that ignore naming convention). A deterministic, criteria-driven adjudication layer can clear the obvious false positives and confirm the obvious true positives, leaving humans to focus on the genuinely ambiguous cases.
The skill is designed around two non-negotiable properties:
Adjudication runs through tiers. Each tier escalates token spend; earlier tiers exit as soon as they can.
references/tier-0-parsing.md.references/tier-1-rules.md.references/tier-2-rules.md.references/tier-3-research.md.If no determination is reached by the end of an applicable tier, the skill escalates with the full evidence record.
Required from the user or upstream system:
Useful if provided, optional otherwise:
Default to interactive mode when a human is at the keyboard. In interactive mode, ask once for any of the following that aren't present and would materially help:
In batch mode (system feed, no human present), proceed with whatever is provided. Don't ask. If essential context is missing and the rules can't conclude, the skill escalates — that's the correct outcome.
Read the list entry first. Most watchlist entries carry an explicit type field (individual / entity / vessel / aircraft). Use that.
For the screened side: ask in interactive mode. In batch mode, attempt inference from the name structure but flag the inference as low-confidence. The type-mismatch FP rule (FP-1) requires high-confidence types on both sides — it never fires on inferred screened types.
Across every list type and every rule, the underlying question is the same: is the screened name the same party as the listed party? List type affects the consequences of the answer, not the question itself. The same matching engine applies whether the list is a sanctions list, a PEP list, or an adverse-media source.
That said, list type affects the threshold for action:
A screening hit often involves names from different cultures, scripts, and naming conventions. Standard fuzzy matchers handle this badly — they treat "Jose Andrea" as matching "Jose Andrea Coronado" by string overlap and ignore that Coronado is the anchor surname in Hispanic convention.
The skill parses both names into structural components first. Anchor components (the parts that genuinely identify the person) drive matching; non-anchor components are corroborating context. The naming-convention reference (references/naming-conventions.md) defines anchor and non-anchor components per convention: Hispanic, Portuguese, Arabic, Russian, East Asian, Indonesian/Burmese, Western default.
When the script is non-Latin or the name is a transliteration from a non-Latin source, the skill is aware that the same source-language name can produce multiple Latin spellings. See references/transliteration-variants.md for documented variant patterns. When Tier 3 web research runs, source-language queries are part of the search ladder.
Every adjudication produces a single record in two views, generated together from the same underlying state:
The full schema and narrative format are in references/output-schema.md. Both must be produced on every adjudication, regardless of outcome.
The narrative never characterizes its own confidence beyond what the rules produced. There is no "this appears to be" or "likely false positive" language. A rule either fired or it didn't.
For escalations, the record includes a gaps_for_human field listing the specific information that would have allowed determination. The skill does not make a recommendation toward TP or FP on escalations — the evidence package is presented neutrally so the human draws their own conclusion.
Follow this sequence on every alert. Don't skip tiers and don't reorder them — the determinism guarantee depends on the order.
Capture every field from the input. Note what's missing. In interactive mode, ask once for material gaps.
Parse both names and the listed-entry context per references/tier-0-parsing.md. Produce the parse record. If parse confidence is low for either name, note it — this disables structural-mismatch FP rules in Tier 1 for that pair.
Evaluate each Tier 1 rule (FP-1, FP-2, FP-3) per references/tier-1-rules.md. If any rule fires, produce the FP determination and stop. If none fires, proceed.
Evaluate each Tier 2 rule (TP-1, TP-2, Escalate-2, FP-5, FP-6) per references/tier-2-rules.md. Log soft signals (gender, geography, partial-DOB mismatch where the hard rule didn't fire) but do not let them drive determinations. If a rule fires, produce the determination and stop. If none fires, evaluate whether Tier 3 has a realistic research path.
Per the gating in references/tier-3-research.md, Tier 3 runs only if at least one of these is true:
If none of these holds, escalate without Tier 3. Don't burn tokens on research that can't conclude.
Work through the four-rung language ladder. Stop as soon as TP-3 or FP-7 fires, or when the 8-fetch retrieval cap is reached. Snapshot every retrieval that contributes to the determination.
JSON + narrative, per references/output-schema.md. Include every tier's evaluation, every rule that was checked and whether it fired, every retrieval if Tier 3 ran, and the final classification.
references/tier-0-parsing.md — How to parse names and classify naming conventionsreferences/tier-1-rules.md — Hard FP rules (FP-1, FP-2, FP-3)references/tier-2-rules.md — Structured corroboration rules (TP-1, TP-2, Escalate-2, FP-5, FP-6)references/tier-3-research.md — Web research procedure, language ladder, source ranking, TP-3, FP-7references/naming-conventions.md — Anchor and non-anchor components by naming conventionreferences/transliteration-variants.md — Documented variant patterns for cross-script name handlingreferences/place-name-equivalences.md — Cities and countries with multiple names (Leningrad/St. Petersburg, Bombay/Mumbai, Persia/Iran, etc.) for POB and address comparisonreferences/output-schema.md — JSON schema and narrative formatRead the tier reference for the tier you're currently executing. Read the supporting references (naming conventions, transliteration variants) when Tier 0 or Tier 3 needs them. You don't need to read everything up front — the SKILL.md tells you which file to consult when.
Take lawve-ai/screening-alert-adjudication-amir-fadavi from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.