Skip to content
Development
Skill

/algo-hr-matching

\"Implement Gale-Shapley stable matching algorithm for two-sided matching problems. Use this skill when the user needs to match candidates to positions, assign students to schools, or solve any two-sided preference matching — even if they say 'optimal job matching', 'stable

From plugin
awesome-agent-skill
27200 skills4 commands

Claude Code

$ npx -y skills add charlieviettq/awesome-agent-skill --skill algo-hr-matching --agent claude-code

SKILL.md

algo-hr-matching.SKILL.md
name: "\"algo-hr-matching\""
description: "\"Implement Gale-Shapley stable matching algorithm for two-sided matching problems. Use this skill when the user needs to match candidates to positions, assign students to schools, or solve any two-sided preference matching — even if they say 'optimal job matching', 'stable assignment', or 'candidate-position pairing'.\"."
allowed-tools: Read, Glob, Grep

Gale-Shapley Stable Matching

Overview

Gale-Shapley (deferred acceptance) finds a stable matching between two equally-sized sets where no unmatched pair prefers each other over their current match. Runs in O(n²) worst case. Proposer-optimal: the proposing side gets their best stable partner.

When to Use

**Trigger conditions:**

  • Matching candidates to job positions based on mutual preferences
  • Assigning students to schools or residents to hospitals
  • Any two-sided matching where stability (no blocking pairs) is required

**When NOT to use:**

  • For one-sided assignment (use Hungarian algorithm)
  • When preferences are based on scores, not rankings (use optimization)

Algorithm

IRON LAW: The Proposing Side Gets Their BEST Stable Partner
Gale-Shapley is proposer-optimal and reviewer-pessimal. If employers
propose, they get their best stable match; candidates get their worst.
The CHOICE of who proposes determines which stable matching is found.

Phase 1: Input Validation

Collect: preference rankings from both sides. Each participant ranks all members of the other side. **Gate:** Complete preference lists, equal-sized groups (or handle unequal with dummy entries).

Phase 2: Core Algorithm

1. All proposers are "free" (unmatched) 2. While any proposer is free and hasn't proposed to everyone:

  • Free proposer proposes to their highest-ranked unproposed-to reviewer
  • Reviewer accepts if unmatched, or replaces current match if new proposer is preferred
  • Replaced proposer becomes free again

3. Terminate when all proposers are matched

Phase 3: Verification

Check stability: for every unmatched pair (a,b), verify that at least one of them prefers their current match over the other. No blocking pairs = stable. **Gate:** Zero blocking pairs found.

Phase 4: Output

Return matching with stability confirmation.

Output Format

{
  "matching": [{"proposer": "Candidate_A", "reviewer": "Company_X", "proposer_rank": 1, "reviewer_rank": 2}],
  "metadata": {"pairs": 10, "rounds": 23, "blocking_pairs": 0, "proposer_side": "candidates"}
}

Examples

Sample I/O

**Input:** 3 candidates, 3 companies, each with full preference rankings **Expected:** Stable matching with zero blocking pairs. Candidate-proposing gives candidate-optimal result.

Edge Cases

| Input | Expected | Why | |-------|----------|-----| | All prefer same #1 | Still terminates, stable | Rejected proposers move to next choice | | Identical preferences | Unique stable matching | Only one possibility | | Unequal sides | Some unmatched on larger side | Add dummy entries or use many-to-one variant |

Gotchas

  • **Proposer advantage**: If candidates propose, they get better matches than if companies propose. This is a design choice with equity implications.
  • **Incomplete preferences**: If participants don't rank everyone, unmatched results are possible. Handle with acceptable-partner thresholds.
  • **Many-to-one**: Hospital-resident matching uses the many-to-one variant (each hospital has multiple slots). Use the Roth-Peranson extension.
  • **Strategic manipulation**: The reviewing side CAN benefit from misreporting preferences (truncating lists). The proposing side cannot — truthful reporting is dominant strategy for proposers.
  • **Preference elicitation**: Getting honest, complete rankings is hard in practice. People satisfice rather than fully rank all options.

References

  • For many-to-one matching (hospital-resident), see `references/many-to-one.md`
  • For strategic behavior analysis, see `references/strategic-manipulation.md`
Read more
@charlieviettq
Ships withawesome-agent-skill

Curated skill pack for LLM agents in engineer and science workflow (Cursor & Claude ready).

Stars on GitHub

Momentum

stars in total
27
Star history of charlieviettq/awesome-agent-skill on GitHub, a chart by star-history.com

Other skills on awesome-agent-skill.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about algo-hr-matching.

Which coding agents can use algo-hr-matching?
algo-hr-matching installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.