Skip to content
Back to skills

Pass At K

ASecurity

Compute pass@k — the standard "any of N samples is correct" metric for code-generation evaluation (HumanEval / MBPP / LiveCodeBench / APPS / BigCodeBench / CodeContests). Use when the user has N samples per problem and wants the unbiased estimator of "probability at least one of the top-k is correct". Returns mean pass@k across the dataset, in [0, 1].

  • 3 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 11, 2026
researchpython

Security analysis

A100/100

Scanned September 11, 2026

npx -y skills add qhjqhj00/research-skills-pool --skill pass-at-k --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pass At K?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pass At K
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/qhjqhj00-pass-at-k/badge)](https://www.skillsdirectory.com/skills/qhjqhj00-pass-at-k)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: pass-at-k
description: Compute pass@k — the standard "any of N samples is correct" metric for code-generation evaluation (HumanEval / MBPP / LiveCodeBench / APPS / BigCodeBench / CodeContests). Use when the user has N samples per problem and wants the unbiased estimator of "probability at least one of the top-k is correct". Returns mean pass@k across the dataset, in [0, 1].
metadata:
  source_paper: arXiv:2107.03374 (Codex / HumanEval, Chen et al. 2021)
  task_type: code-eval-metric
  metrics: ["pass@k"]
  use_cases: [HumanEval, MBPP, APPS, LiveCodeBench, BigCodeBench, CodeContests]
---

# pass-at-k — Unbiased pass@k for code generation

Source: Chen et al., "Evaluating Large Language Models Trained on Code" (Codex paper, arXiv:2107.03374, §2.1). The unbiased estimator avoids the bias of the naive `1 - (1 - p)^k` plug-in when you only sampled a finite n.

## When to invoke this skill

- User has, per problem: `n` total samples, `c` of which pass the unit tests, and wants `pass@k` for some `k ≤ n`
- User says "compute pass@k", "HumanEval-style scoring", "pass@1 / pass@10 / pass@100"
- User mentions code-gen benchmarks (HumanEval, MBPP, APPS, LiveCodeBench, BigCodeBench)

## Definition

For a single problem with `n` total samples, `c` correct samples, and target cutoff `k`:

```
pass@k = 1 - C(n - c, k) / C(n, k)        if n - c >= k
       = 1                                 if n - c < k
```

Numerically stable form (paper-standard):
```
pass@k = 1 - prod_{i=n-c+1..n} (1 - k / i)        # iff k <= n - c
```

Then average over all problems in the dataset. **Use the unbiased estimator above, not `1 - (1 - c/n)^k`.**

## Reference implementation

```python
import numpy as np

def pass_at_k(n: int, c: int, k: int) -> float:
    """Unbiased pass@k for one problem. n total samples, c correct, cutoff k."""
    if k > n:
        raise ValueError(f"k={k} > n={n}; need to sample at least k completions")
    if n - c < k:
        return 1.0
    # 1 - prod_{i in [n-c+1 .. n]} (1 - k/i)
    return 1.0 - float(np.prod(1.0 - k / np.arange(n - c + 1, n + 1)))

def mean_pass_at_k(results: list[tuple[int, int]], k: int) -> float:
    """results = list of (n, c) per problem."""
    return float(np.mean([pass_at_k(n, c, k) for n, c in results]))

# example usage
# Per problem you sampled n=20 times and ran tests on each.
# results = [(20, 14), (20, 0), (20, 7), ...]
print(mean_pass_at_k(results, k=1))   # 0.35 — typical
print(mean_pass_at_k(results, k=10))  # higher; closer to coverage
```

The HuggingFace `evaluate` library has the same impl: `evaluate.load("code_eval")`.

## Input contract

- Per problem: integer `n` (samples drawn) and integer `c` (samples that passed all unit tests).
- `k`: cutoff. **Common reporting**: `pass@1` (greedy / temp 0.2 single sample), `pass@10`, `pass@100`. Must satisfy `k ≤ n`.
- Sampling: paper uses temperature 0.8 for `pass@10/100`, 0.2 for `pass@1`. Don't claim a high pass@k by sampling at temperature 0.

## Output format

```
HumanEval (164 problems, n=200, T=0.8):
  pass@1  = 0.282
  pass@10 = 0.461
  pass@100= 0.722
```

## Edge cases

- `c == 0`: contribution is exactly 0 for any k (no correct sample to draw).
- `c == n`: contribution is exactly 1 for any k ≤ n.
- `k > n`: undefined — your sampling protocol is incompatible. Either raise or downgrade k to n.
- Non-determinism in unit tests (timing flakes): re-run flaky tests, or wrap with a 60s timeout + fixed seeds. Do NOT count timeouts as `pass`.

## Don'ts

- Don't use `1 - (1 - c/n)^k` — biased upward when c is small.
- Don't compute pass@1 by sampling once and calling it pass@1 if `n=1` — variance is enormous; always sample n≥10 even for pass@1 and use the unbiased estimator.
- Don't rely on the model-output being valid Python — wrap unit-test execution in a sandbox + timeout. The paper warns about this explicitly.

## Citation

```bibtex
@article{chen2021codex,
  title={Evaluating Large Language Models Trained on Code},
  author={Chen, Mark and Tworek, Jerry and Jun, Heewoo and others},
  journal={arXiv:2107.03374}, year={2021}
}
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.