Commit Graph

68 Commits

Author SHA1 Message Date
0b40d284cd fix: bump max_tokens to 256, note batch API requires native model IDs 2026-03-06 10:58:11 +00:00
85038b6ce1 fix: batch collect O(n²) → single queue write; correct model to claude-3-haiku-20240307
- updateJobStatus was called 4,652 times causing ~4,652 file reads/writes
- Now loads queue once, applies all updates in memory, saves once
- Model was using OpenClaw alias (sonnet-4-6) not native Anthropic ID
- Only claude-3-haiku-20240307 is available on this API key; update settings.example.json
2026-03-06 10:56:54 +00:00
17fd919356 feat: add filter section to status report 2026-03-06 10:24:22 +00:00
728e0773b9 fix: sanitize Unicode surrogates in job descriptions, handle custom_id > 64 chars 2026-03-06 10:18:54 +00:00
d610060dbb feat: persistent run history logs for searcher and filter
- search_runs.json: append-only history of every searcher run
  (started_at, finished, added, seen, platforms, lookback_days)
- search_progress_last.json: snapshot of final progress state after
  each completed run — answers 'what keywords/tracks were searched?'
- filter_runs.json: append-only history of every filter batch
  (batch_id, submitted/collected timestamps, model, passed/filtered/errors)
Fixes the 'did the 90-day run complete?' ambiguity going forward
2026-03-06 10:16:06 +00:00
dbe9967713 feat: rewrite filter to use Anthropic Batch API
- Batch API = 50% cost savings vs synchronous calls
- Prompt caching on system prompt (profile + criteria shared across all jobs)
- One request per job with custom_id = job ID for result matching
- Two-phase state machine: submit → poll/collect (hourly cron safe)
- filter_state.json tracks pending batch ID between runs
- Model configurable via settings.filter.model (default: claude-sonnet-4-6)
- Telegram notifications on submit + collect
- Errors pass through — never block applications due to filter failure
- --stats flag for queue overview
2026-03-06 10:12:47 +00:00
9bf904dada feat: AI job filter — score jobs 0-10 with Claude Haiku before applying
- lib/filter.mjs: batch scoring engine (10 jobs/call, Claude Haiku)
- job_filter.mjs: standalone CLI with --dry-run and --stats flags
- Threshold configurable globally + per-search in search_config.json (filter_min_score, default 5)
- Job profiles (gtm/ae) passed as context via settings.filter.job_profiles
- Filtered jobs get status='filtered' with filter_score + filter_reason
- Filter errors pass jobs through (never block applications)
- status.mjs: added 'AI filtered' line to report
2026-03-06 10:01:15 +00:00
ff59316abc chore: update default searcher schedule to every 12 hours 2026-03-06 09:51:57 +00:00
9c03c2661e chore: remove test file 2026-03-06 02:58:23 +00:00
7de05fdce4 chore: remove PM2 — system cron + lockfile is sufficient, no daemon needed 2026-03-06 02:57:49 +00:00
739bb1c99c fix: remove PM2 cron_restart — use system cron instead so running jobs are never killed 2026-03-06 02:56:32 +00:00
be20f5a4e9 feat: capture job description from right panel during search — no extra page load 2026-03-06 02:49:28 +00:00
4a2b24d562 fix: show global keyword position (2/20) not slice position (1/19) in logs 2026-03-06 02:47:39 +00:00
c01abe8884 fix: location scraper — use .tvm__text selector, also capture work_type (Remote/Hybrid/On-site) 2026-03-06 02:44:17 +00:00
ef70c12fbe feat: keyword progress grouped by platform in status report 2026-03-06 02:30:18 +00:00
dc31ae325b feat: keyword progress in status report — shows X/N (%) per track 2026-03-06 02:28:39 +00:00
2a4fd52d43 fix: clear progress on clean finish — keywords only reused when previous run was incomplete 2026-03-06 02:26:14 +00:00
97b753d401 feat: cache keywords in search_progress.json — restarts reuse same keywords, no regeneration mid-run 2026-03-06 02:24:54 +00:00
65d6d1e50c feat: per-keyword resume — restart picks up from last completed keyword, not keyword 1 2026-03-06 02:23:07 +00:00
ffb9eec4cb feat: log keyword progress (X/N) during search 2026-03-06 02:20:32 +00:00
f9d7543611 feat: PM2 as canonical scheduler — SKILL.md updated, setup.mjs simplified, OpenClaw gateway cron removed 2026-03-06 02:12:17 +00:00
aec603b72c feat: PM2 process manager for cron scheduling — proper daemon, survives reboots, no SIGTERM from agent sessions 2026-03-06 02:10:28 +00:00
e9c937684c fix: cron agents launch searcher/applier detached (nohup &) to prevent SIGTERM on session end 2026-03-06 02:07:46 +00:00
261f5800ad fix: load API keys from .env at runtime — never embed credentials in cron payloads or source code 2026-03-06 02:04:55 +00:00
0d3ef7c285 docs: reference kernel/skills for CLI + auth guidance 2026-03-06 02:00:06 +00:00
f907803a01 docs: clarify Playwright is auto-installed, not a manual requirement 2026-03-06 01:57:06 +00:00
da0842126c docs: rewrite SKILL.md with accurate setup steps, correct Kernel CLI syntax, env vars, cron details 2026-03-06 01:56:39 +00:00
e288ccf06b feat: setup.mjs auto-registers cron jobs with timeoutSeconds:0 via OpenClaw gateway 2026-03-06 01:54:54 +00:00
1c3e9f3561 fix: split skip counters for accurate reporting, complete status docs
- Split skipped_no_easy_apply into skipped_no_apply (no button/modal)
  and skipped_other (honeypot/stuck/incomplete) for clearer reporting
- Update Telegram summary, status.mjs display, and job_applier counters
- Add missing skipped_easy_apply_unsupported to README status table

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:44:25 -08:00
8212f97aba refactor: normalize apply statuses, remove dead code, fix signal handler
- lib/apply/index.mjs: add STATUS_MAP to normalize platform-specific statuses
  to generic ones (no_button/no_submit/no_modal → skipped_no_apply).
  Documented all generic statuses for AI/developer reference.
- job_applier.mjs: handleResult now handles skipped_no_apply, default case
  logs + saves instead of silently dropping
- lib/linkedin.mjs: remove dead applyLinkedIn() and detectAts(), clean imports
  (~110 lines removed). Search-only module now.
- lib/wellfound.mjs: remove dead applyWellfound(), clean imports.
  Search-only module now.
- lib/lock.mjs: fix async signal handler — shutdown handlers now actually
  complete before process.exit()
- test_linkedin_login.mjs: add try/catch/finally with proper browser cleanup
- README: update status table with all current statuses

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:39:48 -08:00
1bf676bb80 fix: add error logging to applier, session polling, and job card clicks
- job_applier.mjs: stack traces on per-job and browser-level errors
- session.mjs: log pending status and poll count during session refresh
- linkedin.mjs: log warning when job card click fails instead of silent catch

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:30:24 -08:00
ed908c91af fix: audit bugs + better error logging for searcher debugging
Bugs fixed:
- form_filler.mjs: add missing await on el.evaluate() in getLabel()
- analyze_ats.mjs: check job.apply_type instead of non-existent job.easy_apply
- status.mjs: fix typo "that run" → "in that run"
- README: add missing lock.mjs to project structure

Logging improvements:
- job_searcher.mjs: log browser creation, login steps, stack traces on error
- linkedin.mjs/wellfound.mjs: catch and log navigation failures per keyword
- browser.mjs: descriptive errors for Kernel and CDP connection failures

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:28:23 -08:00
ec68e621b8 fix: audit cleanup — ReDoS guard, Telegram validation, README accuracy
- form_filler.mjs: reject regex patterns over 200 chars to mitigate ReDoS
- notify.mjs: check res.ok before parsing Telegram API response
- README: update project structure with new lib/apply/ modules, session.mjs,
  keywords.mjs; fix max_applications_per_run docs (no limit by default);
  clarify ATS stub status in roadmap

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:20:32 -08:00
33f85c4752 fix: validate API response in keywords.mjs, delete unused classifier.mjs
- Add res.ok check before parsing Anthropic API response
- Validate data.content[0].text exists before accessing
- Remove classifier.mjs (86 lines of dead code, never imported)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 17:19:16 -08:00
fb7fc31fe1 fix: move Kernel connection IDs out of source into settings.json (gitignored) 2026-03-06 01:17:52 +00:00
42d00f3a87 fix: status.mjs already_applied field missing from queue object 2026-03-06 01:13:31 +00:00
e49851e12a fix: remove local browser fallback — Kernel only, fail fast if unavailable 2026-03-06 01:09:57 +00:00
f065a9a786 feat: auto-refresh Kernel Managed Auth session on login failure — ensureLoggedIn() with retry 2026-03-06 01:09:30 +00:00
4fb5917c87 fix: restore real Wellfound apply logic in lib/apply/wellfound.mjs (not a stub) 2026-03-06 01:05:35 +00:00
35fdbc487a refactor: handler registry pattern — lib/apply/<ats>.mjs, applyToJob() routes by apply_type 2026-03-06 01:03:11 +00:00
2574276a85 refactor: classify apply_type inline during search (click card → detect right panel); no second pass 2026-03-06 01:00:59 +00:00
dee6e98603 feat: searcher Phase 2 classifies apply type; applier sorts by priority; already-applied detection 2026-03-06 00:58:22 +00:00
61e0577c3c chore: add claw.json manifest, .env.example, remove node_modules symlink
Prepares the repo for ClawHub publishing:
- claw.json manifest with permissions and metadata
- .env.example for KERNEL_API_KEY
- Remove broken node_modules symlink (pointed to server path)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:49:01 -08:00
319b626b71 fix: gitignore all runtime data files — search_progress, last_run files 2026-03-06 00:48:50 +00:00
f9446f5bee fix: resume lookback from progress file — don't reset to 2d when queue is non-empty 2026-03-06 00:41:27 +00:00
86d00297df feat: search progress tracking — resume on restart, skip completed platform:track combinations 2026-03-06 00:37:35 +00:00
b091473735 fix: graceful shutdown — write last-run file on SIGTERM, show interrupted state in status 2026-03-06 00:35:10 +00:00
1920df51a4 feat: rich status report — searcher/applier last run time, timeAgo, per-run metadata files 2026-03-06 00:33:03 +00:00
5382e8432e feat: status.mjs — on-demand status report for searcher + applier + queue breakdown 2026-03-06 00:30:15 +00:00
b496ee4a3a feat: ATS breakdown in Telegram summary after each apply run 2026-03-06 00:27:43 +00:00