2.9 KiB
2.9 KiB
name, description
| name | description |
|---|---|
| frank-job-hunt-maintenance | Maintaining frank-job-hunt: the census gate's fail-closed rules, ATS locator token derivation, and the two-host deploy-sync verification. |
Use when maintaining frank-job-hunt: the live-census gate, the registry locator, or Dankserver/Dankclaw deploy-sync. The repo is built and deployed; agents live on Dankserver, ntfy on Dankclaw.
The two rules that caused every bug here
- A URL is data. The census gate and the registry locator treat portal URLs as opaque strings; nothing may template a URL from a company name.
jobs.dankclaw.exampleis a fixture host (RFC 2606) — never derive a real domain from a company name, and never click a link the pipeline constructed. - A stale row is worse than a missing row. Every gate must fail closed: an unverifiable posting is reported as unverifiable, not kept as live. Deleting is allowed; asserting is not.
Census gate
scripts/census-gate.sh decides keep / stale / unverifiable per row.
- Live proof = HTTP GET on the posting URL against the ATS API or the page itself;
404/410⇒ stale, non-200 with no body ⇒ unverifiable. Never infer from age alone. - The gate runs against the live registry, so a row that passes here and then fails in production means the registry drifted — re-run before blaming the gate.
- Test seams: fixture ATS server +
…_BASE_URLenv. Tests assert the row's fate (kept / dropped / flagged), never internal state.
Registry locator
Resolves which ATS a company uses (Greenhouse boards-api.greenhouse.io/v1/boards/<token>/jobs, Lever api.lever.co/v0/postings/<token>, Ashby api.ashbyhq.com/posting-api/job-board/<token>, Workable, SmartRecruiters).
- Token ≠ company name: it comes from the discovered posting URL, so a locator change must keep the derivation (URL → token), not substitute a slug.
- Unknown ATS ⇒ unverifiable, not "no jobs". "Zero jobs" is a strong claim; only a successful API answer with an empty list may say it.
- Rate limits: 429 ⇒ back off and mark unverifiable for this pass, never stale.
Deploy-sync (Dankserver agents, Dankclaw ntfy)
- Two hosts, two roles: inference/agents on Dankserver, notification sink on Dankclaw. A deploy that only touches one leaves the pair inconsistent — the agent can post to a sink that no longer accepts its token, silently.
- Deploy is
scripts/deploy.shfrom the correct checkout (dev side, clean tree); it pushes the branch first, so a stale localmainmakes the push fail —git merge --ff-only origin/mainbefore deploying after any externally merged PR. - Verify after deploy on the served surface: the agent answers a probe, and a test ntfy message arrives on the phone. "The unit is active" is not the proof.
Tests
Black-box, fixtures over network: fake ATS servers on localhost, fake ntfy sink, temp registry file. Assert output rows and exit status. Never assert that an env var is set or that a helper was called.