Deep detective investigation on any company, recruiter, or job listing. Triggers on /gaj:sherlock, "investigate [company]", "research [company]", "sherlock [anything]", "vet this company", "is [company] legit", or any request for deep company/recruiter/listing research.
Run deep investigative research on a company, recruiter, job listing, or any combination. Produces an opinionated intelligence report with evidence-backed red flags, compensation analysis, and a pass/pursue/dig-deeper verdict.
Read ~/gaj/gaj.json at the start of every investigation. Use:
models.sherlock_dimensions for the 5 parallel investigation subagents (default: sonnet)models.sherlock_verdict for the final verdict synthesis (default: opus)When spawning investigation dimension subagents (recruiter analysis, company analysis,
mystery client, compensation check, red flag detection), use the model specified by
models.sherlock_dimensions.
When synthesizing all dimension findings into the final narrative report and
pass/pursue/dig-deeper verdict, use the model specified by models.sherlock_verdict.
The user provides any combination of:
Parse rules:
| Input pattern | Type | Action |
|---|---|---|
Contains linkedin.com/jobs/view/ or /comm/jobs/view/ | LinkedIn job URL | WebFetch the listing, extract title, company, location, pay, JD, poster |
Contains linkedin.com/in/ | LinkedIn profile URL | WebFetch the profile, extract name, company, headline |
| Any other URL | Company website | WebFetch the page, extract company info |
| Multi-line text with role/requirements language | Pasted JD | Parse title, company, stack, comp, location from text |
| Short text, no URL | Name | Ask: "Is this a company name, a person, or something else?" |
When inputs overlap (URL + pasted JD), merge. URL-sourced facts take precedence. Pasted text fills gaps.
Search the pipeline for the company:
npx tsx scripts/pipeline-cli.ts search '<company name>'
If a match exists:
npx tsx scripts/pipeline-cli.ts get-job <id>
If job_data.sherlock.investigated_at exists and is < 24 hours old, ask:
"I have recent findings for [company]. Re-investigate or show existing?"
If the user wants existing findings, present the stored report and stop.
Read @prompts/sherlock-system.md for the full investigation framework.
Launch up to 5 parallel subagents, one per investigation dimension. Each subagent gets:
Subagent dispatch:
Read ~/gaj/context/about-me.md for the user's salary floor, tech stack, and role targets. Pass these to the comp and stack fit investigators.
Collect findings from all subagents. Follow the narrative output template from @prompts/sherlock-system.md exactly. Omit sections with no data.
Apply @prompts/writing-rules.md to all narrative output.
End the report with a Sources section listing all URLs used as markdown links.
If a pipeline entry was found in Step 2, store the structured findings:
npx tsx scripts/pipeline-cli.ts update <id> 'job_data' '<JSON string of sherlock findings>'
Use the JSON schema from @prompts/sherlock-system.md.
If no pipeline entry exists, offer at the end of the report: "Want me to add this to your pipeline?"
If the user accepts, create the entry:
npx tsx scripts/pipeline-cli.ts add '{"company_name":"<company>","job_title":"<role>","status":"pending-review","source":"sherlock","job_data":<findings JSON>}'
When called by /gaj:respond, sherlock runs the same process but:
npx tsx scripts/pipeline-cli.ts search '<company>'
npx tsx scripts/pipeline-cli.ts get-job <id>
npx tsx scripts/pipeline-cli.ts update <id> 'job_data' '<json>'
npx tsx scripts/pipeline-cli.ts add '<json>'