[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F7Y5R5KCEJJE5EX995ZBA4":3,"skill-same:01M6F7Y5R5KCEJJE5EX995ZBA4":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":60,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6F7Y5R5KCEJJE5EX995ZBA4","canva-incident-runbook",null,"Execute Canva Connect API incident response with triage, mitigation, and postmortem.\nUse when responding to Canva-related outages, investigating API errors,\nor running post-incident reviews for Canva integration failures.\nTrigger with phrases like \"canva incident\", \"canva outage\",\n\"canva down\", \"canva on-call\", \"canva emergency\", \"canva broken\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fcanva-incident-runbook\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"canva incident runbook","runbook","incident","canva","broken","reviews","trigger","io","call","use","read","design","postmortem","Bash","api","saas","kubectl","code","connect","incident response","2026-11-10 10:12:30",false,"---\nname: canva-incident-runbook\ndescription: |\n  Execute Canva Connect API incident response with triage, mitigation, and postmortem.\n  Use when responding to Canva-related outages, investigating API errors,\n  or running post-incident reviews for Canva integration failures.\n  Trigger with phrases like \"canva incident\", \"canva outage\",\n  \"canva down\", \"canva on-call\", \"canva emergency\", \"canva broken\".\nallowed-tools: Read, Grep, Bash(kubectl:*), Bash(curl:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, design, canva]\ncompatible-with: claude-code\n---\n\n# Canva Incident Runbook\n\n## Overview\n\nRapid incident response for Canva Connect API integration failures. Covers triage, mitigation, escalation, and postmortem.\n\n## Quick Triage (First 5 Minutes)\n\n```bash\n#!\u002Fbin\u002Fbash\n# canva-triage.sh — Run immediately when incident detected\n\necho \"=== Canva Triage ===\"\n\n# 1. Is it Canva or us?\necho -n \"Canva API: \"\ncurl -s -o \u002Fdev\u002Fnull -w \"HTTP %{http_code} (%{time_total}s)\\n\" \\\n  -H \"Authorization: Bearer $CANVA_ACCESS_TOKEN\" \\\n  \"https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fusers\u002Fme\"\n\n# 2. Check our health endpoint\necho -n \"Our health: \"\ncurl -s -o \u002Fdev\u002Fnull -w \"HTTP %{http_code}\\n\" \\\n  \"https:\u002F\u002Fapi.ourapp.com\u002Fhealth\"\n\n# 3. Error rate (if Prometheus available)\necho \"Error rate (5min):\"\ncurl -s \"localhost:9090\u002Fapi\u002Fv1\u002Fquery?query=rate(canva_api_errors_total[5m])\" \\\n  | python3 -c \"import sys,json; d=json.load(sys.stdin); print(d['data']['result'])\" 2>\u002Fdev\u002Fnull \\\n  || echo \"Prometheus not available\"\n\n# 4. Rate limit status\necho -n \"Rate limit remaining: \"\ncurl -sD - -o \u002Fdev\u002Fnull -H \"Authorization: Bearer $CANVA_ACCESS_TOKEN\" \\\n  \"https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fdesigns?limit=1\" 2>&1 \\\n  | grep -i \"x-ratelimit-remaining\" || echo \"unknown\"\n```\n\n## Decision Tree\n\n```\nAPI returning errors?\n├── YES → What HTTP status?\n│   ├── 401 → Token expired → Refresh token, check rotation\n│   ├── 403 → Scope issue → Verify integration permissions\n│   ├── 429 → Rate limited → Enable backoff, check Retry-After\n│   ├── 5xx → Canva outage → Enable fallback, monitor status page\n│   └── Other → Check request format against API docs\n└── NO → Is our integration healthy?\n    ├── YES → Likely resolved or intermittent → Monitor\n    └── NO → Check our infra (pods, memory, DNS, TLS)\n```\n\n## Severity Levels\n\n| Level | Definition | Response Time | Example |\n|-------|------------|---------------|---------|\n| P1 | All design operations broken | \u003C 15 min | All API calls returning 5xx |\n| P2 | Degraded — some operations fail | \u003C 1 hour | Exports failing, designs work |\n| P3 | Minor — non-critical feature down | \u003C 4 hours | Webhooks delayed |\n| P4 | No user impact | Next business day | Monitoring gap |\n\n## Immediate Mitigation by Error Type\n\n### 401 — Token Expired \u002F Revoked\n\n```bash\n# Check if token is valid\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fusers\u002Fme | python3 -m json.tool\n\n# If expired: refresh all affected users' tokens\n# If revoked: users must re-authorize via OAuth flow\n```\n\n### 429 — Rate Limited\n\n```bash\n# Check how long to wait\ncurl -sD - -o \u002Fdev\u002Fnull -H \"Authorization: Bearer $TOKEN\" \\\n  \"https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fdesigns\" 2>&1 \\\n  | grep -i \"retry-after\"\n\n# Immediate: reduce request rate\n# Enable queue-based rate limiting\n```\n\n### 5xx — Canva Service Error\n\n```bash\n# Check Canva status page (no official status.canva.com for API)\n# Check Canva developer community for reported outages\n\n# Enable graceful degradation\n# Return cached data where possible\n# Show \"Design features temporarily unavailable\" to users\n```\n\n## Communication Templates\n\n### Internal (Slack)\n\n```\nP[1-4] INCIDENT: Canva Integration\nStatus: INVESTIGATING | MITIGATING | RESOLVED\nImpact: [Describe user impact]\nAPI Response: HTTP [status code]\nCurrent action: [What you're doing]\nNext update: [Time]\nIC: @[name]\n```\n\n### External (Status Page)\n\n```\nCanva Design Features — Degraded Performance\n\nWe are experiencing issues with our design integration.\nUsers may see delays or errors when creating\u002Fexporting designs.\n\nWe are actively working with our design platform provider to resolve this.\n\nLast updated: [ISO 8601 timestamp]\n```\n\n## Post-Incident\n\n### Evidence Collection\n\n```bash\n# Collect logs for the incident window\nkubectl logs -l app=canva-integration --since=2h > incident-canva-logs.txt\n\n# Export metrics\ncurl \"localhost:9090\u002Fapi\u002Fv1\u002Fquery_range?query=canva_api_errors_total&start=$(date -d '2 hours ago' +%s)&end=$(date +%s)&step=60\" > metrics.json\n```\n\n### Postmortem Template\n\n```markdown\n## Incident: Canva API [Error Type]\n**Date:** YYYY-MM-DD HH:MM UTC\n**Duration:** X hours Y minutes\n**Severity:** P[1-4]\n\n### Summary\n[1-2 sentence description]\n\n### Timeline (UTC)\n- HH:MM — [First alert \u002F error detected]\n- HH:MM — [Investigation started]\n- HH:MM — [Root cause identified]\n- HH:MM — [Mitigation applied]\n- HH:MM — [Confirmed resolved]\n\n### Root Cause\n[Was it Canva-side or our integration? Token issue? Rate limit? Code bug?]\n\n### Impact\n- Users affected: N\n- Failed operations: N designs \u002F N exports\n\n### Action Items\n- [ ] [Preventive measure] — Owner — Due date\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Can't determine if Canva is down | No status page API | Test with known-good token |\n| Token refresh fails | Revoked integration | Re-authorize user |\n| All users affected | Integration-level issue | Check client credentials |\n| Single user affected | User-level token issue | Refresh that user's token |\n\n## Resources\n\n- [Canva API Reference](https:\u002F\u002Fwww.canva.dev\u002Fdocs\u002Fconnect\u002Fapi-reference\u002F)\n- [Canva Changelog](https:\u002F\u002Fwww.canva.dev\u002Fdocs\u002Fconnect\u002Fchangelog\u002F)\n\n## Next Steps\n\nFor data handling, see `canva-data-handling`.\n\n","# Canva Incident Runbook\n\n## Overview\n\nRapid incident response for Canva Connect API integration failures. Covers triage, mitigation, escalation, and postmortem.\n\n## Quick Triage (First 5 Minutes)\n\n```bash\n#!\u002Fbin\u002Fbash\n# canva-triage.sh — Run immediately when incident detected\n\necho \"=== Canva Triage ===\"\n\n# 1. Is it Canva or us?\necho -n \"Canva API: \"\ncurl -s -o \u002Fdev\u002Fnull -w \"HTTP %{http_code} (%{time_total}s)\\n\" \\\n  -H \"Authorization: Bearer $CANVA_ACCESS_TOKEN\" \\\n  \"https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fusers\u002Fme\"\n\n# 2. Check our health endpoint\necho -n \"Our health: \"\ncurl -s -o \u002Fdev\u002Fnull -w \"HTTP %{http_code}\\n\" \\\n  \"https:\u002F\u002Fapi.ourapp.com\u002Fhealth\"\n\n# 3. Error rate (if Prometheus available)\necho \"Error rate (5min):\"\ncurl -s \"localhost:9090\u002Fapi\u002Fv1\u002Fquery?query=rate(canva_api_errors_total[5m])\" \\\n  | python3 -c \"import sys,json; d=json.load(sys.stdin); print(d['data']['result'])\" 2>\u002Fdev\u002Fnull \\\n  || echo \"Prometheus not available\"\n\n# 4. Rate limit status\necho -n \"Rate limit remaining: \"\ncurl -sD - -o \u002Fdev\u002Fnull -H \"Authorization: Bearer $CANVA_ACCESS_TOKEN\" \\\n  \"https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fdesigns?limit=1\" 2>&1 \\\n  | grep -i \"x-ratelimit-remaining\" || echo \"unknown\"\n```\n\n## Decision Tree\n\n```\nAPI returning errors?\n├── YES → What HTTP status?\n│   ├── 401 → Token expired → Refresh token, check rotation\n│   ├── 403 → Scope issue → Verify integration permissions\n│   ├── 429 → Rate limited → Enable backoff, check Retry-After\n│   ├── 5xx → Canva outage → Enable fallback, monitor status page\n│   └── Other → Check request format against API docs\n└── NO → Is our integration healthy?\n    ├── YES → Likely resolved or intermittent → Monitor\n    └── NO → Check our infra (pods, memory, DNS, TLS)\n```\n\n## Severity Levels\n\n| Level | Definition | Response Time | Example |\n|-------|------------|---------------|---------|\n| P1 | All design operations broken | \u003C 15 min | All API calls returning 5xx |\n| P2 | Degraded — some operations fail | \u003C 1 hour | Exports failing, designs work |\n| P3 | Minor — non-critical feature down | \u003C 4 hours | Webhooks delayed |\n| P4 | No user impact | Next business day | Monitoring gap |\n\n## Immediate Mitigation by Error Type\n\n### 401 — Token Expired \u002F Revoked\n\n```bash\n# Check if token is valid\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fusers\u002Fme | python3 -m json.tool\n\n# If expired: refresh all affected users' tokens\n# If revoked: users must re-authorize via OAuth flow\n```\n\n### 429 — Rate Limited\n\n```bash\n# Check how long to wait\ncurl -sD - -o \u002Fdev\u002Fnull -H \"Authorization: Bearer $TOKEN\" \\\n  \"https:\u002F\u002Fapi.canva.com\u002Frest\u002Fv1\u002Fdesigns\" 2>&1 \\\n  | grep -i \"retry-after\"\n\n# Immediate: reduce request rate\n# Enable queue-based rate limiting\n```\n\n### 5xx — Canva Service Error\n\n```bash\n# Check Canva status page (no official status.canva.com for API)\n# Check Canva developer community for reported outages\n\n# Enable graceful degradation\n# Return cached data where possible\n# Show \"Design features temporarily unavailable\" to users\n```\n\n## Communication Templates\n\n### Internal (Slack)\n\n```\nP[1-4] INCIDENT: Canva Integration\nStatus: INVESTIGATING | MITIGATING | RESOLVED\nImpact: [Describe user impact]\nAPI Response: HTTP [status code]\nCurrent action: [What you're doing]\nNext update: [Time]\nIC: @[name]\n```\n\n### External (Status Page)\n\n```\nCanva Design Features — Degraded Performance\n\nWe are experiencing issues with our design integration.\nUsers may see delays or errors when creating\u002Fexporting designs.\n\nWe are actively working with our design platform provider to resolve this.\n\nLast updated: [ISO 8601 timestamp]\n```\n\n## Post-Incident\n\n### Evidence Collection\n\n```bash\n# Collect logs for the incident window\nkubectl logs -l app=canva-integration --since=2h > incident-canva-logs.txt\n\n# Export metrics\ncurl \"localhost:9090\u002Fapi\u002Fv1\u002Fquery_range?query=canva_api_errors_total&start=$(date -d '2 hours ago' +%s)&end=$(date +%s)&step=60\" > metrics.json\n```\n\n### Postmortem Template\n\n```markdown\n## Incident: Canva API [Error Type]\n**Date:** YYYY-MM-DD HH:MM UTC\n**Duration:** X hours Y minutes\n**Severity:** P[1-4]\n\n### Summary\n[1-2 sentence description]\n\n### Timeline (UTC)\n- HH:MM — [First alert \u002F error detected]\n- HH:MM — [Investigation started]\n- HH:MM — [Root cause identified]\n- HH:MM — [Mitigation applied]\n- HH:MM — [Confirmed resolved]\n\n### Root Cause\n[Was it Canva-side or our integration? Token issue? Rate limit? Code bug?]\n\n### Impact\n- Users affected: N\n- Failed operations: N designs \u002F N exports\n\n### Action Items\n- [ ] [Preventive measure] — Owner — Due date\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Can't determine if Canva is down | No status page API | Test with known-good token |\n| Token refresh fails | Revoked integration | Re-authorize user |\n| All users affected | Integration-level issue | Check client credentials |\n| Single user affected | User-level token issue | Refresh that user's token |\n\n## Resources\n\n- [Canva API Reference](https:\u002F\u002Fwww.canva.dev\u002Fdocs\u002Fconnect\u002Fapi-reference\u002F)\n- [Canva Changelog](https:\u002F\u002Fwww.canva.dev\u002Fdocs\u002Fconnect\u002Fchangelog\u002F)\n\n## Next Steps\n\nFor data handling, see `canva-data-handling`.\n\n",{"name":5,"tags":49,"author":50,"license":15,"version":51,"description":52,"allowed-tools":53,"compatible-with":54},[39,35,27],"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Execute Canva Connect API incident response with triage, mitigation, and postmortem.\nUse when responding to Canva-related outages, investigating API errors,\nor running post-incident reviews for Canva integration failures.\nTrigger with phrases like \"canva incident\", \"canva outage\",\n\"canva down\", \"canva on-call\", \"canva emergency\", \"canva broken\".\n","Read, Grep, Bash(kubectl:*), Bash(curl:*)","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fcanva-incident-runbook",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill canva-incident-runbook",{"tool":70,"command":71},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill canva-incident-runbook",{"tool":73,"command":74},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill canva-incident-runbook","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fcanva-incident-runbook\u002FSKILL.md",true,[],[79,93,103,112,118,125],{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":89,"publishedAt":44},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[84],{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[90,91,92],"model","model hierarchy","model hierarchy skill",{"skillNo":94,"name":95,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":99,"publishedAt":44},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[98],{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},[100,101,102],"MCP","zoom","zoom mcp",{"skillNo":104,"name":105,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":44},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[109,110,111,101],"sdk","zoom apps sdk","apps",{"skillNo":113,"name":114,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":44},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[114],{"skillNo":119,"name":120,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":124,"publishedAt":44},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[123],{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},[120],{"skillNo":126,"name":127,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":44},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[127]]