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.From its SKILL.md
npx -y skills add jain777/jobclaw-skills --skill triage-inboxAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.0 KB, as published. Nobody here has run it
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.