Mechanism
The spec separates the pipeline into six explicit layers. Every decision is auditable, every formula is testable, and every output carries its provenance back to the source data.
Build a PPMI-weighted co-occurrence graph from job postings. PMI = log P(a,b) / (P(a) · P(b)). Drop edges where PMI ≤ 0. The edge key is the sorted tuple of skill names, so the same pair queried in either order hits the same entry.
ppmi = max(0, log(p_ab / (p_a * p_b)))Distance is 1 minus a clamped similarity. Similarity = direct overlap (sum of min) + indirect PPMI bridge (0.4 hop decay). Output is always in [0, 1]. The top-5 shared skills, ranked by min, come back as the explainable output.
distance = 1 - clamp01(direct + indirect)All-pairs skill distance, keep edges where distance ≤ 0.85. Each surviving pair produces two directed edges with mirrored source/target and the same shared_skills list. The graph is unweighted for BFS, weighted for Dijkstra.
edge.skill_distance ∈ [0, 1]Single-source min-cost path. Edge cost = α · dist_norm + γ · risk_norm. Both factors non-negative, so the standard binary-heap Dijkstra is correct. Alpha = 0.6, gamma = 0.4 by default.
edge_cost = α * dist_norm + γ * risk_normOnce the path is fixed, score targets by β · wage_norm − path_cost − γ₂ · risk. Wage never appears in the path cost, so it can't telescope. Top N returned, sorted by score descending. Beta = 0.5, gamma2 = 0.3 by default.
score = β * wage_norm − path_cost − γ₂ * riskBrandes' BFS for betweenness, trivial max-deg-normalized for degree. OLS regression of median wage on degree centrality. Gap = (predicted − actual) / predicted; positive gap flags underpayment. The only red on the page.
gap = (predicted - actual) / predicted