agentleFS
askoulwassimaskoulwassim/perfect-placement/skills/freshness/SKILL.md

freshness

Skill3 starsChanged 34 days agoMITView on GitHub

Keep unapplied roles honest. Daily, check every inbox, active, held, on-deck and draft-ready posting is still open via the roles.check_freshness op; when asked, judge from page text whether a posting still accepts applications. Never touches applied or later roles.

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 3 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Run the check: Call the op, never the network or the db yourself:

    line 12
  2. Distinctive:

    Never touch applied-or-later roles.

    line 57
  3. Distinctive:

    Never submit an application or send an email.

    line 59

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

freshness

Schedule: daily 06:30 (config.schedules.freshness).

What you do

  1. Run the check. Call the op, never the network or the db yourself:
    • Daily: roles.check_freshness { all_in_scope: true }
    • One role or a few (before research or tailor): roles.check_freshness { role_ids: [...] }
    • Preview without writes: same call with dryRun in the op context.
  2. Report the outcome in one line: checked, open, closed, unsure, stale. Name closed and unsure roles. No narration.

How the op decides (mechanics, not yours)

RungSignalResult
ATS API (Greenhouse, Lever, Ashby)posting returnedopen, last_checked_at touched
ATS APIposting gone from a live boardclosed evidence -> resolver
Page fetch404 / 410, redirect to listing, closed phrase, Ashby posting:nullclosed evidence -> resolver
Page fetchanything else, bot wall, timeoutpage text -> resolver
Resolver Noulli "Is this posting still accepting applications?"no + policy auto (p >= 0.92 for freshness.closed)archived, reason closed, 24h undo
Resolverrouted to human, conflict with hard evidence, or backend downunsure, waits in Needs you with the pick and p
Age (posted, else found) > freshness.stale_after_days (45)stale flag only, no move
Second check in a row that cannot confirm open (flags_json.unverified_checks)bot wall, no ATS match, contradicted closed evidence, no URLrule close freshness.closed, auto + undo (24h)
Second check in a row that cannot confirm openpage loads, nothing decisiverule close waits in Needs you (p 0.75)
precheck: true (the pipeline, before scoring a scout's new inbox roles)hard closed evidencearchived on a rule decision, no backend asked

Out of scope, never read or written: applied, interviews, offers, archived. Applied and later belong to the inbox monitor.

When you are the judge

The resolver may route the Noulli question to an LLM, or a human may ask you to look at an unsure role. The state you get: role, company, url, ats, checked_via, signal, evidence, http_status, final_url, page_text.

Answer no (not accepting) only on positive evidence the posting is gone:

  • the page says so ("no longer accepting applications", "position has been filled", "job not found"),
  • the ATS returned 404 for the job while the board answered,
  • the URL bounced to a generic careers or listing page.

Answer yes when the page shows the JD with a live apply path. If the page is a bot wall, a login wall, empty, or unrelated, you do not know: give a low probability rather than guess. A wrong close loses a role; a wrong open costs one more check tomorrow.

Tools

A headless run pre-approves exactly these (SKILL_GRANTS in packages/engine/runners/grants.ts; a test keeps this list and that one equal) and denies everything else. If one you need is denied or missing, do not work around it: runs.finish { run_id, status: "error", summary: { error: "tool denied: <tool>", denied_tools: [...] } }.

  • {{tool:pp}}: the pp MCP tools (every Perfect Placement read and write is an op).
  • {{tool:web.search}}: find the live posting when the stored URL is unclear.
  • {{tool:web.fetch}}: read the live posting page when you are the judge.

Rules

  • Supply judgment only; every write is an op (roles.check_freshness; humans accept or undo through decisions.resolve / decisions.undo).
  • Never touch applied-or-later roles. Never archive a role yourself.
  • Polite traffic: the op paces requests and calls each Ashby board once per run. Do not loop it.
  • Never submit an application or send an email.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.