Skip to content

feat: AI exposure shows the published score for each role, or says there isn't enough data - #81

Open
coderback wants to merge 1 commit into
mainfrom
feat/index-scores
Open

coderback wants to merge 1 commit into
mainfrom
feat/index-scores

Conversation

@coderback

Copy link
Copy Markdown
Owner

Why

AI exposure scores weren't what the page said they were:

  • 1,062 of 1,704 stored jobs showed a placeholder 50% because no occupation matched.
  • Some matches were wrong: Business Analyst landed on "Agents and Business Managers of Artists", Research Engineer on Market Research Analysts.
  • Skill scores such as "Python 78%" came from a hand-written table, because the index has no skill-level data. The same role could get two scores (software engineer: 62% on the careers page, 28.8% on the job page).
  • A published zero means too little usage was seen, not that a job is safe. 411 of 756 occupations are zero.

What changes

Scores (risk_scorer.py)

  • A job title is matched to an occupation using O*NET's job title list, and the score is the one Anthropic publishes for it. Nothing is estimated and no model is involved.
  • About 50 titles O*NET leaves out or spreads across occupations are placed by hand (backend, DevOps, ML engineer). A few O*NET entries that are plainly wrong on real titles are ignored, and so are fields of work such as "Marketing".
  • A longer title can contain a known one. If it contains two from different occupations, it isn't scored.
  • No clear occupation, or a published zero, gives "Not enough data".
  • Job scores are looked up when read, so old stored values can't show and a data update applies to every job. The old exposure_score column stays but isn't read for display.

Pages

  • The careers page lists your target and past roles, with the occupation behind each score or the reason there isn't one. The skill table, skill-mix average and "most resilient skill" are gone.
  • The dashboard card shows your roles.
  • Job pages and the preview name the occupation or say "Not enough data". A job saved in the browser with the old 50% also shows "Not enough data".
  • POST /score-skills is replaced by GET /careers/exposure, which doesn't call the model.

Roadmap

  • It gets the tasks people hand to AI most and least in the target occupation, for the 103 occupations with enough data. The evidence is one month of chat use, so the model treats it as a hint and is told not to quote figures.
  • The careers page shows the same summary with those limits stated.
  • It still receives your listed skills, so it doesn't recommend them again.

Data

  • New: data/occupation_titles.csv (O*NET 30.2, CC BY 4.0) and data/occupation_evidence.json, each with a build script in scripts/.
  • Removed: data/task_penetration.csv and scikit-learn, which nothing else used.

Result on real data

Of the 1,704 stored job titles, 1,340 get a published score, 364 show "Not enough data", and none show the old 50%.

Testing

  • Backend: 1262 passed, 8 skipped, 46 deselected. New tests are in test_exposure.py, including labelled real titles.
  • Browser: 22 of 22 mocked smoke tests passed, 2 of them new. The real-browser tests were not run.
  • Pages checked in screenshots with mocked data on desktop, phone width and dark mode, with no sideways scrolling. Not yet run against the real API.
  • One real roadmap with a made-up profile: six items, no percentages, no "safe" or "at risk" wording, no listed skill repeated.

Known limits

  • The published figures come from 2025 Claude usage and US occupation data, and probably undercount software: "design and build software" scores zero in the published file.
  • The hand-placed titles are a judgement call. ML Engineer is the main one: O*NET lists it under three occupations, and it's placed with AI Engineer.
  • New titles could still hit an odd O*NET entry. Naming the occupation on each score makes that visible.

After merging

Run docker compose up -d --build api frontend, because both changed.

…ere isn't enough data

Most jobs showed a placeholder 50%, some matches were plainly wrong (Business Analyst landed on agents of artists), and
"Python 78%" came from a hand-written table the index has no data for. A job title now finds its occupation through
O*NET's list of job titles, and the score is the one Anthropic publishes for that occupation. A title that doesn't clearly
belong to one occupation, or an occupation published at zero (too little usage seen, not safe), shows "Not enough data".
Job scores are looked up when read, so stored placeholders can't show.

Per-skill scores and the model-written reasons are gone. The careers page and dashboard show your roles instead, and name
the occupation behind each score. The roadmap gets a short summary of the tasks people hand to AI most and least in the
target occupation as a hint, and the page shows it too.

task_penetration.csv and scikit-learn are removed: nothing else used them.
@vercel

vercel Bot commented Nov 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
windrush-career-demo Ignored Ignored Nov 4, 2026 12:03am UTC

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant