triage-inbox
Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company / role / dates / links / asks / deadline / sentiment), and suggest the next action. Writes inbox/triage-<YYYY-MM-DD>.json — consumed by infer-status and draft-reply.
- License 许可
- MIT
- 最近更新
- 2026-06-09
- Stars
- ★ 7
- Forks
- 1
01 前言 Front Matter
- name
- triage-inbox
- description
- Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company / role / dates / links / asks / deadline / sentiment), and suggest the next action. Writes inbox/triage-<YYYY-MM-DD>.json — consumed by infer-status and draft-reply.
- when_to_use
- Use when the user pastes one recruiter email OR JobClaw passes a batch from the AgentMail inbox. Front of the recruiter loop.
- allowed-tools
- Read, Write
- user-invocable
- true
03 SKILL.md 正文
triage-inbox
Tell the user (or JobClaw) what each email is and what to do about it. Hard rules: ../_shared/RULES.md. All enums, the decision table, the extraction-fields shape, and the suggested-action vocabulary live in ../../knowledge/status/taxonomy.md — read it first; don't re-derive.
Inputs
Single mode
- A pasted email:
from,subject,body, optionalthread(prior messages), optionaldate.
Batch mode
--in inbox/incoming.json:{ "emails": [ { "email_id": "...", "from": "...", "subject": "...", "body": "...", "date": "YYYY-MM-DD", "thread": ["..."] } ] }
If the input has only a body (no from/subject), warn but proceed — class confidence will be low unless body is decisive.
Method
-
Read the taxonomy.
../../knowledge/status/taxonomy.md— the 10 classes, the extraction-fields contract, the suggested-action vocab. -
For each email, classify into exactly one class. Mutually exclusive; pick the most specific match (e.g., a "we received your application" auto-message is
info, notscreen; a take-home request isassessment, notinterview-invite). Use the body + subject + sender domain together — sender alone is unreliable. -
Extract fields per the taxonomy's
Extraction fieldsblock (only fields the email genuinely provides — never invent):company,role,job_iddates[]— proposed slots / deadlines / start dates (ISO + time + tz + label)links[]—{ url, kind ∈ schedule|assessment|portal|other }asks[]— verbatim recruiter asks ("send updated CV", "share notice period")deadline— single hard cutoff if explicitsentiment ∈ {neutral, positive, negative}confidence ∈ {high, medium, low}— your own confidence in the classification
-
Suggest one action from the taxonomy's vocab (
reply-schedule | reply-accept | reply-decline | reply-ask | reply-info | acknowledge | ignore | escalate). Map per the decision table; always suggestescalatefor classotheror any classification withconfidence: low. -
Apply guardrails.
offeremails → suggestreply-ask(acknowledge + buy time + recommend/coach-negotiation). Never suggestreply-acceptdirectly.assessment/interview-inviteemails with a deadline within 48h → bump the email'spriorityfield tourgentin the output (extension on the schema; downstream tooling can sort by it).- If the body looks like phishing (suspicious domain, prize wording, urgency + a link) → class
spamregardless of subject.
Output
inbox/triage-<YYYY-MM-DD>.json
{
"as_of": "YYYY-MM-DD",
"triaged": [
{
"email_id": "...",
"from": "...",
"subject": "...",
"class": "rejection | screen | interview-invite | assessment | offer | recruiter-outbound | info | request-info | spam | other",
"extraction": {
"company": "...", "role": "...", "job_id": "...",
"dates": [...], "links": [...], "asks": [...],
"deadline": "YYYY-MM-DD | null",
"sentiment": "neutral | positive | negative",
"confidence": "high | medium | low"
},
"suggested_action": "...",
"priority": "normal | urgent",
"notes": "string | null"
}
]
}
Stdout
A concise table per email: id · class · company/role · action · priority · confidence. Highlight urgent rows and any escalate rows for the user to review.
Anti-patterns
- Treating "we received your application" as
screen(it'sinfo). - Collapsing
screenandinterview-invite— they trigger different downstream actions. - Inventing
job_id,dates, orcompanynot in the source text. - Setting
confidence: highon ambiguous emails just to clear the queue. Be honest —lowis more useful. - Suggesting
reply-acceptfor anoffer(must bereply-ask+ recommend/coach-negotiation). - Emoji.
Rubric
- [ ] Class is one of the 10 taxonomy values, exactly.
- [ ] Every
extraction.*field is sourced from the email (ornull/[]). - [ ] Suggested action is from the taxonomy vocab and consistent with the decision table.
- [ ] No
offeris paired withreply-accept. - [ ]
confidence: lowrows are flagged withsuggested_action: escalate. - [ ] Urgent items (assessment / interview-invite with ≤48h deadline) marked
priority: urgent.
Next steps
Triaged. Next: /infer-status to update the funnel, then /draft-reply for the suggested action.
04 同仓库更多 Skills
write-outreach
Write a short, profile-grounded cold outreach message to a recruiter, hiring manager, or potential referrer — LinkedIn DM or email — with one clear CTA and no flattery.
write-cover-letter
Produce a job-specific, profile-grounded cover letter in markdown — ≤ 350 words, ≤ 1 page, three paragraphs (hook → two quantified proofs → fit close). Reuses keywords from a prior tailor-resume sidecar when present. Writes a JSON sidecar reserved for a future /render-resume --kind cover-letter (rendercv).
tailor-resume
Produce a job-specific, ATS-optimized resume from the user's master profile and a target job — reordering, reframing, and surfacing the most relevant real experience and keywords. Enforces a content rubric (bullet shape, length, parallel grammar, metric coverage), then renders a polished PDF by default (via render-resume) and visually QAs it. Never fabricates.
score-fit
Score how well the user's master profile fits a specific job — an ATS-style match percentage with matched/missing keywords, strengths, gaps, and a clear apply-or-skip recommendation. Optionally writes a structured sidecar that tailor-resume consumes.
review-render
Visually QA a rendered resume PDF and auto-fix layout/content defects in a bounded loop: render → screenshot → deterministic gate → vision rubric → apply one fix → re-render, until it passes or hits a pass cap. Catches widows, under-fill, overflow, orphaned headers, and imbalance that text-only logic can't see.
research-company
Build a structured company × role brief — compensation, day-to-day, career growth, recent news, community sentiment (Reddit / Blind / Glassdoor), red flags, and a "fit for this user" view. Heavy reasoning — runs forked. Writes companies/<slug>.{md,json} sidecars consumed by prep-interview and coach-negotiation.