Assess recruiter outreach and draft a calibrated response. Triggers on /gaj:respond, "reply to recruiter", "respond to [name]", "draft a response to [message]", "assess this opportunity", or any request to evaluate and reply to recruiter outreach.
Assess interest level in a recruiter's outreach, draft a mode-appropriate response, and store all correspondence.
Read ~/gaj/gaj.json at the start. Use:
models.respond for response drafting subagents (default: opus)The interest assessment and response drafting both run at the configured model. When delegating to sherlock for detective research, sherlock uses its own model config.
The user will provide one of:
Extract from the message: recruiter name, company, role, platform (LinkedIn/email), and any compensation details mentioned.
Search the pipeline for the company:
npx tsx scripts/pipeline-cli.ts search '<company name>'
If a match exists, use that job ID. If multiple matches, show them and ask the user to pick.
If no match, offer to create a new pipeline entry:
npx tsx scripts/pipeline-cli.ts add '{"company_name":"<company>","job_title":"<role>","status":"pending-review","source":"recruiter"}'
Store the recruiter's message in the correspondence table:
npx tsx scripts/pipeline-cli.ts log-message '{"job_id":<id>,"direction":"inbound","platform":"<linkedin|email>","sender_name":"<recruiter name>","message_text":"<their message>"}'
Before assessing interest or drafting any response, run the sherlock investigation.
Check for existing findings:
npx tsx scripts/pipeline-cli.ts get-job <job-id>
If job_data.sherlock exists and investigated_at is < 24 hours old, use the
existing findings. Skip to Step 4b.
If no findings exist, run a full sherlock investigation using the process defined in @prompts/sherlock-system.md. Use these inputs:
Launch the 5 investigation dimensions as parallel subagents per the sherlock system prompt. Store findings:
npx tsx scripts/pipeline-cli.ts update <id> 'job_data' '<sherlock findings JSON>'
Present a condensed detective report to the user (sections: company profile, recruiter profile, red flags, green flags, compensation analysis). This is for the user's eyes only.
CRITICAL: The detective report is a secret weapon for the user only. Never reveal research findings in any outbound communication. Outbound messages must reference ONLY information the recruiter explicitly provided. Do not quote back salary numbers (forces re-anchoring), hint at knowing the unnamed client, or reference Glassdoor/market data. Ask open questions that make the recruiter reveal information rather than showing you already know it. The edge only works if it stays hidden.
User preferences:
~/gaj/context/about-me.md exists. If yes, read it for role targets, salary floor, tech stack, and evaluation criteria.Conversation history:
npx tsx scripts/pipeline-cli.ts get-correspondence <job-id>
If prior messages exist, factor them into the response (don't repeat questions already answered, acknowledge previous exchanges).
Apply the 5 criteria from @prompts/recruiter-response-system.md:
Classify as: strong-interest, curious, warm-decline, or hard-pass.
For hard-pass: explain the assessment to the user, do not draft a response, and offer to mark the job as filtered.
Read @prompts/recruiter-response-system.md for generation rules. Read @prompts/response-templates.md for the structural scaffold matching the classification. Apply @prompts/writing-rules.md to all output.
Draft a response using the appropriate mode:
strong-interest -> Mode 1 (Strong Interest)curious -> Mode 2 (Curious but Cautious)warm-decline -> Mode 3 (Warm Decline)Show the user:
After presenting, offer:
Iterate until the user approves.
After user approval, log the outbound draft:
npx tsx scripts/pipeline-cli.ts log-message '{"job_id":<id>,"direction":"outbound","message_text":"<approved text>","ai_draft":"<original draft>","tone":"<tone used>","classification":"<classification>"}'
If the interest assessment suggests a status change, offer it:
strong-interest -> suggest approved statuscurious -> keep at pending-reviewwarm-decline -> suggest rejected statusnpx tsx scripts/pipeline-cli.ts status <id> <new-status>
npx tsx scripts/pipeline-cli.ts search '<company>'
npx tsx scripts/pipeline-cli.ts add '<json>'
npx tsx scripts/pipeline-cli.ts log-message '<json>'
npx tsx scripts/pipeline-cli.ts get-correspondence <job-id>
npx tsx scripts/pipeline-cli.ts status <id> <new-status>
If the user says "follow up with [recruiter]" or "they haven't responded":
get-correspondence