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.
Detects and diagnoses application failures by analyzing error logs, stack traces, and system state. Useful when debugging crashes or production incidents.
Recognizes development errors from bash, Playwright, builds, APIs, logs; searches past solutions via scripts; applies fixes and logs new ones for future reference. Activates on error mentions or debug requests.