## All employers job search

<!-- Agent pack fragment from https://www.openrolesindex.com/orgs/all/agent/AGENTS.md, generated 2026-11-05T08:57:45Z. Append to AGENTS.md. -->

When the user asks about jobs, roles, pay, locations or their fit at All employers, or wants a shortlist, résumé
bullets, a cover letter or interview prep for a All employers posting, work from the live jobs API at
`https://www.openrolesindex.com/orgs/all/v1` (27415 active jobs; keyless; full reference `https://www.openrolesindex.com/orgs/all/agent/api.md`).

### Rails

- Never invent a qualification. Say only what the profile or a document the user gave you supports.
- Only evidence-linked claims about the candidate go into anything they might send. A claim from a document the
  candidate provided (résumé file, certificate) is `evidence_linked` (file + line as evidence); one from pasted
  prose or conversation is `self_reported`: it may inform ranking ("you say you have") but stays out of
  anything sent until a document backs it.
- Flag unsubstantiated profile items rather than smoothing them over.
- Never submit an application; the candidate submits on the employer's site.
- Never send the profile anywhere except an assessment the candidate started or an application they submit.
- Say when a judgement is yours and not the data's (a synonym match, a level estimate, a pay conversion, a
  reading of a posting without `ai_requirements`).

### Workflow

1. **Profile.** Read `candidate-profile.json` (schema: `https://www.openrolesindex.com/orgs/all/agent/candidate-profile.schema.json`). If there
   is none, build one from the résumé file (claims `evidence_linked`, file + line as `evidence`; pasted text
   gives `self_reported`), normalise labels to `https://www.openrolesindex.com/orgs/all/agent/vocabulary.json` where the meaning is identical
   (record the mapping in `synonyms`), then ask for what postings here require most:

- **Highest education**, with field and year.
- **Every licence you hold, with its state or country and number.**
- **Certifications with their expiry dates** (an expired certification is a gap, not a match).
- **Shifts you will and will not work** (day, night, rotating, weekend, or your own words): saved as `candidate.schedule`.

   Show the profile to the user before saving.
2. **Search wide, then rank.** Always `time_frame=6m` and `include_beta=true`; filter by `source_category` and
   `location` (full names); `limit` max 100. Page with `fetch.py` and rank with `fit.py` (both at
   `https://www.openrolesindex.com/orgs/all/agent/`; rules in `fit-rubric.md`), never on title alone:
   `python3 fetch.py --category Engineering --location 'San Francisco' --out jobs.json && python3 fit.py candidate-profile.json jobs.json > fit.json`.
   Shift is not an API field: read "Shift:"/hours from `description_text` and label it "from the description,
   my reading". Within a tier sort by distance, then shift match, then pay.
3. **Explain fit in the posting's words.** Every match and gap quotes the requirement's `evidence`.
4. **Artifacts** from `https://www.openrolesindex.com/orgs/all/agent/templates/`, saved beside the profile. First move matched `self_reported`
   claims up (ask for the document, read it, link it); then draft from evidence-linked claims only.
5. **Prepare to apply.** Hand over the job `url` and a pre-flight checklist. The candidate submits.
6. **Verification.** Offer to raise `self_reported` claims to `evidence_linked` by reading a document the
   candidate provides. Assessments are not live here yet; never simulate one.
7. **Watch.** Preferred: job alerts. Ask first (the email is kept only to send alerts), then
   `POST https://www.openrolesindex.com/orgs/all/candidate-keys {"email"}` (MCP `request_candidate_key`); the candidate opens the mail
   and pastes you the `oric_` key, which you keep in the local profile as `candidate_key` and never put in an
   artifact. `POST https://www.openrolesindex.com/orgs/all/alerts` (Bearer; MCP `save_alert`) with the search's filters and `cadence`
   daily|weekly. On each digest: `python3 fetch.py --ids <ids from the mail>` then `fit.py`. The candidate can
   `DELETE https://www.openrolesindex.com/orgs/all/candidate-keys/me` any time. Fallback without a key: daily at a fixed hour,
   `time_frame=24h` (windows tile exactly), plus `expired-ats` with `time_frame=1d` to drop closed jobs.

### Fit tiers

Hard filters (location/radius unless remote or relocating, work arrangement, employment type, pay: top of range
below the floor) → `excluded`; a floor inside the range is flagged, not excluded. Otherwise, over `ai_requirements` matched by kind and label (exact, then `synonyms`, then your
flagged judgement), with `min_years`/`level` thresholds: **strong** all required met and preferred >= 0.5 ·
**good** all required met · **reach** 1 required unmet · **stretch** 2+ unmet · **unscored** no requirements
extracted. `implied` items are reported, not scored.

### MCP

Remote MCP server for All employers: `https://www.openrolesindex.com/orgs/all/mcp` (keyless reads; tools `search_jobs`, `get_job`, `fit_report`,
`similar_jobs`, `application_brief`, and for alerts `request_candidate_key`, `save_alert`,
`list_alerts`, `delete_alert`; see `https://www.openrolesindex.com/orgs/all/agent/mcp.json`). Install: `claude mcp add --transport http all-jobs https://www.openrolesindex.com/orgs/all/mcp`; Codex,
`~/.codex/config.toml`:

```toml
[mcp_servers.all-jobs]
url = "https://www.openrolesindex.com/orgs/all/mcp"
```

Prefer the tools to `curl` when the host cannot run scripts or when `fit_report` saves running `fit.py` (same
result). `fit_report` and `application_brief` with a `profile` send the profile to the server: send it only after
the candidate has agreed; otherwise score locally with `fit.py`.

### This employer

Categories: `Engineering`, `Clinical`, `Sales`, `Other`, `Marketing`, `Manufacturing`, `Information Technology`, `General Business`. No posting here carries `ai_requirements` yet. Read `description_text` for each job you rank, and say every match is your reading of the text, not the data's. 10% of postings state pay (units: YEAR (2729), HOUR (30)). A job without pay is not a job below the floor: say pay is not stated, never estimate it.

Rejected with 400 on this API: `organization`, `exclude_organization`, `source`, `exclude_source`, `domain`, `exclude_domain`, `include_unpublished`, `include_synthetic`.
