16 Commits

Author SHA1 Message Date
dennisthiessen d0350ca668 chore(job_scout): log Snowflake Sr SWE Enterprise as applied
Records the 2026-06-06 application (Observe by Snowflake, ~86/100) in the
decision log so it stops resurfacing as a new match.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 16:53:49 +02:00
dennisthiessen 7ed9e5b615 feat(job_scout): add data-infra adapters + Oracle manual-check
Add Databricks, Snowflake, Datadog, Elastic, dbt Labs (greenhouse/ashby,
title-filtered). Snowflake slug surfaced the Zürich Observe SWE role.
HashiCorp dropped (IBM acquisition killed public boards); Oracle moved to
MANUAL_CHECK (ORC SPA resists scraping; REST endpoint documented in code).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 20:46:10 +02:00
dennisthiessen 09316a73cf feat(resume): QuantCo Cloud Engineer package (sent, ~82/100)
- Full resume + cover letter + critique for QuantCo Cloud Engineer (Zürich)
- Applied Tier 1+2 critique fixes: corrected education dates, hedged Data
  Mesh ownership, sharpened tagline/summary, added SRE token
- Mark QuantCo Cloud Engineer + Equinor as sent in trackers
- decisions.json: QuantCo Cloud Engineer -> applied

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 21:40:40 +02:00
dennisthiessen 8a5955c0a8 feat(job_scout): decision log + report annotations
Track per-job decisions across runs so we don't re-evaluate roles.

- state/decisions.json (keyed by URL: company/title/decision/note/date), now
  git-tracked while seen_jobs.json stays local
- --decide "<url>" <status> [note] records a decision; --hide-decided gives an
  undecided-only view; report tags each role inline with its decision
- usage docstring updated
- seed 18 decisions (9 shortlist, 7 skip, 1 paused, 1 maybe); flags Google Staff
  FDE GenAI as the paused prior session

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 15:30:49 +02:00
dennisthiessen da66443aa8 feat(job_scout): add 6 Swiss/EU companies, new adapters, and scan-stats table
Automate Palantir, QuantCo, Swissgrid, RUAG, SBB, BKW (drop BFH/Dialectic);
25 companies automated, 0 manual.

- adapters: lever (Palantir/QuantCo), generic json (Swissgrid), sbb, bkw
- fetch_playwright: optional ?page=N pagination (page_param/max_pages) for RUAG
- location_matches: treat pan-EU "Europe"/"EMEA" postings as eligible
- per-company _score_floor so pre-filtered German-language boards stay visible
- POSITIVE_KEYWORDS: add data scientist / data science (medium)
- report: scan-stats table (scraped / CH-remote / match>=2 / newest / time) + totals

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 15:15:22 +02:00
dennisthiessen 49ba42138d chore(job_scout): drop Sygnum, Vitol, ClickHouse (Glassdoor culture/comp red flags)
- Sygnum: 3.4 / 51% recommend, comp 2.3/5 (structurally below 180k bar)
- Vitol: 3.5 / 55% recommend, grueling-hours/blame-culture flag, WLB 2.5
- ClickHouse: 3.3 / 36% recommend, WLB 2.6, multiple toxic-culture reviews

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 16:20:34 +02:00
dennisthiessen 0c098daadf feat(job_scout): score devops/cloud/platform + technical-architect roles
Add positive keywords for the core DevOps/data-platform/cloud lane and
technical-architect titles (cloud/data/platform architect) that previously
scored 0 and surfaced only via the generic "senior" term. Rebalances rankings
so hands-on engineering roles aren't buried under pre-sales "Solutions
Architect" + crypto keyword stacking.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 15:46:14 +02:00
dennisthiessen 1e83966049 fix(job_scout): word-boundary keyword matching + title-weighted scoring
Two scoring bugs inflated the rankings:
- Substring matching: 'rag' matched sto[rag]e / tet[rag]on, 'intern'
  matched inte[rnal], 'lead' matched [lead]ership. Roche's staff
  restaurant and Cisco Tetragon roles scored as fits. Now keywords must
  not be flanked by alphanumerics (c#/.net/c++ keep matching).
- Body boilerplate: every Kraken post mentions crypto/blockchain/trading,
  so sales/PM/design roles scored as high as engineering ones. Title
  matches now score full weight, body-only matches half (min 1);
  negatives still count fully anywhere.

Strong-fit count drops 13 -> 5; the bogus 'intern' negatives and rag
false positives are gone. Shared _kw_in() also backs the title filter.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 21:37:00 +02:00
dennisthiessen 74dcc244b8 feat(job_scout): add trading/quant-finance scoring keywords
Dennis is interested in trading roles (energy/finance/crypto), but the
scorer had no terms for them, so trading-tech roles scored 0 and got
buried. Add a trading/quant cluster (trading, trader, quant, market
data, low-latency, FIX protocol, brokerage, commodity, execution) plus
singular "solution architect" and adjacent stack (C#, .NET).

Bitcoin Suisse's Solution Architect Trading now scores 4 (medium) on
title alone, up from 0.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 19:15:18 +02:00
dennisthiessen b44360f99a feat(job_scout): automate Bitcoin Suisse via onlyfy adapter
Bitcoin Suisse's careers page is a JS-rendered Next.js SPA, but the
underlying onlyfy.jobs ATS exposes a plain HTML job list at
candidate/job/ajax_list (title + location per card). Add an onlyfy
adapter that parses it — no headless browser needed. Surfaces the 3
current Zug roles correctly (CH filter + pre-dedup location filtering
keep the Swiss posting over its Bratislava/Copenhagen cross-posts).

MANUAL_CHECK is now empty (all 22 target companies automated), so the
report's manual-check section is suppressed when the list is empty.
Coverage notes updated.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 19:06:31 +02:00
dennisthiessen f4d2c6c969 chore(job_scout): drop AMINA Bank from MANUAL_CHECK (poor Glassdoor)
AMINA Bank rates poorly on Glassdoor and isn't worth tracking. Remove
its manual-check entry, leaving Bitcoin Suisse as the only manual source.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 18:50:38 +02:00
dennisthiessen 913a5de5ac chore(job_scout): drop Coinbase from MANUAL_CHECK (hiring freeze)
Coinbase cut ~14% of staff and is not actively hiring; remove its
manual-check entry. The getro Coinbase Ventures source covers portfolio
companies only, not Coinbase itself, so Coinbase is now off the radar
until they reopen. Now 2 manual sources (AMINA, Bitcoin Suisse).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 18:48:56 +02:00
dennisthiessen cb27fa3ecf feat(job_scout): add getro adapter for Coinbase Ventures web3 network
Add a getro adapter (POST JSON search API) and wire up the Coinbase
Ventures portfolio talent network (collection 1625), CH + eng-title
filtered. Note this covers portfolio companies (Ashby, Notion, VALR,
World, ...), not Coinbase itself, which doesn't list on its Ventures
board — Coinbase-the-employer stays in MANUAL_CHECK.

Also clean up stale comments: drop Sonova (MedTech, off-thesis, dead
scrape) from MANUAL_CHECK, remove the dangling BIS comment now that
BIS is automated via rss, and refresh the adapter-coverage notes and
module docstring to the current 21-automated / 3-manual state.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 18:47:29 +02:00
dennisthiessen 1331a7f1f5 feat(job_scout): add RSS adapter, automate BIS vacancies
- Generic RSS/RDF feed parser (handles RSS 1.0 namespaced items + RSS 2.0)
- BIS (Bank for International Settlements, Basel) promoted from manual-check
  to an automated source via its vacancies RSS feed — commutable from Bern,
  salary net of Swiss tax. Scout now 20 automated + 4 manual-check.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 09:55:50 +02:00
dennisthiessen 3b07c4b900 feat(job_scout): expand to 19 companies + new adapters, filters, dedup
- New SmartRecruiters adapter (EU energy/commodity firms)
- Add data-infra US tech (Confluent/GitLab/ClickHouse/Grafana) and
  commodity/energy traders (MET Group/Vitol/Louis Dreyfus)
- Headless stealth (navigator.webdriver mask + chrome fingerprint) — unblocks
  Google; also enabled Meta and Cisco scraping
- Tight title prefilter + title-only scoring + cross-region dedup so
  high-volume all-remote boards don't flood the report
- Remove Canonical (below-market pay, poor culture) and IBM Research
  (research-scale pay below bar; weak data-eng fit) per reputation review

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 12:38:35 +02:00
dennisthiessen eeec77b1e3 feat: add job_scout — automated CH job-board scraper for target companies
Pulls fresh postings from the quarterly target-company list, filters by Swiss
location / EU-remote eligibility, scores fit against profile keywords, tracks
seen jobs, and writes a markdown report.

Adapters (13 companies automated):
- Workday: NVIDIA, Novartis
- Ashby: Kraken, OpenAI
- Greenhouse: Anthropic
- PCSX (Eightfold): Microsoft
- WordPress AJAX: Sygnum
- Playwright (headless + stealth): Google, Apple, Meta, Roche, Cisco, IBM

4 companies (Sonova, Coinbase, AMINA, Bitcoin Suisse) resist automation
(server-side bot blocks / JS widgets) and surface as a manual-check checklist.

venv, reports/, and state/ are gitignored; only scout.py + requirements.txt
are tracked.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 10:12:27 +02:00