JD - Triage
Scores a job posting on two independent dimensions — how much you want it (five weighted axes against your own criteria) and how likely you are to get it (your skills vs its stated requirements) — then returns one action. Any market, language, or profession.
Rank
62
Safety
84
Downloads
1.1k
Updated
Oct 11, 2026
Version
1.1.1
Source
CLAWHUB
About
What it does, and when to use it.
Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.
Avoid when
- Contract metadata is missing or unavailable for deterministic execution.
Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing
Public facts
Every fact links back to the source it came from.
- Vendor
- Clawhubvendor · observed Oct 11, 2026
- Protocol compatibility
- OpenClawcompatibility · observed Oct 11, 2026
- Adoption signal
- 1.1K downloadsadoption · observed Oct 11, 2026
- Latest release
- 1.1.1release · observed Jul 27, 2026
- Handshake status
- UNKNOWNsecurity
Install and run
Setup complexity: low.
clawhub skill install s17fej7x2x0thkvnqzpvzkakh1872tj1:jd-triage- Install using `clawhub skill install s17fej7x2x0thkvnqzpvzkakh1872tj1:jd-triage` in an isolated environment before connecting it to live workloads.
- No published capability contract is available yet, so validate auth and request/response behavior manually.
- Review the upstream CLAWHUB listing at https://clawhub.ai/bwancoding/jd-triage before using production credentials.
Contract: missing
curl -s "https://www.xpersona.co/api/v1/agents/clawhub-bwancoding-jd-triage/snapshot"
Documentation
CLAWHUB
131,821 characters of source documentation, loaded on request.
Extracted files
5 files captured from the source.
SKILL.md
--- name: jd-triage description: "Career decision system for job seekers. Scores a job description on two independent dimensions — how much you want it (5 weighted axes against your stored criteria) and how likely you are to get it (your skills vs the JD's stated requirements) — then returns one concrete action. Use when (1) the user pastes a job description or recruiter message, (2) the user invokes /jd-triage or asks 'should I apply for this role', (3) the user asks to list, compare, or analyze previously evaluated roles, (4) the user asks what to learn next for a target role, (5) the user asks to set up, update, or reset their career criteria. Market-, language-, and profession-neutral; bootstraps a criteria profile on first run." --- # jd-triage · v1.1.1 A JD is evaluated on **two independent dimensions**, never collapsed into one number: - **Desirability** — do you want this? Five weighted axes scored against the user's stored criteria. - **Candidacy** — can you get this? The JD's stated must-have requirements vs the user's skills inventory. A role you want but can't get is a *stretch*, not a *skip*. A role you can get but don't want is a *backup*, not an *apply*. Collapsing both into one star rating destroys that distinction — which is the whole decision. Responsibilities: 1. **Bootstrap & maintain** a criteria profile at `~/.openclaw/workspace/jd_criteria.md`. 2. **Evaluate** a JD → two-dimension verdict + one action. 3. **Log** every evaluation to `~/.openclaw/workspace/jd_history.md`. 4. **Analyze / Plan** over accumulated history (see `references/analysis-commands.md`). ## Language **Default to English.** If the user writes in another language, respond entirely in that language for the rest of the session. | Surface | Language | |---|---| | All conversational output — bootstrap Q&A, verdicts, tables, **and the verdict tier as displayed** | User's language (English by default) | | `jd_criteria.md` field keys, `jd_history.md` structural labels, verdict tier names **in storage** | **Always English** — grep-friendly, stable across language switches | | Stored free-text values (org names, summaries, red-line rationales, JD quotes) | The language the user wrote them in, at write time | **Never auto-translate stored content.** When listing or comparing entries written in different languages, render structural labels in the current language and show stored free text verbatim. Quotes pulled from a JD keep the JD's original language even when the surrounding output is translated — a translated quote is no longer evidence. ## State machine On every invocation, read `~/.openclaw/workspace/jd_criteria.md` and branch: | State | Condition | Action | |---|---|---| | **S1: Missing** | File does not exist | **Quick Start** (5 questions) → proceed to the requested command | | **S2: Schema gap** | File exists, `schema_version` < 3 | Migrate silently where possible, ask only for fields that cannot be inferred (see `references/bootstrap.md § Mig
README.md
# jd-triage
**Two questions, kept apart: do you want it, and can you get it?**
Paste a job posting. Get a verdict against the criteria *you* defined — plus an
honest read on whether you'd clear the bar. Most JD filters collapse both into
one score, which is exactly the information you needed.
A skill for [OpenClaw](https://github.com/openclaw). Works in any market, any
language, any profession.
---
## What it does
- **Scores two independent dimensions.** Desirability from five weighted axes
against your stored criteria; Candidacy from the posting's stated must-haves
against your skills. A role you want but can't get is a **stretch**, not a
skip. A role you can get but don't want is a **backup**, not an apply.
- **Weights red lines by where they appear.** "Owns revenue targets" in the title
is an instant no. The same phrase in the last bullet, framed as *support*, is a
question to ask the recruiter — not a rejection.
- **Makes vibe judgments inspectable.** Every vibe rating quotes the posting and
names the anchor it reasoned from. Anchors carry your *reason*, so the skill
works on a 12-person studio nobody has heard of, not just famous logos.
- **Turns unknowns into questions.** Missing comp, ambiguous scope, unclear
remote policy — each becomes a line you can paste into a reply to the recruiter.
- **Logs everything, including rejections.** Over time, `analyze` shows which
patterns keep reaching you and which requirement you keep almost meeting.
## Starting up
Five questions. Not thirteen.
Quick Start asks for your role family and market, what titles you want, your
floors (comp with basis, locations, remote), your automatic no's, and one to
three organizations you admire *with a line on why each*. That is enough to
evaluate. Everything else is asked once, at the moment it first matters.
Prefer showing over telling? `/jd-triage learn` reads a handful of postings you
liked and a handful you passed on, then proposes your red lines and anchors for
you to accept or edit.
## Commands
| Command | What it does |
|---|---|
| Paste a posting, or `/jd-triage` | Evaluate |
| `/jd-triage quickstart` | The 5-question setup |
| `/jd-triage learn` | Derive criteria from example postings |
| `/jd-triage update` \| `reset` | Edit criteria, current values pre-filled |
| `/jd-triage history [apply\|out]` | Last 10 evaluations |
| `/jd-triage compare <id1> [<id2>]` | Side by side |
| `/jd-triage analyze` | Patterns across everything you've evaluated (needs 8+) |
| `/jd-triage plan` | Which gap to close next, ranked by what postings actually ask for |
Natural language works too, in your language: "should I apply to this",
"和上次对比", "what should I learn next".
## Sample output
```
🎯 STRETCH APPLY Desirability: Strong Candidacy: Stretch
Want it
Role fit ★★★★★
Domain ★★★★★
Org ★★★★☆
Vibe ★★★★☆ anchor "Basecamp" — why: "small team, no growth theater"
triggered by: "we shi_meta.json
{
"ownerId": "kn7fsvwdsd1ktv3vdfztehe7mx821jdh",
"slug": "jd-triage",
"version": "1.1.1",
"publishedAt": 1785122543293
}references/analysis-commands.md
# Analyze & Plan Both commands read accumulated history. Both refuse to run on too little data — a trend drawn from four postings is a horoscope. | Command | Needs | Below that | |---|---|---| | `/jd-triage analyze` | ≥ 8 entries in `jd_history.md` | Say how many exist and how many more are needed. Do not produce a partial report | | `/jd-triage plan` | `skills` and at least one `target_roles` entry | Point at `/jd-triage update`. If history has ≥ 8 entries, use it to rank gaps; otherwise say the ranking is based on the role description alone | **Report only what is in the data.** Empty category → "none yet". Never fill a section by inference. --- ## `/jd-triage analyze` Read every entry plus the criteria file. ``` 📊 <N> roles evaluated, <first date> → <last date> Where they came from <org trait>: <n> ← grouped by the user's own org_traits vocabulary <org trait>: <n> unclassified: <n> Titles that keep appearing <title pattern>: <n> What they ask for <requirement>: <n>/<N> postings — you have it (mastered) <requirement>: <n>/<N> postings — you're learning it ← highest ROI <requirement>: <n>/<N> postings — gap Red lines "<pattern>": fired <n>× — <k> OUT, <m> CONDITIONAL Your two dimensions Desirability: <n> Strong · <n> Good · <n> Weak · <n> Poor Candidacy: <n> Likely · <n> Plausible · <n> Stretch Both high: <n> ← the roles actually worth your time Outcomes (of <n> entries with Outcome filled) <action tier>: applied <n>, interviewing <n>, rejected <n>, offer <n> 💡 <2-4 observations, each traceable to a number above> ``` ### Rules - **Group by the user's own vocabulary.** Bucket organizations using their `org_traits`, not a taxonomy of your own. Anything that fits none is `unclassified` — a large unclassified count is itself the finding, and means their trait list is missing something. - **Requirement demand** is counted from stored requirement text across entries, cross-referenced with `skills`. Rank by `frequency × (1 − credit)`: something asked for constantly that the user is halfway through learning outranks something rarer they have not started. - **Red-line review.** If a red line has fired ≥ 3 times and *never* produced an OUT — only CONDITIONAL — say so and offer to demote it to a negative vibe anchor. It is behaving like a preference, not a gate. If a red line has never fired at all across ≥ 15 entries, mention it once; it may be aimed at postings the user is not even seeing. - **Calibration, only with outcomes.** If ≥ 5 entries have an `Outcome`, compare predicted Candidacy against what happened. Report it flatly: *"Of 6 rated Stretch, 3 got a first interview — the Candidacy read may be running pessimistic."* Fewer than 5 → skip the section entirely, do not hedge a guess. - **Never infer market conditions.** The sample is the user's inbox, not the job market. Say "the roles reaching you", never "the market is". --- ## `/jd-triage plan` Per target
references/bootstrap.md
# Bootstrap
Three ways in. Default to **Quick Start** — a profile that exists is worth more
than a perfect profile the user abandoned halfway through.
| Mode | When | Cost |
|---|---|---|
| **Quick Start** | S1 (no file), `/jd-triage quickstart` | 5 questions |
| **Derive from examples** | `/jd-triage learn`, or offered when a profile is thin | Paste a few JDs |
| **Full** | S5 (`update` / `reset`), or user asks | All fields |
Write to `~/.openclaw/workspace/jd_criteria.md` using `assets/criteria-template.yaml`.
Field keys English; values in the user's language.
## Using presets
`assets/presets/*.yaml` are **menus, never defaults**. Pick the preset matching
the user's `role_family`, show the suggested traits and red-line starters as a
numbered list, and write only the lines the user selects — reworded however they
like. Never silently write a preset value. `axis_weights` are the one exception:
they are a starting distribution, applied unless the user changes them, and
mentioned once so the user knows they exist.
---
## Quick Start — 5 questions
Ask one at a time. Accept "skip" on any of them.
**1. Context.** "What kind of role, what market, and which languages can you work
in?" → `context.role_family`, `context.market`, `context.languages`.
From the market, infer `context.comp_convention` and **state the inference for
confirmation** ("I'll assume comp is quoted as an all-in annual number — correct?").
**2. Target.** "What titles are you looking for, and what should the organization
actually do?" → `soft_axes.target_title_keywords`, `soft_axes.target_domains`.
**3. Floors.** "What's the lowest offer you'd accept — and is that base or
all-in? Where can you work, and is remote acceptable?" → `hard_gates.comp_floor`
(amount, currency, period, basis), `hard_gates.locations`, `hard_gates.remote_ok`.
**4. Automatic no's.** "Anything that makes a role an instant no — and why?"
→ `hard_gates.red_lines`. Push for the *why* on each one; it is what makes
matching work across languages and rewordings. "None" is a valid answer.
**5. Anchors.** Use the preset's `vibe_prompt`. Ask for 1–3 organizations, teams,
or products the user admires, **each with one line on why**.
→ `soft_axes.vibe_anchors_positive`.
Then write the file and say plainly what is not yet filled:
> Saved. Org fit and Candidacy will show *info insufficient* until you add org
> traits and your skills — I'll ask for those the first time they matter.
### Just-in-time capture
Do not front-load the rest. Ask for a field the first time an evaluation
actually needs it, once, inline:
- **Skills** — before scoring Candidacy for the first time: "To score whether you
can get this, I need your skills. List what you could be interviewed on today,
and separately what you're actively learning." → `skills.mastered`,
`skills.learning`. Write them to the file so this is asked only once.
- **Org traits** — the first time a JD's org type looks decision-relevant.
- **Negative anchors** — theAionUi
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
activepieces
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
cherry-studio
AI productivity studio with smart chat, autonomous agents, and 300+ assistants.
CopilotKit
The Frontend for Agents & Generative UI. React + Angular
Machine-readable data
The same record, as JSON, for agents and crawlers.
{
"facts": [
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/bwancoding/skills/jd-triage",
"sourceUrl": "https://clawhub.ai/bwancoding/skills/jd-triage",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-11T11:15:45.112Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-bwancoding-jd-triage/contract",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-bwancoding-jd-triage/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-10-11T11:15:45.112Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "1.1K downloads",
"href": "https://clawhub.ai/bwancoding/jd-triage",
"sourceUrl": "https://clawhub.ai/bwancoding/jd-triage",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-11T11:15:45.112Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "1.1.1",
"href": "https://clawhub.ai/bwancoding/jd-triage",
"sourceUrl": "https://clawhub.ai/bwancoding/jd-triage",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-07-27T03:22:23.293Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-bwancoding-jd-triage/trust",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-bwancoding-jd-triage/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
],
"events": [
{
"eventType": "release",
"title": "Release 1.1.1",
"description": "Fixes a language leak: a non-English posting in a non-English conversation came back with its verdict and headings in English. The screen now takes the reader's language including the tier; the English token stays in jd_history.md where history and compare parse it. No schema or scoring change.",
"href": "https://clawhub.ai/bwancoding/jd-triage",
"sourceUrl": "https://clawhub.ai/bwancoding/jd-triage",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-07-27T03:22:23.293Z",
"isPublic": true
}
]
}Record generated Oct 11, 2026.
