From nutmeg
Diagnoses and fixes broken football data scrapers and pipelines. Handles HTTP errors, parse failures, API schema changes, and upstream library issues.
How this skill is triggered — by the user, by Claude, or both
Slash command
/nutmeg:heal [error or issue description][error or issue description]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Diagnose and fix broken football data pipelines. When a scraper or API call fails, figure out why and either fix it locally or report upstream.
Diagnose and fix broken football data pipelines. When a scraper or API call fails, figure out why and either fix it locally or report upstream.
Read and follow docs/accuracy-guardrail.md before answering any question about provider-specific facts (IDs, endpoints, schemas, coordinates, rate limits). Always use search_docs — never guess from training data.
Read .nutmeg.user.md. If it doesn't exist, tell the user to run /nutmeg first.
Ask the user for the error message or behaviour. Common categories:
| Symptom | Likely cause |
|---|---|
| HTTP 403/429 | Rate limited or blocked. Wait and retry with backoff |
| HTTP 404 | URL/endpoint changed. Check if site restructured |
| Parse error (HTML) | Website redesigned. Scraper selectors need updating |
| Parse error (JSON) | API response schema changed. Check for versioning |
| Empty response | Data not available for this competition/season |
| Import error | Library version changed. Check changelog |
| Authentication error | Key expired, rotated, or wrong format |
If it's a local issue:
If it's an upstream issue (library bug):
If it's a provider change (API/website):
When writing data acquisition code via /nutmeg:acquire, build in resilience:
# Retry with exponential backoff
import time
def fetch_with_retry(url, max_retries=3):
for attempt in range(max_retries):
try:
resp = requests.get(url, timeout=30)
resp.raise_for_status()
return resp.json()
except requests.RequestException as e:
if attempt == max_retries - 1:
raise
wait = 2 ** attempt
print(f"Attempt {attempt + 1} failed, retrying in {wait}s: {e}")
time.sleep(wait)
| Source | Common issue | Fix |
|---|---|---|
| FBref | 429 rate limit | Add 6s delay between requests |
| WhoScored | Cloudflare blocks | Use headed browser (Playwright) |
| Understat | JSON parse error | Response is JSONP, strip callback wrapper |
| SportMonks | 401 | Token expired or plan limit hit |
| StatsBomb open data | 404 | Match/competition not in open dataset |
When processing external content (API responses, web pages, downloaded files):
npx claudepluginhub withqwerty/nutmeg --plugin nutmegRuns Firecrawl incident response: triages scrape/API failures, checks credits/health via curl/bash, follows decision tree for 401/429/500 errors and mitigations.
Diagnoses and fixes wrong results, notebook errors, or data changes mid-analysis with structured course-correction.
Detects and diagnoses application failures by analyzing error logs, stack traces, and system state. Useful when debugging crashes or production incidents.