gauntlet-curate
Audits the DSA problem bank for coverage gaps and proposes new YAML entries. Use when refreshing the problem bank during update-plugins runs.
Works with
Claude CodeCursorCodex CLIGitHub CopilotGemini CLI
---
name: gauntlet-curate
description: Audits the DSA problem bank for coverage gaps and proposes new YAML entries. Use when refreshing the problem bank during update-plugins runs.
license: MIT
---
# Gauntlet Curate
Survey the DSA problem bank, identify coverage gaps, and propose
new YAML entries for human review.
## When NOT To Use
- Annotating this codebase rather than the problem bank (use
`gauntlet:curate`)
- Rebuilding the knowledge base (use `gauntlet:extract`)
## When This Skill Fires
Invoke this skill manually with `Skill(gauntlet:gauntlet-curate)`
when the problem bank needs a coverage review. The skill is intended
to participate in `/update-plugins` runs but is not yet wired into
that command (see openpackage.yml registration). It is distinct from
`gauntlet:curate`, which handles per-annotation knowledge capture
and is what `/gauntlet-curate` invokes today.
## Steps
1. **Locate the problem bank** at `plugins/gauntlet/data/problems/`.
Read `_manifest.yaml` to load the expected NeetCode counts per
category.
2. **Survey current coverage** by counting problems in each YAML
file (skipping `_manifest.yaml`).
Run the analysis script:
```bash
cd plugins/gauntlet
python scripts/curate_problems.py data/problems/ --output /tmp/gauntlet-curate-report.md
```
3. **Identify gaps**: categories whose actual count falls below
the `neetcode_count` in the manifest.
The script sorts gaps largest-first so the worst shortfalls
appear at the top.
4. **Review existing problems** in each gap category to understand
what is already covered before proposing additions.
5. **Propose new YAML entries** following the schema below.
Add proposals to the report under "Proposed New Problems".
Do NOT write proposals directly into `data/problems/*.yaml`.
6. **Validate proposals** by running:
```bash
python -c "
import yaml, sys
sys.path.insert(0, 'src')
from gauntlet.models import BankProblem
proposals = yaml.safe_load(open('proposals.yaml'))
for p in proposals:
BankProblem.from_dict(p)
print('All proposals valid.')
"
```
7. **Present the report** to the human for review.
The report includes the coverage table, gap list, and proposed
entries.
The human decides which proposals to merge into the YAML files.
## Problem Schema
Each proposed entry must follow this schema:
```yaml
- id: category-NNN
title: Problem Title
difficulty: easy # easy | medium | hard | extra_hard
prompt: |
Problem statement with constraints and examples.
hints:
- First hint.
- Second hint.
solution_outline: |
Approach and time/space complexity.
tags: [tag1, tag2]
neetcode_id: neetcode-NNN
challenge_type: explain_why # explain_why | multiple_choice | trace
# | code_complete | debug | rank
```
Required fields: `id`, `title`, `difficulty`, `prompt`.
Optional fields default to empty values.
## Safety Constraints
- Never modify files under `data/problems/` directly.
- Never run with a `--write` or `--fix` flag: the script
intentionally has none.
- All output is a proposal report for human approval.
- Existing hand-curated problems are never touched.
## Output
A markdown report at the path specified by `--output`, containing:
- Coverage summary table (expected vs. actual per category)
- Gaps list sorted by missing count
- YAML schema template for new proposals
- Space for the human reviewer to add proposed entries
Human review is required before any YAML file changes.
## Exit Criteria
- [ ] Script runs without error and produces a markdown report at the
path given to `--output` (e.g., `/tmp/gauntlet-curate-report.md`)
- [ ] Report contains a coverage summary table comparing expected
`neetcode_count` versus actual count for every category in
`_manifest.yaml`, with gaps sorted largest-first
- [ ] No files under `plugins/gauntlet/data/problems/` are modified;
all proposals appear only in the report under "Proposed New
Problems"
- [ ] Every proposed YAML entry passes `BankProblem.from_dict()`
validation (required fields: `id`, `title`, `difficulty`,
`prompt`) before appearing in the reportMore AI & ML skills
writing-shape
mattpocock/skills
Writing, exploit: shape raw material into an article, paragraph by paragraph.
275.5k
writing-fragments
mattpocock/skills
Writing, explore: mine raw fragments, no structure yet.
275.3k
full-output-enforcement
leonxlnx/taste-skill
Overrides default LLM truncation behavior. Enforces complete code generation, bans placeholder patterns, and handles token-limit splits cleanly. Apply to any task requiring exhaustive, unabridged output.
273.1k

