Jobhunt

Skills: Jobhunt

The /jobhunt skill manages your job search as a knowledge graph. The agent acts as your career coach, building understanding of positions, companies, and your fit over time. It supports two operational modes: interactive (Claude Code session) and automated (OpenClaw cron forager running overnight).

Overview

The skill follows the five-stage curation workflow:

  1. Foraging — Discover job postings (manual URLs or automated forager)
  2. Ingestion — Fetch raw content, store as artifact with provenance
  3. Sensemaking — Agent reads artifact, extracts entities, creates notes
  4. Analysis — Query across notes to answer gap analysis questions
  5. Reporting — Dashboard views of pipeline and skills

Quick Start

Build Your Skill Profile

Before analyzing jobs, add your skills:

You: My skills are:
     - Python: strong (5 years production)
     - Machine Learning: strong (built models at CZI)
     - Distributed Systems: some (built caching layer, some k8s)
     - Rust: learning (started last month)

Agent: [Creates skill profile with levels]

Added 4 skills to your profile. I'll use these for fit analysis.

Or directly:

uv run python .claude/skills/jobhunt/jobhunt.py add-skill \
    --name "Python" --level "strong"

uv run python .claude/skills/jobhunt/jobhunt.py add-skill \
    --name "Distributed Systems" --level "some" \
    --description "Built caching layer, some k8s experience"

Add a Job Posting

You: I found a job at Anthropic:
     https://boards.greenhouse.io/anthropic/jobs/123456

Agent: I'll ingest and analyze this posting...

[Fetches job description]
[Extracts company info, requirements, qualifications]
[Compares against your skill profile]
[Creates fit analysis]

## Analysis: Research Engineer at Anthropic

**Your Fit: 82%**

| Requirement | Level | You | Match |
|-------------|-------|-----|-------|
| Python | Required | Strong | ✓ |
| ML Systems | Required | Strong | ✓ |
| Distributed Systems | Required | Some | △ |
| Rust | Preferred | None | ✗ |

Key Gap: Distributed systems required; recommend DDIA + MIT 6.824.

Want me to set a priority level?

Automated Forager

The forager automates discovery by searching job boards and aggregators, filtered by your skill profile. This is the OpenClaw killer feature: configure it once, run nightly via cron, triage results in Telegram.

Setup: Add Search Sources

# Company boards (no auth required)
uv run python .claude/skills/jobhunt/job_forager.py add-source \
    --name "Anthropic" --platform greenhouse --token anthropic

uv run python .claude/skills/jobhunt/job_forager.py add-source \
    --name "LangChain" --platform ashby --token langchain

# Aggregator sources
uv run python .claude/skills/jobhunt/job_forager.py add-source \
    --name "ML Jobs" --platform linkedin \
    --query "machine learning" --location "San Francisco"

uv run python .claude/skills/jobhunt/job_forager.py add-source \
    --name "Remote ML" --platform remotive \
    --query "machine learning"

Heartbeat: Full Discovery Cycle

# Search all sources, filter by skill profile, dedup, store candidates
uv run python .claude/skills/jobhunt/job_forager.py heartbeat \
    --min-relevance 0.3

Triage Candidates

# List new candidates from overnight run
uv run python .claude/skills/jobhunt/job_forager.py list-candidates --status new

# Review and triage
uv run python .claude/skills/jobhunt/job_forager.py triage \
    --id candidate-abc123 --action reviewed

# Promote to full position (triggers sensemaking workflow)
uv run python .claude/skills/jobhunt/job_forager.py promote \
    --id candidate-abc123

Supported Platforms

Platform Type Auth Key Arg
greenhouse Company board None --token (slug, e.g. anthropic)
lever Company board None --token (slug)
ashby Company board None --token (slug)
linkedin Aggregator None --query, --location
remotive Aggregator None --query, --location
adzuna Aggregator API key --query, --location

OpenClaw Cron Configuration

To run the forager overnight via OpenClaw, add a cron entry in openclaw.yaml:

crons:
  - name: jobhunt-forager
    schedule: "0 2 * * *"    # 2am nightly
    command: |
      uv run python .claude/skills/jobhunt/job_forager.py heartbeat \
          --min-relevance 0.3
    notify_telegram: true     # sends candidate count to Telegram on completion

See OpenClaw Configuration for full cron and notification setup.

Sensemaking Workflow (7 Steps)

When you say “analyze this job posting” or after promoting a forager candidate, the agent follows this workflow:

Step 1: Get the Artifact

uv run python .claude/skills/jobhunt/jobhunt.py show-artifact --id "artifact-xyz"

Step 2: Read and Comprehend

The agent reads the full job description, identifying:

  • Company name, job title, location, salary, remote policy
  • Requirements, responsibilities, qualifications
  • Team info, culture signals, growth opportunities

Step 3: Create/Update Company

uv run python .claude/skills/jobhunt/jobhunt.py add-company \
    --name "Anthropic" \
    --url "https://anthropic.com" \
    --description "AI safety research company"

Step 4: Extract Requirements as Fragments

uv run python .claude/skills/jobhunt/jobhunt.py add-requirement \
    --position "position-abc123" \
    --skill "Python" \
    --level "required" \
    --your-level "strong" \
    --content "5+ years Python experience, focus on ML systems"

uv run python .claude/skills/jobhunt/jobhunt.py add-requirement \
    --position "position-abc123" \
    --skill "Distributed Systems" \
    --level "required" \
    --your-level "some" \
    --content "Experience with distributed training at scale"

Step 5: Create Analysis Notes

# Fit analysis note (with score)
uv run python .claude/skills/jobhunt/jobhunt.py add-note \
    --about "position-abc123" \
    --type fit-analysis \
    --content "Strong fit for core requirements. Gap in distributed systems." \
    --fit-score 0.82 \
    --fit-summary "Strong technical fit, one gap to address"

# Company research note
uv run python .claude/skills/jobhunt/jobhunt.py add-note \
    --about "company-xyz" \
    --type research \
    --content "Series C, $4B raised. Strong safety focus. ~400 employees."

# Skill gap note
uv run python .claude/skills/jobhunt/jobhunt.py add-note \
    --about "position-abc123" \
    --type skill-gap \
    --content "Distributed systems required. Recommend: DDIA book, MIT 6.824 course."

Step 6: Flag Uncertainties

uv run python .claude/skills/jobhunt/jobhunt.py tag \
    --entity "requirement-xyz" --tag "uncertain"

Step 7: Report to User

The agent summarizes: company overview, fit score breakdown, key gaps, suggested next steps.

Application Tracking

# Update status
uv run python .claude/skills/jobhunt/jobhunt.py update-status \
    --position "position-abc123" \
    --status "applied" \
    --date "2025-02-05"

# Interaction note (phone screen)
uv run python .claude/skills/jobhunt/jobhunt.py add-note \
    --about "position-abc123" \
    --type interaction \
    --content "Phone screen went well, moving to technical round." \
    --interaction-type "call" \
    --interaction-date "2025-02-05"

# Strategy note
uv run python .claude/skills/jobhunt/jobhunt.py add-note \
    --about "position-abc123" \
    --type strategy \
    --content "Lead with distributed systems work from caching project."
Status values: researching applied phone-screen interviewing offer rejected withdrawn

Skill Gap Analysis

You: What skill gaps do I have across my high-priority positions?

Agent: [Queries positions, aggregates gaps]

Across 3 high-priority positions:

| Skill | Frequency | Your Level | Priority |
|-------|-----------|------------|----------|
| Distributed Systems | 3/3 | Some | Critical |
| Kubernetes | 2/3 | Some | High |
| Rust | 1/3 | Learning | Medium |

I recommend focusing on Distributed Systems first.
Want me to find learning resources?

Add Learning Resources

uv run python .claude/skills/jobhunt/jobhunt.py add-resource \
    --name "Designing Data-Intensive Applications" \
    --type "book" \
    --url "https://dataintensive.net" \
    --hours 30 \
    --skills "distributed-systems" "system-design"

Command Reference

Profile Commands

Command Description Key Args
add-skill Add to your skill profile --name, --level
list-skills Show your skills  

Ingestion Commands

Command Description Key Args
ingest-job Fetch job URL, store raw artifact --url, --priority, --tags
list-artifacts List artifacts by status --status
show-artifact Get artifact content --id

Sensemaking Commands

Command Description Key Args
add-company Add company --name, --url
add-position Add position manually --title
add-requirement Add skill requirement --position, --skill, --level, --your-level
add-note Create any note type --about, --type, --content
add-resource Add learning resource --name, --type, --url

Query Commands

Command Description Key Args
list-pipeline Show applications --status, --priority
show-position Position details --id
show-company Company details --id
show-gaps Skill gap analysis  
learning-plan Prioritized study list  
update-status Change application status --position, --status
tag Tag an entity --entity, --tag
search-tag Find by tag --tag
link-collection Link paper collection to skill gap --collection, --skill

Report Commands (Markdown Output)

Command Description Key Args
report-pipeline Pipeline overview  
report-stats Stats summary  
report-gaps Skill gaps report  
report-position Position detail --id

Forager Commands

Command Description Key Args
add-source Add a search source --name, --platform, --token/--query
list-sources List search sources  
remove-source Remove a source --id or --name
suggest-sources Profile-driven suggestions  
search-source Search one source --source
heartbeat Full discovery cycle --min-relevance
list-candidates List candidates --status, --source
triage Review/dismiss candidate --id, --action
promote Promote to full position --id

TypeDB Schema Highlights

The jobhunt namespace (namespaces/jobhunt.tql) extends the core three-branch hierarchy:

domain-thing
├── your-skill              # Your skills for gap analysis (skill-name, skill-level)
├── jobhunt-company         # Employer organization (company-url, location)
├── jobhunt-position        # Specific job posting (job-url, priority-level, remote-policy)
├── jobhunt-learning-resource  # Course, book, tutorial (resource-type, estimated-hours)
├── jobhunt-contact         # Person at a company (contact-role, contact-email)
├── jobhunt-search-source   # Company board for forager (board-platform, board-token)
└── jobhunt-candidate       # Discovered posting (relevance-score, candidate-status)

collection
└── jobhunt-search          # A job search campaign

artifact
├── jobhunt-job-description # Full JD text (raw HTML)
├── jobhunt-resume          # Resume versions
├── jobhunt-cover-letter    # Tailored cover letters
└── jobhunt-company-page    # Careers/about page content

fragment
├── jobhunt-requirement     # Single skill requirement (skill-name, skill-level, your-level)
├── jobhunt-responsibility  # Job responsibility
└── jobhunt-qualification   # Required/preferred qualification

note
├── jobhunt-fit-analysis-note    # Fit assessment (fit-score, fit-summary)
├── jobhunt-research-note        # Company research
├── jobhunt-interview-note       # Interview prep/feedback (interview-date)
├── jobhunt-strategy-note        # Talking points, approach
├── jobhunt-skill-gap-note       # Learning needs
├── jobhunt-application-note     # Status tracking (application-status, applied-date)
└── jobhunt-interaction-note     # Contact logs (interaction-type, interaction-date)

Key relations:

Relation Roles Purpose
position-at-company position, employer Links positions to companies
requirement-for requirement, position Links requirements to positions
addresses-requirement resource, requirement Learning resources for skill gaps
source-provides source, candidate Forager: which source found a candidate
works-at employee, employer Contacts at companies

Cross-namespace bridge: collection plays addresses-requirement:resource — a scilit paper collection (from epmc-search) can directly address a jobhunt skill gap requirement.

TypeDB Query Examples

# All skill gaps in high-priority positions
match
    $p isa jobhunt-position, has priority-level "high";
    $r isa jobhunt-requirement;
    (position: $p, requirement: $r) isa requirement-for;
    $r has your-level "none";
fetch {
    "position": $p.name,
    "skill": $r.skill-name,
    "level": $r.skill-level
};

# Fit scores across all positions
match
    $p isa jobhunt-position;
    $n isa jobhunt-fit-analysis-note, has fit-score $score;
    (about: $p, note: $n) isa annotation;
fetch {
    "position": $p.name,
    "fit_score": $score
};

# Learning resources for a specific gap
match
    $r isa jobhunt-requirement, has skill-name "Distributed Systems";
    $lr isa jobhunt-learning-resource;
    (resource: $lr, requirement: $r) isa addresses-requirement;
fetch {
    "resource": $lr.name,
    "type": $lr.resource-type,
    "hours": $lr.estimated-hours
};

Cross-Skill Integration

Search for papers on a skill gap topic and link them to your learning plan:

# Search for papers (epmc-search skill)
uv run python .claude/skills/epmc-search/epmc_search.py search \
    --query "machine learning systems design" \
    --collection "ML Systems Reading List"

# Link the paper collection to your skill gap
uv run python .claude/skills/jobhunt/jobhunt.py link-collection \
    --collection "<collection-id>" \
    --skill "machine-learning"

# View updated learning plan
uv run python .claude/skills/jobhunt/jobhunt.py learning-plan

The addresses-requirement relation bridges the scilit and jobhunt namespaces, enabling TypeDB to reason across both skills in a single query.

Dashboard

The Next.js dashboard (make dashboard-dev) provides:

  • Pipeline Board (/jobhunt) — Kanban columns by application status
  • Position Detail (/jobhunt/position/{id}) — Requirements, notes, gap analysis, fit score
  • Collection Detail (/jobhunt/collection/{id}) — Notes and resources grouped by collection