Files
command-center/agent/managed-skills/frank-job-hunt-maintenance/SKILL.md
T

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

  1. 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.example is a fixture host (RFC 2606) — never derive a real domain from a company name, and never click a link the pipeline constructed.
  2. 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_URL env. 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.sh from the correct checkout (dev side, clean tree); it pushes the branch first, so a stale local main makes the push fail — git merge --ff-only origin/main before 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.