On-demand Scout service (replaces the nightly aggregator): - FastAPI agent-mesh service; card name "matchmaking-service" (HTTP /a2a/tasks + Redis-stream worker matching the sibling-service pattern) - run_search: parallel multi-board sweep (Naukri/blackfalcondata + Foundit + LinkedIn), city-filtered at the board, cheapest-per-result first - per-board adapters + normalizers -> ScoutJob with rich read-only details and offsite apply links; recall mode + MVQ guard - result cache for dev replay ($0); per-board cost knobs; retry-on-5xx - research/: engine design, board cost economics, India-actor shortlist, POC
29 lines
1.2 KiB
Python
29 lines
1.2 KiB
Python
"""
|
|
AshbyAdapter — the hard-won Ashby knowledge from apply_ashby.py, as a thin hint layer.
|
|
This is how the Ashby progress is preserved without duplicating the engine.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from .base import Adapter
|
|
|
|
|
|
class AshbyAdapter(Adapter):
|
|
name = "ashby"
|
|
tier = "tier1-autonomous"
|
|
|
|
def matches(self, url: str) -> bool:
|
|
return "ashbyhq.com" in (url or "").lower()
|
|
|
|
def hints(self) -> str:
|
|
return (
|
|
"BOARD = AshbyHQ (public form, no login needed). Known quirks:\n"
|
|
"- There is an 'Autofill from resume' control near the top — upload the résumé THERE\n"
|
|
" first to auto-populate fields, then verify the required 'Resume' field shows the\n"
|
|
" file attached (filename visible, no spinner).\n"
|
|
"- The required consent checkbox reads 'I confirm I have read the above.' (no asterisk\n"
|
|
" but REQUIRED) — tick it and verify it is checked.\n"
|
|
"- 'Where are you currently located?' is a typeahead: type the city, wait, click the\n"
|
|
" matching suggestion (typing alone does not commit).\n"
|
|
"- The page is a JS app; it can render blank for a few seconds on load."
|
|
)
|