OSINT investigator
SkillCommunicationResearch a person, build a dossier on someone, vet a business partner, prep for a negotiation, verify what someone told you, or brief yourself before a meeting with a named individual. Fuses your entire Littlebird record of that person, every message thread, meeting, calendar invite, and screen sighting, into a dated relationship timeline with receipts, then reconciles it against external research. Use it for partner diligence, prospect research, negotiation prep, and claim verification. Not for employment screening.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the OSINT investigator skill
What this skill tells your AI
The instructions your AI receives, as published by legioncodeinc/vibe-coding-tools in src/quarantine/skills/keep/osint-investigator/SKILL.md and read by ahel’s review.
Point this at a name. It assembles one evidence-graded business brief from two halves: the complete internal record of that person crossing your screen, and external research into their public footprint. It then holds the two against each other and reports where they disagree.
The centerpiece is the relationship timeline. External research tools can find anyone's public footprint. Nothing else can produce the dated record of every interaction between this person and you, with receipts. That section is why this skill exists, and it gets the most space in the output.
Purpose
Answer one question about one named person, bound to a stated business purpose, by fusing the complete internal record of that person with external research into their public footprint, and reporting where the two disagree rather than smoothing it over.
Four purposes, and no others: partner diligence, prospect prep, negotiation prep, claim verification. There is no "just find everything" mode.
Three failures it exists to prevent:
- Scope creep into surveillance. Diligence that runs maximum depth on everyone, unbound to a purpose, is not diligence. The purpose gate is step 1 for that reason.
- The identity merge. A dossier assembled from two people who share a name is wrong on every line, and the documented cost is legal exposure, wasted work, and harassment of an uninvolved party.
- False corroboration. A profile, a bio, a company page, an email signature, and a spoken self-introduction agreeing with each other is one source, not five.
Capability gate
List the tools available in this session and use the real tool names. Do not assume the names in this file are spelled the way your session spells them, and do not assume a tool exists because it is named here.
- Required: the Littlebird MCP, on a Power or Pro plan. If
search_user_contextis not available, the MCP is not connected. Stop and tell the user. There is no degraded mode: without the internal half this is a web search with extra ceremony, and the user should be told that rather than handed one. - Expected: whatever web search and fetch tools the session carries. Exa, Firecrawl, and a built-in search and fetch pair are all common and sessions differ. If none are present, produce the internal half, mark the external half and the Reconciliation section as unrun, and say why.
- Plan check:
LB_INTERNAL_GET_SUBSCRIPTION_STATUSif you need to explain a capability limit to the user.
Littlebird MCP calls used
| Call | Used for |
|---|---|
search_user_context with filters: {"data_source": "snapshots"} | Passes A and C. Profile pages, contact records, directory entries, handles and links, then screen sightings across inbox, calendar, notifications, CRM records, and shared documents |
search_user_context with filters: {"data_source": "messages"} via search_queries_messages | Pass B. Every thread with the subject, with per-message send timestamps |
search_user_context with filters: {"data_source": "summaries"} | Pass D. Mentions by others and daily activity digests |
LB_INTERNAL_SEARCH_MEETINGS with query and attendees | Candidate meetings, by topic and by name. attendees is an OR filter and best-effort over top candidates only. It over-includes and it misses, and it never proves attendance on its own |
LB_INTERNAL_GET_MEETING with meeting_id | The confirmation step for every candidate the search returned. Attendance comes from the linked calendar event, attribution from the Decisions and Action Items blocks |
LB_INTERNAL_GET_MEETING_TRANSCRIPT with meeting_id | Exact wording only, for a line the structured summary already located and already attributed. Never the source of attribution |
LB_INTERNAL_LIST_MEETINGS with a future end_date | Only where the purpose is an upcoming meeting or negotiation, to locate the event the prep pack is for. Upcoming events are bare calendar entries and carry no recording |
LB_INTERNAL_GET_SUBSCRIPTION_STATUS | Plan check, only when a capability limit needs explaining |
Every search_user_context call carries date_range set from the scope answer, and a wide
window is swept month by month rather than requested in one call. At most 7 queries per call.
Exact query text per pass is in references/internal-retrieval-brief.md.
No routine tools appear in this list. That is deliberate, and the reason is in Routine cadence below.
External research runs on whatever web search and fetch tools the session actually carries. There is no Littlebird web search tool. List the session's tools and use their real names.
Trigger
- "research this person", "who is", "build me a dossier on", "what do we know about"
- "vet this partner", "diligence on", "before I sign with"
- "prep me for the negotiation with", "brief me before my meeting with"
- "verify what they told me", "is what they claimed true"
Four bound purposes: partner diligence, prospect prep, negotiation prep, claim verification. The purpose is asked for before any retrieval and it scopes everything downstream.
Not a trigger: anything that amounts to employment screening, any request with no business relationship behind it, and any request whose real object is a protected characteristic. See Guardrail.
Routine cadence
None, and that is a design decision rather than a gap. This skill runs on demand and creates no routine, because a standing background job that periodically re-researches a named individual is surveillance rather than due diligence. A person is looked into once, for a stated reason, and the file is dated.
LB_INTERNAL_CREATE_ROUTINE works from an interactive session, so the absence here is a
refusal and not a limitation. If the user asks for a recurring watch on a person, say that
plainly and offer a fresh run when the business reason returns.
Read before running
| File | What it carries |
|---|---|
references/purpose-binding-and-scope.md | The purpose gate, the refusal cases, the exclusion list |
references/internal-retrieval-brief.md | The four parallel passes, the meeting procedure, the disambiguation gate |
references/external-research-and-verification.md | Search hygiene, the independence test, the claim taxonomy |
references/reconciliation-and-confidence.md | The conflict rules and the two-axis confidence model |
references/dossier-template.md | The exact output shape |
references/evidence-standards.md | Receipts, the observed / inferred / external / unknown split, rule 10 on reporting on people |
references/littlebird-mcp-reference.md | Verified tool inventory, parameters, and known limitations |
references/research/distilled-due-diligence-and-osint.md | The cited domain distillation behind every method claim in this skill |
Process
1. Bind the purpose. First, before any retrieval.
Run AskUserQuestion for the business purpose and the scope window. See
references/purpose-binding-and-scope.md for the exact questions and options.
Purposes: partner diligence, prospect prep, negotiation prep, claim verification.
There is no "just find everything" mode. The purpose scopes what gets assembled, because scope creep is what turns due diligence into surveillance. Professional practice sets diligence depth by risk-based tiering rather than running maximum depth on everyone, and the GDPR necessity test holds that breadth which is merely useful rather than necessary to a stated purpose does not qualify (distillation sections 1 and 6).
Stop and refuse if the purpose is employment screening (hiring, promotion, reassignment, or retention, or an output destined for an employer), if there is no business relationship behind the request, or if the real object is a protected characteristic. Flag and ask before continuing on independent contractor vetting. Reasons and exact wording are in the purpose-binding guide.
2. Build the identifier baseline
Ask the user for every identifier they have: full name, middle name or initial, email addresses, company, role, phone, profile URLs. Rank them by discriminative strength before searching. This is what keeps false positives out of everything downstream (distillation section 4).
3. Retrieve the internal record: four parallel narrow passes
Not one broad query. A broad name query against a rich account returns 70,000 characters, overflows the result limit into a file dump, and buries the timeline. Parallel narrow queries return better-scored, more diverse items.
| Pass | Data source | Target |
|---|---|---|
| A | snapshots | Profile pages, contact records, directory entries, handles, links |
| B | messages | Every thread, with per-message send timestamps |
| C | snapshots | Screen sightings: inbox, calendar, notifications, CRM, shared documents |
| D | summaries | Mentions by others and daily activity digests |
Exact query text for each pass is in references/internal-retrieval-brief.md. Window every
call by the scope answer. Sweep month by month if the window is wide.
Meetings: LB_INTERNAL_SEARCH_MEETINGS with query and attendees, then confirm every
candidate with LB_INTERNAL_GET_MEETING. The attendees filter is an OR filter and
best-effort over top candidates only, so it both over-includes and misses, and it never
proves attendance on its own. Take wording from LB_INTERNAL_GET_MEETING_TRANSCRIPT and
attribution from the summary's Decisions and Action Items blocks, never the reverse.
4. Disambiguate identity. This is a gate, not a caveat.
Confirm you have ONE person and not a merge of two, before assembling anything. Common names collide freely, and the documented cost of getting it wrong is legal exposure, wasted work, and harassment of an uninvolved party (distillation section 4).
The record is one person when a strong identifier (email address, phone number) links across
at least two passes, or a medium identifier (company plus role, profile URL slug) is
consistent across everything retrieved with nothing contradicting it. Failure signals and
the split procedure are in references/internal-retrieval-brief.md.
If disambiguation fails, stop and ask the user with the candidate sets laid out. Never assemble a merged record and flag it afterward, because every downstream line inherits the error.
Report the disambiguation evidence in the dossier. Section 0 of the template exists for this. Name what linked the record, what was ruled out, and what residual risk remains.
5. Sort into the timeline
Retrieval is relevance-ordered. The timeline is time-ordered. Sort by timestamp as a deliberate step. The event time governs the ordering and the collection time goes in the receipt. For messages these are different values and conflating them scrambles the timeline. Deduplicate first: OCR of dense interfaces repeats lines, and repeated lines are one observation.
6. Research the public footprint
Bound by the purpose, using the session's actual web tools. Quote the name, pair it with a medium-strength identifier on every query, timestamp every finding at fetch time, and capture the URL rather than a description of it. Tie every external result back to the same person using the strong identifiers from the internal half.
Report external claims as claims. "Their site says X", never "X". This is not pedantry: it is what makes step 7 legible, because a conflict between "their site says 2019" and a receipt of them saying 2021 is readable, while a conflict between two bare assertions is just a contradiction the reader has to untangle.
7. Reconcile
Pair internal claims to external claims fact by fact. Classify each pair: agreement, conflict, drift over time, internal only, external only, or unverifiable.
Conflicts stay conflicts. Never resolve a disagreement by picking the more interesting reading, or the more recent, official, or convenient one, unless there is an actual reason and the reason is stated. Surfacing a discrepancy between what someone says and what the record shows is a standard, expected diligence artifact, not an adversarial move (distillation section 1).
Check every agreement for false corroboration. The subject's profile, bio, company page, email signature, and spoken self-introduction all originate with the subject. Five agreeing artifacts is one source. Corroboration requires a second origin, not a second surface, and this is the documented failure mode where consistent accounts turn out to be consistently wrong (distillation section 3).
8. Rate confidence, per claim
Two axes, each justified in its own sentence, rolled into High, Medium, or Low.
- Provenance: primary observed, primary self-reported, secondary third-party, fragmentary, or inferred.
- Corroboration: independently corroborated, single origin multiply surfaced, uncorroborated, contested, or unresolvable.
The two-axis structure is adapted from the Admiralty source-grading model. The published letter grades are deliberately not shipped, because 87% of ratings collapse onto the diagonal in practice, grade boundaries carry no shared referent, and key terms are never operationalized (distillation section 2). Requiring a separate sentence per axis is the countermeasure: it makes the collapse visible to the reader.
Rate claims, never the person. There is no overall confidence score for a human being.
9. Write the artifact
Confirm the identity resolution and any durable fact with the user via AskUserQuestion
before writing (references/evidence-standards.md, rule 6). Then produce the file.
Output
One markdown file: dossier-<subject-name-kebab-case>-<YYYY-MM-DD>.md, written to the
working directory unless the user names another location. Full structure in
references/dossier-template.md.
Sections, in order:
- Identity confirmation. The disambiguation evidence and residual risk.
- Identity and reachability. Every handle, email, profile, and company observed, with first and last sighting dates.
- Relationship timeline. Every interaction in date order with source, receipt, and a one-line summary. Chronological, not relevance-ordered. The centerpiece.
- What they told you. Dated direct quotes from transcripts and threads. Their claims, commitments, and stated positions.
- What they tell the world. The public footprint, their company, their claims, each cited to a URL with a fetch date.
- Reconciliation. Conflicts, drift, internal-only, external-only, and agreements with independence assessed. Conflicts left as conflicts.
- Open questions and confidence per material claim, plus the coverage disclosure.
- Prep pack. Only where the purpose is a meeting or negotiation: what to ask and what to verify.
Guardrail
This skill reports on a human being, and the risk it carries is that a careful-looking document quietly becomes something the subject never consented to and the law never sanctioned. Everything below holds that line, and none of it is negotiable.
Purpose binding is mandatory and it comes first. No purpose, no retrieval. The purpose scopes what gets assembled, because scope creep is what turns due diligence into surveillance. Breadth that is merely useful rather than necessary to the stated purpose does not qualify under the GDPR necessity test (distillation sections 1 and 6).
This is not for employment screening. Stop and refuse where the purpose is hiring,
promotion, reassignment, or retention, or where the output is destined for an employer.
Refuse where no business relationship sits behind the request, and where the real object is a
protected characteristic. Flag and ask before continuing on independent contractor vetting.
Exact wording is in references/purpose-binding-and-scope.md.
External claims are reported as claims, never as fact. "Their site says X", never "X". That phrasing is what makes the Reconciliation section readable at all.
Conflicts stay conflicts. Never resolve a disagreement by picking the more interesting, more recent, more official, or more convenient reading, unless there is an actual reason and the reason is stated on the line.
Rate claims, never the person. There is no overall confidence score for a human being.
Provenance on every line. Internal claims carry a Littlebird receipt in the canonical format. External claims carry a URL and a fetch date. A reader can check any line. A line whose receipt reads "from Littlebird" fails the standard the dossier opens by promising.
Sensitive categories are excluded by construction, and are omitted even when the capture contains them: health, financial detail, legal and criminal history, family circumstances, protected characteristics, precise home location, breach and compromised credential data, and sanctions or PEP screening. Standard OSINT workflows include several of these and this skill deliberately does not (distillation section 6). If an excluded item surfaces during retrieval, drop it. Do not carry it into working notes and do not mention that something was withheld, because a line saying health information was omitted is a disclosure of health information.
Sanctions and PEP screening is a regulated function requiring licensed data. Say so and point the user to a specialist enhanced due diligence provider.
Third parties are incidental. Other people appear in the capture around the subject. Include them only where material to the stated purpose, and apply the same evidence standards and the same exclusions to them.
Empty retrieval ends the run. If the four passes and the meeting search return nothing, report which queries ran over which window, say nothing was found, and stop. Do not proceed to external research and present the result as a dossier. If the internal half is thin but not empty, say how thin, and carry that limitation into every claim resting on it.
Absence is not a finding. "No evidence found in the sources searched" and "it did not happen" are different claims and only the first is supportable.
Raw capture never ships. Retrieved material is working data. Process it, produce the dossier, delete the raw. Nothing goes to a third party without explicit approval of the actual text.
Not legal advice. The research archive behind this skill covers US and EU frameworks and contains no case law on the business-vetting boundary (distillation section 7). Say so where it matters.
Ship Gate
Ship Gate removed, research-only skill, produces no committable code.
Related skills
| Skill | Relationship |
|---|---|
pre-call-prep | Lighter and per-meeting. Run it before a call; run this when a named individual needs the full purpose-bound dossier |
client-health-radar | Watches the state of an account over time, where this looks at one person once, for a stated reason |
deal-pipeline-reconstructor | Rebuilds the deal history around a company, and supplies the commercial context a negotiation-prep dossier sits inside |
Signals
- GitHub stars
- 83
- Forks
- 37
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
osint-investigator-legioncodeinc- Source
- github.com/legioncodeinc/vibe-coding-tools