gtm-job-market-scan

Scan job boards to identify consulting opportunities by matching hiring demand to a practitioner's capabilities. Build a GTM outreach campaign from job postings. Reusable scanner at scripts/gtm/job-market-scanner.py.

5 stars

Best use case

gtm-job-market-scan is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Scan job boards to identify consulting opportunities by matching hiring demand to a practitioner's capabilities. Build a GTM outreach campaign from job postings. Reusable scanner at scripts/gtm/job-market-scanner.py.

Teams using gtm-job-market-scan should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/gtm-job-market-scan/SKILL.md --create-dirs "https://raw.githubusercontent.com/vamseeachanta/workspace-hub/main/.agents/skills/research/gtm-job-market-scan/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/gtm-job-market-scan/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How gtm-job-market-scan Compares

Feature / Agentgtm-job-market-scanStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Scan job boards to identify consulting opportunities by matching hiring demand to a practitioner's capabilities. Build a GTM outreach campaign from job postings. Reusable scanner at scripts/gtm/job-market-scanner.py.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# GTM Job Market Scan

Systematic scan of job boards to convert hiring demand into consulting leads.

## Core Thesis

Every senior engineering job posting is a consulting lead. Companies hiring FTEs at $150-250K+ have budget, need, and urgency. A consulting engagement fills the gap faster than a 3-6 month hiring cycle.

## Steps

### 1. Map the Practitioner's Capabilities

Before scanning, read the user's resume/CV and capability docs to extract:
- Exact tool names (OrcaFlex, ANSYS, COMSOL — these become search keywords)
- Domain keywords (subsea, mooring, cathodic protection, FEA)
- Standards knowledge (API 579, DNV, BS 7910 — niche = high value)
- Past clients (these become priority target companies)

Key files in workspace-hub:
- `teamresumes/cv/va_resume.md`
- `docs/BUSINESS_BRAIN.md`
- `docs/strategy/engineering-chatbot-oilgas-pitch.md`
- `docs/research/engineering-capability-map.md`

### 2. Create GitHub Issues (Parent + Children)

Structure as a hierarchy:
- **Parent**: Broad US-wide scan across all verticals
- **Child 1**: Vertical-specific (e.g., vessel installation contractors)
- **Child 2**: Vertical-specific (e.g., energy companies)

Labels: `cat:strategy`, `domain:gtm`, `cat:business`
Cross-reference issues with comments on each.

Use `gh issue create --repo REPO --title "..." --label "..." --body '...'` with detailed markdown bodies including:
- Target company lists by tier
- Keyword search matrix
- Capability alignment matrix
- Phased deliverables with checkboxes
- Files to create
- Success criteria

### 3. Run the Scanner

```bash
# Full scan (all 22 keywords + 30 career pages)
/home/vamsee/miniforge3/bin/python scripts/gtm/job-market-scanner.py

# Limited scan (first N keywords, skip career pages)
/home/vamsee/miniforge3/bin/python scripts/gtm/job-market-scanner.py --limit 5 --skip-career-pages

# Custom keywords
/home/vamsee/miniforge3/bin/python scripts/gtm/job-market-scanner.py --keywords "OrcaFlex,mooring,cathodic protection"
```

### 4. Review and Prioritize Results

Auto-generated outputs:
- `docs/strategy/gtm/job-market-scan/dashboard.md` — summary stats
- `docs/strategy/gtm/job-market-scan/priority-targets.md` — ranked companies
- `docs/strategy/gtm/job-market-scan/raw-results/YYYY-MM-DD.json` — full data

Focus on "Hot Targets" = companies with 3+ matching open roles.

## Pitfalls

### Source Reliability (discovered through trial)
- **LinkedIn public search**: BEST source — returns 60+ results per keyword, no auth needed. Uses `linkedin.com/jobs/search/` with `sortBy=DD` and `f_TPR=r604800` (past week).
- **Indeed**: Blocks with 403 Forbidden ~80% of the time. Intermittently works. Don't rely on it.
- **Google Search**: Rate-limits aggressively (429 after ~5 requests). Only useful for first 3-4 keywords. Increase `REQUEST_DELAY` if needed.
- **Rigzone**: Returned 0 results in testing — site structure may have changed. Selectors need updating.
- **Company career pages**: Hit-or-miss. Some return useful listings (ABS: 30, Worley: 7), many return 0. Worth running but not primary source.

### Keyword Design
- Tier keywords by specificity: "OrcaFlex engineer" (maybe 50 people can do this) scores higher than "FEA analyst" (thousands can do this)
- Include location qualifiers for niche terms: "naval architect Houston"
- Broader terms (Tier 3-4) produce more noise but find manufacturing/aerospace opportunities

### Scoring
- Keyword tier: niche (Tier 1) = 80 points, broad (Tier 4) = 20 points
- Senior seniority: +30 points (they need experience NOW)
- Priority company: +25 points
- Houston location: +15 points
- Contract/consulting indicator in title: +20 points

### Python Environment
- Use `/home/vamsee/miniforge3/bin/python` (Python 3.13) — has requests + bs4
- NOT `python3` (system Python lacks bs4)
- NOT `uv run` for this script (it uses --no-project and deps aren't in any pyproject.toml)

### Git Workflow
- Check which branch you're on before committing (`git branch --show-current`)
- If on a feature branch, cherry-pick to main after committing — we hit this exact issue (committed to `feat/1668-harness-update-lifecycle` by accident, had to cherry-pick to main)
- Push to origin main explicitly
- The `weekly-scan-refresh.sh` wrapper handles this automatically (checks out main first)

### Test Runs Overwrite Raw Results
- Running `--limit 2 --skip-career-pages` to test overwrites `raw-results/YYYY-MM-DD.json` with partial data
- The cumulative index is safe (only adds, never removes), but the day's raw file is replaced
- If you need to preserve a full scan, copy the raw file before doing test runs on the same day

### Weekly Refresh Setup

The scanner is designed for repeated weekly runs with history tracking.

#### Cron Infrastructure
- **Cron task**: `gtm-job-market-scan` in `config/scheduled-tasks/schedule-tasks.yaml`
- **Schedule**: Monday 5AM UTC (`0 5 * * 1`)
- **Wrapper script**: `scripts/gtm/weekly-scan-refresh.sh` — pulls main, runs scanner, commits & pushes
- The wrapper auto-finds Python (miniforge → local → system fallback)

#### History Tracking (cumulative-index.json)
Each run compares results against `cumulative-index.json`:
- **New jobs**: first time seen → highlighted in `new-this-week.md`
- **Returning jobs**: seen before → `seen_count` incremented
- **Company history**: posting counts per company per scan date → feeds trend report

#### Auto-Generated Reports (refreshed each scan)
| Report | Value |
|--------|-------|
| `dashboard.md` | Overview stats, top companies, top jobs, seniority breakdown |
| `priority-targets.md` | Ranked companies by alignment score, hot targets (3+) |
| `new-this-week.md` | Delta — ONLY new postings since last scan (what to act on) |
| `trend-report.md` | 📈 Companies hiring MORE, 🔥 Persistent openings (consulting gold) |
| `cumulative-index.json` | All-time database of every posting ever seen |

#### Key Experiential Finding: Persistent Openings
> Jobs that appear in 2+ consecutive weekly scans are the **hardest to fill**.
> These persistent openings have the HIGHEST consulting conversion rate.
> The company has budget, has tried hiring, and STILL can't find someone.
> The trend report surfaces these automatically — prioritize outreach to them.

## Output Structure

```
docs/strategy/gtm/
├── job-market-scan/
│   ├── README.md
│   ├── dashboard.md            (auto-generated)
│   ├── priority-targets.md     (auto-generated)
│   ├── new-this-week.md        (auto-generated, weekly delta)
│   ├── trend-report.md         (auto-generated, week-over-week trends)
│   ├── cumulative-index.json   (all-time job tracking DB)
│   ├── raw-results/
│   │   └── YYYY-MM-DD.json
│   ├── keyword-results/
│   └── company-profiles/
└── vessel-installation-contractors/  (vertical-specific)

scripts/gtm/
├── job-market-scanner.py
└── weekly-scan-refresh.sh      (cron wrapper)
```

## Integration with aceengineer-strategy Repo

The scanner is a DATA SOURCE — results must flow into the aceengineer-strategy private repo which is the GTM command center.

### Key aceengineer-strategy files to update after each scan:
- `pipeline/prospects.md` — add new high-scoring companies
- `pipeline/scanner-hot-targets.md` — refresh with latest scan rankings
- `pipeline/job-scan-integration.md` — cross-reference scanner → existing prospects
- `strategy/go-to-market.md` — update Evolution Log with scan findings
- `metrics/weekly-scorecard.md` — update "prospects contacted" as outreach happens

### Email Templates (created, ready for personalization)
- `docs/strategy/gtm/vessel-installation-contractors/email-templates.md` — 3-step sequence (Day 0/3/7)
- `docs/strategy/gtm/job-market-scan/email-templates-by-vertical.md` — 5 vertical variants with {{PLACEHOLDERS}}

Verticals: installation, cathodic protection, FEA/manufacturing, offshore wind, classification societies.

### Conference Prep (lives in aceengineer-strategy)
- `pipeline/conference-prep-q2-2026.md` — master Q2 action plan
- `pipeline/otc-2026-meeting-requests.md` — 10 companies × 3 message variants

### Parallel Execution Pattern
When executing the full GTM cycle, run 4 workstreams in parallel via subagents:
1. Full scan (background terminal — ~10 min)
2. Strategy repo cross-linking (subagent — reads prospects, creates integration docs)
3. Email template drafting (subagent — uses positioning/pricing from strategy repo)
4. Conference prep (subagent — creates action plan with dated checklists)

No git contention: WS-1 writes workspace-hub/docs/strategy/gtm/, WS-2-4 write aceengineer-strategy/pipeline/.

Run P0 expansions in parallel via 3 subagents (one per package). Each subagent gets:
- Existing module listing + __init__.py exports
- Test file listing
- AGENTS.md conventions (test command, src layout)
- Specific new modules to create with engineering standard references
- Instruction to commit from within digitalmodel/ dir (separate git repo)

### Demo Scripts as Sales Collateral

After expanding packages, create self-contained demo scripts at `examples/demos/`:
- Each demo imports actual library modules and runs real calculations
- Print results in a clean, impressive terminal format
- Include header: "ACE Engineer — [capability]" and footer with contact info
- Test that each runs: `PYTHONPATH=src uv run python examples/demos/demo_xxx.py`
- Demos become email attachments / GitHub links for prospect outreach

## First Scan Baseline (2026-04-02)

- 708 jobs, 460 companies, 22 keywords (full run with history tracking)
- LinkedIn produced ~85% of results (best source by far)
- 121 senior roles, 25 hot targets with 3+ roles each
- Top hits: Oceaneering (11), WSP (12), ABS (9), Jacobs (9), Orsted (6)
- Key discovery: LNG sector was a blind spot (Venture Global, Cheniere both scored high)
- Key discovery: Oceaneering was under-tiered in prospect list (11 roles = Tier 1)

### Package Expansion Results (P0 + P1, 2026-04-02)

| Package | Before | After | Growth | Tests |
|---------|--------|-------|--------|-------|
| cathodic_protection | 5 | 17 | +12 | 198 ✅ |
| ansys | 5 | 15 | +10 | 324 ✅ |
| fatigue | 7 | 16 | +9 | 241 ✅ |
| orcaflex | 14 | 25 | +11 | 148 (created) |
| orcawave | 13 | 20 | +7 | 70 (created) |
| **TOTAL** | **44** | **93** | **+49** | **763+ passed** |

3 demo scripts created: `demo_sn_library.py`, `demo_pressure_vessel.py`, `demo_pipeline_cp.py`

Related Skills

bridge-brokerage-market-data-apis

5
from vamseeachanta/workspace-hub

Handle ticker symbol mismatches between brokerage exports and market data APIs

skill-dedup-collision-reconciliation-with-content-security-scan

5
from vamseeachanta/workspace-hub

Reconcile duplicate/colliding workspace-hub skills without losing useful content, while avoiding pre-commit skill-content security scan regressions.

polymarket

5
from vamseeachanta/workspace-hub

Query Polymarket prediction market data — search markets, get prices, orderbooks, and price history. Read-only via public REST APIs, no API key needed.

legal-sanity-scan

5
from vamseeachanta/workspace-hub

Mandatory legal compliance gate for document intelligence, data catalogs, and code porting — scans for client names, proprietary references, and sensitive paths

clean-code-quick-scan-commands

5
from vamseeachanta/workspace-hub

Sub-skill of clean-code: Quick Scan Commands.

financial-analysis-financial-markets-and-instruments

5
from vamseeachanta/workspace-hub

Sub-skill of financial-analysis: Financial Markets and Instruments (+5).

financial-analysis-energy-market-analysis

5
from vamseeachanta/workspace-hub

Sub-skill of financial-analysis: Energy Market Analysis (+3).

doc-extraction-naval-architecture-structural-scantling-tables

5
from vamseeachanta/workspace-hub

Sub-skill of doc-extraction-naval-architecture: Structural Scantling Tables.

pdf-ocr-for-scanned-documents

5
from vamseeachanta/workspace-hub

Sub-skill of pdf: OCR for Scanned Documents (+3).

test-oversized-skill

5
from vamseeachanta/workspace-hub

A test fixture skill that exceeds 200 lines with multiple H2/H3 sections for split testing.

interactive-report-generator

5
from vamseeachanta/workspace-hub

Generate interactive HTML reports with Plotly visualizations from data analysis results. Supports dashboards, charts, and professional styling.

data-validation-reporter

5
from vamseeachanta/workspace-hub

Generate interactive validation reports with quality scoring, missing data analysis, and type checking. Combines Pandas validation, Plotly visualization, and YAML configuration for comprehensive data quality reporting.