Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Collect Grammarly debug evidence for support tickets and troubleshooting. Use when encountering persistent issues, preparing support tickets, or collecting diagnostic information for Grammarly problems. Trigger with phrases like "grammarly debug", "grammarly support bundle", "collect grammarly logs", "grammarly diagnostic".
.claude/skills/jeremylongshore-grammarly-debug-bundle/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 9% | 0% |
Collect Grammarly API connectivity status, text analysis response quality, authentication state, and rate limit usage into a single diagnostic archive. This bundle helps troubleshoot text check failures, missing suggestions, OAuth token expiration, and API response latency.
bash#!/bin/bash set -euo pipefail BUNDLE="debug-grammarly-$(date +%Y%m%d-%H%M%S)" mkdir -p "$BUNDLE" # Environment check echo "=== Grammarly Debug Bundle ===" | tee "$BUNDLE/summary.txt" echo "Generated: $(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$BUNDLE/summary.txt" echo "GRAMMARLY_API_KEY: ${GRAMMARLY_API_KEY:+[SET]}" >> "$BUNDLE/summary.txt" echo "GRAMMARLY_CLIENT_ID: ${GRAMMARLY_CLIENT_ID:+[SET]}" >> "$BUNDLE/summary.txt" # API connectivity — text check endpoint HTTP=$(curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: Bearer ${GRAMMARLY_API_KEY}" \ -H "Content-Type: application/json" \ -X POST https://api.grammarly.com/v1/check \ -d '{"text": "This are a diagnostic test sentence with intentional grammar errors to verify the API returns suggestions."}' \ 2>/dev/null || echo "000") echo "API Status: HTTP $HTTP" >> "$BUNDLE/summary.txt" # Full text check response curl -s -H "Authorization: Bearer ${GRAMMARLY_API_KEY}" \ -H "Content-Type: application/json" -X POST https://api.grammarly.com/v1/check \ -d '{"text": "This are a diagnostic test sentence with intentional grammar errors to verify the API returns suggestions."}' \ > "$BUNDLE/text-check.json" 2>&1 || true # Account info and rate limit headers curl -s -D "$BUNDLE/rate-headers.txt" -H "Authorization: Bearer ${GRAMMARLY_API_KEY}" \ https://api.grammarly.com/v1/account > "$BUNDLE/account.json" 2>&1 || true tar -czf "$BUNDLE.tar.gz" "$BUNDLE" && rm -rf "$BUNDLE" echo "Bundle: $BUNDLE.tar.gz"
bashtar -xzf debug-grammarly-*.tar.gz cat debug-grammarly-*/summary.txt # Auth + API status jq '.alerts | length' debug-grammarly-*/text-check.json # Suggestion count jq '.alerts[] | {type, text}' debug-grammarly-*/text-check.json # Suggestion details grep -i "ratelimit\|retry" debug-grammarly-*/rate-headers.txt
| Symptom | Check in Bundle | Fix | |---------|----------------|-----| | API returns 401 | summary.txt shows HTTP 401 | Refresh OAuth token or regenerate API key in Grammarly Developer Hub | | Zero suggestions returned | text-check.json has empty alerts array | Verify text exceeds minimum word count (30 words); check language parameter | | High latency (>5s) | text-check.json shows slow response time | Reduce text payload size; check for network proxy interference | | Rate limited (429) | rate-headers.txt shows Retry-After | Implement request queuing; reduce check frequency per user session | | Client ID mismatch | account.json returns permission error | Verify GRAMMARLY_CLIENT_ID matches the app registered in Developer Hub |
typescriptasync function checkGrammarly(): Promise<void> { const key = process.env.GRAMMARLY_API_KEY; if (!key) { console.error("[FAIL] GRAMMARLY_API_KEY not set"); return; } const res = await fetch("https://api.grammarly.com/v1/check", { method: "POST", headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json" }, body: JSON.stringify({ text: "This are a test sentence with grammar errors for diagnostic purposes and validation." }), }); console.log(`[${res.ok ? "OK" : "FAIL"}] API: HTTP ${res.status}`); if (res.ok) { const data = await res.json(); console.log(`[INFO] Suggestions returned: ${data.alerts?.length ?? 0}`); } } checkGrammarly();
See grammarly-common-errors.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 17,768 | 19,017 | +7% | 1 | 1 | 0% | 3,547 | 4,219 | +19% | 0 | 0 | — |
case-02 | fail→pass | 10,446 | 10,917 | +5% | 1 | 1 | 0% | 2,101 | 2,423 | +15% | 0 | 0 | — |
case-03 | pass→pass | 12,441 | 13,065 | +5% | 1 | 1 | 0% | 2,877 | 3,140 | +9% | 0 | 0 | — |
case-04 | pass→pass | 12,625 | 8,455 | -33% | 1 | 1 | 0% | 1,554 | 3,206 | +106% | 0 | 0 | — |
case-05 | pass→pass | 7,388 | 9,827 | +33% | 1 | 1 | 0% | 1,517 | 2,033 | +34% | 0 | 0 | — |
case-06 | fail→pass | 8,354 | 8,583 | +3% | 1 | 1 | 0% | 1,788 | 1,979 | +11% | 0 | 0 | — |
case-07 | pass→pass | 13,488 | 4,030 | -70% | 1 | 1 | 0% | 1,680 | 2,059 | +23% | 0 | 0 | — |
case-08 | fail→pass | 12,071 | 10,162 | -16% | 1 | 1 | 0% | 2,194 | 3,082 | +40% | 0 | 0 | — |
case-09 | pass→pass | 15,997 | 12,635 | -21% | 1 | 1 | 0% | 2,050 | 2,769 | +35% | 0 | 0 | — |
case-10 | pass→pass | 16,779 | 3,943 | -77% | 1 | 1 | 0% | 1,782 | 1,759 | -1% | 0 | 0 | — |
case-11 | pass→pass | 15,581 | 9,335 | -40% | 1 | 1 | 0% | 1,596 | 1,809 | +13% | 0 | 0 | — |
case-12 | pass→pass | 11,855 | 7,886 | -33% | 1 | 1 | 0% | 2,006 | 1,644 | -18% | 0 | 0 | — |
case-13 | pass→pass | 7,773 | 2,633 | -66% | 1 | 1 | 0% | 1,329 | 1,608 | +21% | 0 | 0 | — |
case-14 | pass→pass | 7,901 | 7,999 | +1% | 1 | 1 | 0% | 1,401 | 1,623 | +16% | 0 | 0 | — |
case-15 | pass→pass | 8,642 | 4,476 | -48% | 1 | 1 | 0% | 1,668 | 2,008 | +20% | 0 | 0 | — |
case-16 | fail→pass | 11,842 | 10,896 | -8% | 1 | 1 | 0% | 1,835 | 2,124 | +16% | 0 | 0 | — |
case-17 | pass→pass | 2,811 | 6,191 | +120% | 1 | 1 | 0% | 398 | 1,328 | +234% | 0 | 0 | — |
case-18 | pass→pass | 13,401 | 10,730 | -20% | 1 | 1 | 0% | 2,515 | 2,179 | -13% | 0 | 0 | — |
case-19 | pass→pass | 10,063 | 5,998 | -40% | 1 | 1 | 0% | 1,807 | 2,179 | +21% | 0 | 0 | — |
case-20 | pass→pass | 16,429 | 20,628 | +26% | 1 | 1 | 0% | 3,369 | 4,432 | +32% | 0 | 0 | — |
case-21 | pass→pass | 14,124 | 14,885 | +5% | 1 | 1 | 0% | 1,707 | 3,103 | +82% | 0 | 0 | — |
case-22 | pass→pass | 13,644 | 17,268 | +27% | 1 | 1 | 0% | 1,393 | 3,460 | +148% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.