Method and limits
Where the data comes from
Roles come straight from each organization's hiring system: public applicant-tracking feeds (Greenhouse, Lever, Ashby) where they exist, and a hand-kept supplement for orgs that publish no feed we can read. Every role is tagged with how it was collected (api or manual), so the two never blur together. This snapshot (2026-08-10) holds 75 concrete vacancies, 65 from feeds and 10 captured by hand. Four orgs with no usable machine-readable feed (GovAI, Apart, Redwood, Palisade) were read off their careers pages in a browser that runs the page's scripts.
Hiring systems move, and a feed that has gone quiet looks exactly like an org that has stopped hiring, so each collection is checked against the previous one for any org that drops to zero. That check earned its keep on 2026-07-26: the Center for AI Safety's Lever feed still answered normally but had gone empty, because the org had moved to Greenhouse some time after the 2026-07-20 snapshot, which still read seven roles from Lever. Their six open roles would otherwise have been recorded as none. Palisade also moved, from a Notion page to a Gusto board, and is still read by hand.
The hand-kept rows are only as fresh as the last capture. Between captures they carry forward unchanged into each scheduled snapshot, so for those four orgs a value that does not move may mean nobody has looked recently rather than that nothing has changed. The manual supplement was last re-captured on 2026-08-10.
Expressions of interest are set aside
Some listings are standing "expression of interest" or "general interest" invitations rather than posted openings. There are 12 of them in this snapshot. They are kept in the dataset but left out of the vacancy counts, since they are a way to register rather than a job to fill.
How roles are sorted
Two plain rules, both readable in classify.py:
- Title seniority. Clear markers sort titles into entry (intern, internship, junior, new grad, graduate, apprentice, scholar, and fellowship programs), senior (senior, staff, principal, lead, head, director, chief, manager, expert, founding), or unspecified. An unmarked "Research Engineer" stays unspecified rather than getting a guessed level.
- Two words that needed care. "Fellow" splits in two: a fellowship or a season-prefixed fellow is a structured program and counts as entry, but a bare "Research Fellow" is a think-tank staff title asking for substantial experience and does not. And "Member of Technical Staff", the standard unleveled title at AI labs, is exempted from the "staff" marker, which is meant for the genuinely senior Staff Engineer rung.
- Minimum years. The smallest stated "N years" figure in the description, used as a floor. The parser anchors on structured "required experience" fields and on year-mentions sitting near a cue that makes them a requirement (experience, track record, background). It skips non-experience uses of "years" (visa residency, post-job bans, contract lengths, "in the next N years") and sub-clauses that narrow a requirement already stated, since "5+ years ... with at least 2 years leading a team" has a floor of five, not two. Where several figures compete for one cue, the nearest wins, so a later bullet cannot borrow an earlier one's. Only 14 of 75 roles state a number, so it is a cross-check; the title remains the main signal.
These rules have checks in test_classify.py, each one a real posting phrasing, so
a future change cannot quietly undo them. Run python test_classify.py.
What to keep in mind
- Postings are not need. This counts public openings. Senior and network hiring often never gets posted, so the data undercounts senior demand and should not be read as where the field most needs people.
- One org carries a lot of weight. Goodfire is about 37% of the vacancies, so it pulls the field-wide numbers toward its own shape.
- Partial coverage. Only orgs we could reach are in. The roster shows who is in and who is out.
- Coarse title rules. Counting "Manager" or "Lead" as senior is a judgment call. The rules are written down so anyone can disagree with a specific case.