[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M74YF106JXZQ3DMDMVR722YH":3,"skill-same:01M74YF106JXZQ3DMDMVR722YH":50},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":49},"01M74YF106JXZQ3DMDMVR722YH","triage-inbox",null,"Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company \u002F role \u002F dates \u002F links \u002F asks \u002F deadline \u002F sentiment), and suggest the next action. Writes inbox\u002Ftriage-\u003CYYYY-MM-DD>.json — consumed by infer-status and draft-reply.","jain777\u002Fjobclaw-skills","jain777","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F57412580?v=4","01M74YCRYXSRMZFKERV6JS8M5D","Jeevesh Jain","01M74YCRZK4C3NNAEDWG5W8YMP",7,"MIT","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriage-inbox\u002FSKILL.md",[],[],"2026-11-11 17:31:23",false,"---\nname: triage-inbox\ndescription: >\n  Classify a recruiting email (or a batch) into one of the 10 canonical email classes,\n  extract structured fields (company \u002F role \u002F dates \u002F links \u002F asks \u002F deadline \u002F sentiment),\n  and suggest the next action. Writes inbox\u002Ftriage-\u003CYYYY-MM-DD>.json — consumed by\n  infer-status and draft-reply.\nwhen_to_use: >\n  Use when the user pastes one recruiter email OR JobClaw passes a batch from the\n  AgentMail inbox. Front of the recruiter loop.\nuser-invocable: true\nallowed-tools: Read, Write\n---\n\n# triage-inbox\n\nTell the user (or JobClaw) what each email **is** and what to do about it. **Hard rules:** [`..\u002F_shared\u002FRULES.md`](..\u002F_shared\u002FRULES.md). All enums, the decision table, the extraction-fields shape, and the suggested-action vocabulary live in [`..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md`](..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md) — read it first; don't re-derive.\n\n## Inputs\n\n### Single mode\n- A pasted email: `from`, `subject`, `body`, optional `thread` (prior messages), optional `date`.\n\n### Batch mode\n- `--in inbox\u002Fincoming.json`:\n  ```jsonc\n  { \"emails\": [ { \"email_id\": \"...\", \"from\": \"...\", \"subject\": \"...\", \"body\": \"...\", \"date\": \"YYYY-MM-DD\", \"thread\": [\"...\"] } ] }\n  ```\n\nIf the input has only a body (no from\u002Fsubject), warn but proceed — class confidence will be `low` unless body is decisive.\n\n## Method\n\n0. **Read the taxonomy.** [`..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md`](..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md) — the 10 classes, the extraction-fields contract, the suggested-action vocab.\n\n1. **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`, not `screen`; a take-home request is `assessment`, not `interview-invite`). Use the body + subject + sender domain together — sender alone is unreliable.\n\n2. **Extract fields** per the taxonomy's `Extraction fields` block (only fields the email genuinely provides — never invent):\n   - `company`, `role`, `job_id`\n   - `dates[]` — proposed slots \u002F deadlines \u002F start dates (ISO + time + tz + label)\n   - `links[]` — `{ url, kind ∈ schedule|assessment|portal|other }`\n   - `asks[]` — verbatim recruiter asks (\"send updated CV\", \"share notice period\")\n   - `deadline` — single hard cutoff if explicit\n   - `sentiment ∈ {neutral, positive, negative}`\n   - `confidence ∈ {high, medium, low}` — your own confidence in the classification\n\n3. **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** suggest `escalate` for class `other` or any classification with `confidence: low`.\n\n4. **Apply guardrails.**\n   - `offer` emails → suggest `reply-ask` (acknowledge + buy time + recommend `\u002Fcoach-negotiation`). **Never** suggest `reply-accept` directly.\n   - `assessment` \u002F `interview-invite` emails with a deadline within 48h → bump the email's `priority` field to `urgent` in the output (extension on the schema; downstream tooling can sort by it).\n   - If the body looks like phishing (suspicious domain, prize wording, urgency + a link) → class `spam` regardless of subject.\n\n## Output\n\n### `inbox\u002Ftriage-\u003CYYYY-MM-DD>.json`\n```jsonc\n{\n  \"as_of\": \"YYYY-MM-DD\",\n  \"triaged\": [\n    {\n      \"email_id\": \"...\",\n      \"from\": \"...\",\n      \"subject\": \"...\",\n      \"class\": \"rejection | screen | interview-invite | assessment | offer | recruiter-outbound | info | request-info | spam | other\",\n      \"extraction\": {\n        \"company\": \"...\", \"role\": \"...\", \"job_id\": \"...\",\n        \"dates\": [...], \"links\": [...], \"asks\": [...],\n        \"deadline\": \"YYYY-MM-DD | null\",\n        \"sentiment\": \"neutral | positive | negative\",\n        \"confidence\": \"high | medium | low\"\n      },\n      \"suggested_action\": \"...\",\n      \"priority\": \"normal | urgent\",\n      \"notes\": \"string | null\"\n    }\n  ]\n}\n```\n\n### Stdout\nA concise table per email: `id · class · company\u002Frole · action · priority · confidence`. Highlight `urgent` rows and any `escalate` rows for the user to review.\n\n## Anti-patterns\n- Treating \"we received your application\" as `screen` (it's `info`).\n- Collapsing `screen` and `interview-invite` — they trigger different downstream actions.\n- Inventing `job_id`, `dates`, or `company` not in the source text.\n- Setting `confidence: high` on ambiguous emails just to clear the queue. Be honest — `low` is more useful.\n- Suggesting `reply-accept` for an `offer` (must be `reply-ask` + recommend `\u002Fcoach-negotiation`).\n- Emoji.\n\n## Rubric\n- [ ] Class is one of the 10 taxonomy values, exactly.\n- [ ] Every `extraction.*` field is sourced from the email (or `null`\u002F`[]`).\n- [ ] Suggested action is from the taxonomy vocab and consistent with the decision table.\n- [ ] No `offer` is paired with `reply-accept`.\n- [ ] `confidence: low` rows are flagged with `suggested_action: escalate`.\n- [ ] Urgent items (assessment \u002F interview-invite with ≤48h deadline) marked `priority: urgent`.\n\n## Next steps\nTriaged. Next: `\u002Finfer-status` to update the funnel, then `\u002Fdraft-reply` for the suggested action.\n","# triage-inbox\n\nTell the user (or JobClaw) what each email **is** and what to do about it. **Hard rules:** [`..\u002F_shared\u002FRULES.md`](..\u002F_shared\u002FRULES.md). All enums, the decision table, the extraction-fields shape, and the suggested-action vocabulary live in [`..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md`](..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md) — read it first; don't re-derive.\n\n## Inputs\n\n### Single mode\n- A pasted email: `from`, `subject`, `body`, optional `thread` (prior messages), optional `date`.\n\n### Batch mode\n- `--in inbox\u002Fincoming.json`:\n  ```jsonc\n  { \"emails\": [ { \"email_id\": \"...\", \"from\": \"...\", \"subject\": \"...\", \"body\": \"...\", \"date\": \"YYYY-MM-DD\", \"thread\": [\"...\"] } ] }\n  ```\n\nIf the input has only a body (no from\u002Fsubject), warn but proceed — class confidence will be `low` unless body is decisive.\n\n## Method\n\n0. **Read the taxonomy.** [`..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md`](..\u002F..\u002Fknowledge\u002Fstatus\u002Ftaxonomy.md) — the 10 classes, the extraction-fields contract, the suggested-action vocab.\n\n1. **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`, not `screen`; a take-home request is `assessment`, not `interview-invite`). Use the body + subject + sender domain together — sender alone is unreliable.\n\n2. **Extract fields** per the taxonomy's `Extraction fields` block (only fields the email genuinely provides — never invent):\n   - `company`, `role`, `job_id`\n   - `dates[]` — proposed slots \u002F deadlines \u002F start dates (ISO + time + tz + label)\n   - `links[]` — `{ url, kind ∈ schedule|assessment|portal|other }`\n   - `asks[]` — verbatim recruiter asks (\"send updated CV\", \"share notice period\")\n   - `deadline` — single hard cutoff if explicit\n   - `sentiment ∈ {neutral, positive, negative}`\n   - `confidence ∈ {high, medium, low}` — your own confidence in the classification\n\n3. **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** suggest `escalate` for class `other` or any classification with `confidence: low`.\n\n4. **Apply guardrails.**\n   - `offer` emails → suggest `reply-ask` (acknowledge + buy time + recommend `\u002Fcoach-negotiation`). **Never** suggest `reply-accept` directly.\n   - `assessment` \u002F `interview-invite` emails with a deadline within 48h → bump the email's `priority` field to `urgent` in the output (extension on the schema; downstream tooling can sort by it).\n   - If the body looks like phishing (suspicious domain, prize wording, urgency + a link) → class `spam` regardless of subject.\n\n## Output\n\n### `inbox\u002Ftriage-\u003CYYYY-MM-DD>.json`\n```jsonc\n{\n  \"as_of\": \"YYYY-MM-DD\",\n  \"triaged\": [\n    {\n      \"email_id\": \"...\",\n      \"from\": \"...\",\n      \"subject\": \"...\",\n      \"class\": \"rejection | screen | interview-invite | assessment | offer | recruiter-outbound | info | request-info | spam | other\",\n      \"extraction\": {\n        \"company\": \"...\", \"role\": \"...\", \"job_id\": \"...\",\n        \"dates\": [...], \"links\": [...], \"asks\": [...],\n        \"deadline\": \"YYYY-MM-DD | null\",\n        \"sentiment\": \"neutral | positive | negative\",\n        \"confidence\": \"high | medium | low\"\n      },\n      \"suggested_action\": \"...\",\n      \"priority\": \"normal | urgent\",\n      \"notes\": \"string | null\"\n    }\n  ]\n}\n```\n\n### Stdout\nA concise table per email: `id · class · company\u002Frole · action · priority · confidence`. Highlight `urgent` rows and any `escalate` rows for the user to review.\n\n## Anti-patterns\n- Treating \"we received your application\" as `screen` (it's `info`).\n- Collapsing `screen` and `interview-invite` — they trigger different downstream actions.\n- Inventing `job_id`, `dates`, or `company` not in the source text.\n- Setting `confidence: high` on ambiguous emails just to clear the queue. Be honest — `low` is more useful.\n- Suggesting `reply-accept` for an `offer` (must be `reply-ask` + recommend `\u002Fcoach-negotiation`).\n- Emoji.\n\n## Rubric\n- [ ] Class is one of the 10 taxonomy values, exactly.\n- [ ] Every `extraction.*` field is sourced from the email (or `null`\u002F`[]`).\n- [ ] Suggested action is from the taxonomy vocab and consistent with the decision table.\n- [ ] No `offer` is paired with `reply-accept`.\n- [ ] `confidence: low` rows are flagged with `suggested_action: escalate`.\n- [ ] Urgent items (assessment \u002F interview-invite with ≤48h deadline) marked `priority: urgent`.\n\n## Next steps\nTriaged. Next: `\u002Finfer-status` to update the funnel, then `\u002Fdraft-reply` for the suggested action.\n",{"name":5,"description":24,"when_to_use":25,"allowed-tools":26,"user-invocable":27},"Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company \u002F role \u002F dates \u002F links \u002F asks \u002F deadline \u002F sentiment), and suggest the next action. Writes inbox\u002Ftriage-\u003CYYYY-MM-DD>.json — consumed by infer-status and draft-reply.\n","Use when the user pastes one recruiter email OR JobClaw passes a batch from the AgentMail inbox. Front of the recruiter loop.\n","Read, Write",true,"main","68211e04d37044c49c3a91f3a29ce9647fada95f","skills\u002Ftriage-inbox",1,"https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills","https:\u002F\u002Fgithub.com\u002Fjain777","https:\u002F\u002Fjeevesh.me\u002F","Product Manager | Builder | Claude Coder","2026-06-09 13:47:19",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":27},[39,42,45],{"tool":40,"command":41},"npx","npx skills add jain777\u002Fjobclaw-skills --skill triage-inbox",{"tool":43,"command":44},"bunx","bunx skills add jain777\u002Fjobclaw-skills --skill triage-inbox",{"tool":46,"command":47},"pnpm","pnpm dlx skills add jain777\u002Fjobclaw-skills --skill triage-inbox","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriage-inbox\u002FSKILL.md",[],[51,58,65,72,79,86],{"skillNo":52,"name":53,"nameZh":6,"description":54,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":57,"publishedAt":19},"01M74YF759275CXY2ZWZBA1PD0","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.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-outreach\u002FSKILL.md",[],[],{"skillNo":59,"name":60,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":19},"01M74YF3WPDQ9D2PJ00XWH29EA","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 \u002Frender-resume --kind cover-letter (rendercv).","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-cover-letter\u002FSKILL.md",[],[],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":19},"01M74YEX348VFDH9FG9C00WKG3","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.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftailor-resume\u002FSKILL.md",[],[],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":19},"01M74YESFCVSEG3C0AB8QXVJBR","score-fit","Score how well the user's master profile fits a specific job — an ATS-style match percentage with matched\u002Fmissing keywords, strengths, gaps, and a clear apply-or-skip recommendation. Optionally writes a structured sidecar that tailor-resume consumes.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscore-fit\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":19},"01M74YEP224H6Z9Q2K16YZ47K8","review-render","Visually QA a rendered resume PDF and auto-fix layout\u002Fcontent 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.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-render\u002FSKILL.md",[],[],{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":19},"01M74YEHQPVC64D5BS57BY2EYB","research-company","Build a structured company × role brief — compensation, day-to-day, career growth, recent news, community sentiment (Reddit \u002F Blind \u002F Glassdoor), red flags, and a \"fit for this user\" view. Heavy reasoning — runs forked. Writes companies\u002F\u003Cslug>.{md,json} sidecars consumed by prep-interview and coach-negotiation.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fresearch-company\u002FSKILL.md",[],[]]