- The clock guard shipped earlier today now comes from one shared module the
whole fleet uses (
src/budget.js, vendored from actors/tools/lib/budget.js),
rather than a copy per actor. The engine this actor runs on turned out to be
vendored FIVE ways, and only two of them had been fixed — which is the same
way the bug got here in the first place.
- A run can no longer spend more time than it has. Nothing in this actor
knew what time it was:
fetchHtml booked its worst case up front (three
attempts at a 30-second request timeout, plus backoff, was ~95 seconds one
page could cost) and every loop above it was unbounded — up to 101 search
pages per keyword, one keyword after another, and with full descriptions on,
one more fetch plus a 300 ms pause for every job delivered, against a "Max
jobs" input that accepts 100,000. One of the last thirty runs ended on the
platform timeout, which is a run that loses its own status message and reads,
from the Store, as an actor that does not work.
- Every fetch now plans against the time that is actually left rather than its
worst case: the request timeout is clamped to it, a backoff that would outlive
the budget is not slept, and a fetch the clock ended is reported as the clock,
never as LinkedIn refusing.
- When the run gets short, the optional descriptions are what gets dropped
first, so the last of the clock turns into jobs you receive rather than jobs
nobody gets. The premium event bills on delivery, so a skipped description is
simply not charged.
- The run's closing status now names what it did not do: how many jobs were
delivered without descriptions, and which searches never ran.
- The run now ends with a status message in the Console (the "Done" line was log-only, so a run could not explain itself in the Store).
First release. A narrow, remote-only repackaging of the LinkedIn Jobs Scraper engine:
- Every search is pinned to LinkedIn's own "Remote" work-arrangement facet (
f_WT=2). There is no work-type input to forget.
- Search by keyword and an optional country/region. Filter by posted-since (last 24 hours, week or month).
- The hiring company is a first-class part of every row: company name, LinkedIn page, handle and logo.
- Optional full job description per posting: description, seniority, employment type, job function, industry and live applicant count. Billed only when the extra data is found.
- Company + job data only. No personal profiles, no applicants, no login and no API key.