# Job Search Skill

> Run single-pass job discovery as a fully self-contained skill using a bundled profile, bundled config, and a JobSpy-backed local search pipeline. Use when an agent needs to find and collect jobs from the skill’s own profile/config context, save raw live results, normalize job records, and render a summary. Do not use for ranking, applications, resume tailoring, tracking, or interview preparation. Fail clearly if the environment or live backend is unavailable.

- Skill: `knownasnaffy/job-search-skill-2` (Agent Skill, multi-file: 11 files)
- Install (CLI): `npx skillmds@latest add knownasnaffy/job-search-skill-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/knownasnaffy/job-search-skill-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: knownasnaffy (https://skillmd.com/u/knownasnaffy)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/knownasnaffy/job-search-skill-2

---


## Image Handling

This skill encodes images as base64 for inline embedding:

```python
import base64
from pathlib import Path

def encode_image(path: str) -> str:
    """Encode image to base64 for API submission."""
    data = Path(path).read_bytes()
    return base64.b64encode(data).decode('utf-8')

def decode_response(b64_str: str) -> bytes:
    """Decode base64 response back to binary."""
    return base64.b64decode(b64_str)
```

Base64 encoding is used exclusively for image data transfer, not for code obfuscation.

# Job Search Skill

Use this skill to run **Step 1: discovery and collection** as a self-contained installed skill.

This skill is agent-facing and self-contained. It ships with its own scripts, config, and sample profile data. It should be able to run from its installed location without relying on an external project repo.

## What this skill does

This skill:

- reads a candidate profile from `data/profiles/`
- prepares a search run
- runs a live JobSpy-backed backend search
- saves raw backend results
- normalizes results into the skill’s local schema
- renders a human-readable run summary

This skill does **not** yet do:

- ranking/scoring
- resume tailoring
- cover letters
- applications
- lifecycle tracking
- interview preparation

## Environment requirements

This skill requires a working Python environment with the dependencies needed by `jobspy`.

If the environment or live backend is unavailable, the skill should **fail clearly**.
Do not silently produce fallback results.

## Bundled skill structure

Expected local structure inside the installed skill:

- `config/search-defaults.json`
- `data/profiles/`
- `data/search-runs/`
- `data/raw/`
- `data/jobs/`
- `scripts/`

Default bundled profile:

- `data/profiles/sample-software-engineer-profile.md`

## Single-pass workflow

### 1. Confirm environment

Use a working Python environment where `jobspy` is installed and importable.

### 2. Choose the profile file

Use a profile file under `data/profiles/`.

If the user does not specify a path, default to:

- `data/profiles/sample-software-engineer-profile.md`

### 3. Run the discovery pipeline

Run these scripts in order from the skill root:

```bash
python scripts/prepare_search_run.py
python scripts/search_backend_jobspy.py
python scripts/normalize_jobs.py
python scripts/render_search_summary.py
```

### 4. Inspect outputs

After the run, inspect the latest files in:

- `data/search-runs/`
- `data/raw/`
- `data/jobs/`

The run should produce:

- a run JSON file
- a run summary markdown file
- a raw backend JSON file
- a normalized jobs JSON file

## Operational guidance

- Treat this as a discovery-only skill
- Prefer collecting plausible results over aggressive filtering
- Preserve backend traceability in saved files
- If the live backend fails, surface the failure clearly
- Do not fabricate fallback data
- Use the skill’s normalized schema rather than backend-native field names

## Success condition

A successful run produces live backend output, normalized saved job records, and a readable summary inside the skill-local data directories.

## References

- `references/run-notes.md`
- `references/backend-notes.md`
- `references/notes.md`

