Skip to content

WW-80 (WING-77) — MOS ↔ occupational-series crosswalk join feasibility

Spike research. Produced by fleet worker (grok kind, DESKTOP-D249KD4), 2026-07-24. Reviewed and committed by WT-2f62.

Question

Can we chain MOS → O*NET-SOC → OPM occupational series to build "your 25B maps to federal series 2210" queries, using published crosswalk data (O*NET/DMDC military crosswalk + USAJOBS occupational-series codelist)?

Answer

Not as a reliable, complete three-table chain. The left hop (MOS → O*NET-SOC) is solved data via the DMDC/O*NET military crosswalk. The right hop (O*NET-SOC → OPM series) has no published standard crosswalk file — DMDC's embedded OPM rows almost never carry O*NET codes (the G.ONET reverse-join table is ~0.8% filled). A usable "25B → 2210" style query is still buildable, but only via a hybrid design: structural priors (DODOCC → series) + lexical title matching + family priors, emitting ranked search seeds, never equivalence claims.

Gap detail

Gap Detail
No published SOC↔OPM file Cannot implement O*NET-SOC → series as a standard O*NET crosswalk hop.
G.ONET almost empty 0.8% fill → reverse O*NET join unusable.
DODOCC taxonomy mismatch Military IT (153100) ≠ federal IT series DODO (270500 for 2210). Cyber DODOs (117000/127000) map to zero series.
~45% military active rows No DODOCC→G hit at all.
Obsolete / aliased codes AFSC X placeholders, skill digits, redesigns (3D0→1D7). Army ASI/SQI (J/Q) not the primary MOS.
Fan-out / noise DODOCC med 2 / max 24 series; keyword hits 10–28 with false friends (IT in "Credit Union", material in nuclear materials, student-trainee series).
OnLine breadth vs DMDC primary UI returns many occupations per MOC; good for discovery, bad if treated as official multi-series equivalence.
Licensure / agency constraints Series presence ≠ hiring path, grade, or credential (68W; DHS-only cyber series).

Fan-out summary (design input)

Layer Typical fan-out Notes
DMDC primary O*NET per MOC 1 (sometimes 2–4) Tight but often coarse (15-1299.00 for 25B).
OnLine Military Transition Search Many (often 10–20+ for popular MOS) Multi-source; exploration-oriented (report).
DODOCC → series median 2, max 24 Partial coverage; uneven quality.
Naive title keywords → series ~10–28 Needs denylist + ranking.

Goal: Produce ordered search seeds for USAJOBS (JobCategoryCode + Keyword), not equivalences.

input: service, moc_raw, optional rank/shredout

1. Normalize MOC
   - Army: strip skill level if present; prefer primary MOS over ASI/SQI
   - AF/SF: expand X-skill (3D0X2 → try 3D051/52/71/72…); if obsolete, follow successor table (3D0* cyber → 1D7*)
   - Match DMDC on (SVC, MPC, MOC) with STATUS=A preferred; else last obsolete with ONET/DODOCC

2. Structural candidates (score high when present)
   - S_dodo = active G series sharing DODOCC
   - Filter: drop student-trainee (*99), maritime 99xx unless Navy transition mode, DHS-only unless user opts in

3. Lexical candidates (score medium)
   - Tokenize MOC_TITLE + ONET titles
   - Match against USAJOBS/G series titles (and optional family 2200/2000/0600…)
   - Denylist brittle substrings; require word-boundary matches

4. Optional occupation-breadth keywords (score medium-low)
   - Use DMDC ONET titles always
   - Optionally expand via OnLine/Web Services military search (cap N occupations)
   - Convert titles → USAJOBS Keyword strings (not automatic series claims)

5. Rank & cap
   - score = w1*dodo_hit + w2*title_jaccard + w3*family_prior(IT→2200, supply→2000, …) + w4*popularity_prior(2210,2001,…)
   - emit top_N series (N=3..5 default) + top_K keywords
   - always attach disclaimer string (Kerr rule)

6. Fallback
   - if zero series after filters: Keyword-only search from MOC title + ONET title; no JobCategoryCode
   - never invent series codes not in USAJOBS codelist

Example outputs under this rule (illustrative seeds):

MOS Top series seeds (illustrative) Keyword fallback seeds
25B 2210, 0335, 1550/0854 (lexical) — not DODOCC-only 0332/0356 alone "information technology", "systems administrator", "network"
88M 5703, 2151 (+ optional 2101 lexical) "truck driver", "motor vehicle", "dispatcher"
92Y 2001, 2010, 2005 (+ optional 0346) "supply", "inventory", "logistics"
68W 0640, 0621 (+ optional 0620 if licensed UX) "paramedic", "EMT", "health technician"
3D0X2 / 1D7X1 2210 (+ 1550/0854 lexical; avoid auto-adding DHS-only) "cyber", "information security", "network administrator"

What not to build

  • A hard-coded claim graph "MOS equals series."
  • UI copy that sounds like OPM classification decisions.
  • Sole reliance on DODOCC or sole reliance on a non-existent SOC↔OPM file.

Open questions

  1. Will O*NET/DMDC ever publish a real SOC↔OPM or fill G.ONET? Worth a short contact to O*NET Center / DMDC; until then assume hybrid forever.
  2. Curated high-volume MOS table? For top ~50 transition MOSs, a maintained seed list (with review) may beat pure joins — especially IT/cyber.
  3. AFSC successor maintenance: Who owns 3D0→1D7 (and future) alias tables — product data job vs vendor file only?
  4. DHS-only 2212–2230 series: Show always / never / advanced toggle?
  5. WG vs GS: Should motor transport default to WG 5703 seeds, GS 2101, or both with labels?
  6. Licensure gates in UX: For 68W/medical, how explicit before showing 0620/0602?
  7. Refresh cadence: DMDC zip naming (milx0724) suggests periodic drops; USAJOBS codelist is live API — version both.
  8. Web Services vs zip: Prefer offline zip for batch joins; optional OnLine breadth for interactive UX only.
  9. Legal copy: CC BY attribution for O*NET materials; USAJOBS API ToS for job search; never imply OPM endorsement.

Direct answers to the ticket questions

Question Answer
Can we chain MOS → O*NET-SOC → OPM series using published files? Not as a reliable complete chain. Left hop yes; right hop has no published SOC↔OPM crosswalk, and DMDC's embedded OPM rows almost never carry O*NET codes.
Can we still seed "25B → 2210" style queries? Yes, via hybrid design (lexical + priors + optional DODOCC), with Kerr wording.
Coverage gaps? No SOC↔OPM file; G.ONET empty; ~45% mil rows miss DODOCC→series; AF cyber DODO→0 series; obsolete AFSCs; fan-out noise.
Fan-out? DMDC O*NET ~1; DODOCC series median 2 (max 24); keywords 10–28 before ranking.
Query-builder rule? Top-N series by (DODOCC directness + title match + family prior), plus keyword fallback; never fit claims.

Sources cited

  1. USAJOBS Developer — Occupational series codelist; live API https://data.usajobs.gov/api/codelist/occupationalseries (unauthenticated).
  2. USAJOBS Developer — Search API / JobCategoryCode.
  3. USAJOBS Developer — Terms of Use.
  4. O*NET Resource Center — Crosswalk Files; military zip https://www.onetcenter.org/dl_files/2019/military_crosswalk.zip (milx0724 CSV/XLSX/ACCDB + Read Me).
  5. O*NET Resource Center — Military Transition Search report.
  6. O*NET OnLine — MOC crosswalk UI; crosswalk index.
  7. O*NET licenses — Resource Center CC BY 4.0; Database CC BY 4.0.
  8. OPM — GS classification / Occupational Handbook PDF.
  9. DMDC — cited as source inside O*NET military crosswalk Read Me (Defense Manpower Data Center).

Bottom line for WING-77: Treat MOS→O*NET as solved data, MOS→series as a product ranking problem over partial structural joins + lexical seeds — not a single clean three-table chain. Ship search seeds; never ship fit claims.

Jira WING-77 · Vikunja · BOARD.md