{"id":"496c1505-0815-4bff-a001-d0920d2f41ee","shortId":"adPLnA","kind":"skill","title":"qa-testing","tagline":"Run QA testing on a page, feature, or full site at one of three depth tiers (smoke, standard, full). Use this skill whenever the user asks to test a page, audit a site, check for bugs, verify a deploy, run a QA sweep, or review accessibility, performance, or SEO basics. Triggers ","description":"# QA Testing\n\nVerify that a page, feature, or site is working before declaring it shipped. Stack-agnostic. Console-snippet driven for speed.\n\nThis skill is faster than `accessibility-audit` (which goes deeper on WCAG) and `performance-optimization` (which goes deeper on Core Web Vitals). Use this skill for general QA. Use the specialists for deep audits.\n\n---\n\n## When to use\n\n- After every deploy (smoke test)\n- After launching a new page or feature (standard audit)\n- Before a major release (full release matrix)\n- Investigating a \"something looks off\" report\n- Pre-launch verification of a site or section\n\n## When NOT to use\n\n- Deep accessibility compliance work (use `accessibility-audit`)\n- Deep performance investigation (use `performance-optimization`)\n- Code review or debugging (use `code-review-web`)\n- Initial site setup or technical SEO baseline (use `seo-technical`)\n\n---\n\n## Required inputs\n\n- The page URL or site under test\n- The tier of QA needed (smoke, standard, or full)\n- Browser dev tools access\n- Any specific concerns to check beyond the standard tier\n\n---\n\n## The framework: 3 tiers\n\nQA scales with the stakes. Pick the tier that matches the context.\n\n| Tier | When to run | Time | Coverage |\n|---|---|---|---|\n| Smoke | After every deploy | 2 minutes | Critical signals only |\n| Standard | New page or feature | 10 minutes | On-page basics, accessibility, structure |\n| Full | Major release, pre-launch | 30+ minutes | Comprehensive across all dimensions |\n\n### Tier 1: Smoke test\n\nThe 2-minute \"did the deploy break anything obvious?\" check. Run after every deploy.\n\nConsole snippet (paste in browser dev tools):\n\n```javascript\nconst smoke = {\n  title: document.title,\n  titleLen: document.title.length,\n  canonical: document.querySelector('link[rel=\"canonical\"]')?.href,\n  h1Count: document.querySelectorAll('h1').length,\n  missingAlts: [...document.querySelectorAll('img')].filter(i => !i.alt).length,\n  schema: [...document.querySelectorAll('script[type=\"application/ld+json\"]')]\n    .map(s => { try { return JSON.parse(s.innerText)['@type'] } catch(e) { return 'invalid' } }),\n  brokenImages: [...document.querySelectorAll('img')].filter(i => !i.complete || i.naturalWidth === 0).length,\n};\nconsole.log(JSON.stringify(smoke, null, 2));\n```\n\n**Pass criteria:**\n- Title exists and is 30 to 60 characters\n- Canonical points at the production domain (never staging or preview URLs)\n- Exactly one H1\n- Zero missing alts\n- Zero broken images\n- Schema includes the expected types for the page\n\nIf any of these fail, do not proceed with deeper testing until the smoke issue is fixed.\n\n### Tier 2: Standard page audit\n\nThe 10-minute new-page-or-feature audit. Covers the on-page basics plus accessibility and structure.\n\nConsole snippet:\n\n```javascript\nconst audit = {\n  title: document.title,\n  titleLen: document.title.length,\n  canonical: document.querySelector('link[rel=\"canonical\"]')?.href,\n  metaDesc: document.querySelector('meta[name=\"description\"]')?.content,\n  metaDescLen: document.querySelector('meta[name=\"description\"]')?.content?.length,\n  ogImage: document.querySelector('meta[property=\"og:image\"]')?.content,\n  ogTitle: document.querySelector('meta[property=\"og:title\"]')?.content,\n  twitterCard: document.querySelector('meta[name=\"twitter:card\"]')?.content,\n  h1Count: document.querySelectorAll('h1').length,\n  h1Text: document.querySelector('h1')?.innerText,\n  h2Count: document.querySelectorAll('h2').length,\n  h2s: [...document.querySelectorAll('h2')].map(h => h.innerText.trim().slice(0, 60)),\n  totalImages: document.querySelectorAll('img').length,\n  missingAlts: [...document.querySelectorAll('img')].filter(i => !i.alt).length,\n  brokenImages: [...document.querySelectorAll('img')].filter(i => !i.complete || i.naturalWidth === 0).length,\n  externalLinksWithoutNoopener: [...document.querySelectorAll('a[target=\"_blank\"]')]\n    .filter(a => !a.rel?.includes('noopener')).length,\n  schema: [...document.querySelectorAll('script[type=\"application/ld+json\"]')]\n    .map(s => {\n      try {\n        const d = JSON.parse(s.innerText);\n        return d['@graph'] ? d['@graph'].map(x => x['@type']) : d['@type'];\n      } catch(e) { return 'invalid' }\n    }),\n  hasSkipLink: !!document.querySelector('a[href^=\"#\"]:first-of-type'),\n  pageLanguage: document.documentElement.lang || 'NOT SET',\n  hasFavicon: !!document.querySelector('link[rel*=\"icon\"]'),\n};\nconsole.log(JSON.stringify(audit, null, 2));\n```\n\n**Pass criteria** (in addition to smoke):\n- Meta description: 120 to 160 characters\n- og:image, og:title, twitter:card present\n- H2s present and descriptive\n- All external links with `target=\"_blank\"` have `rel=\"noopener\"`\n- Page language declared (`lang` attribute on `<html>`)\n- Favicon present\n\n### Tier 3: Full release matrix\n\nThe 30-minute pre-launch check. Cover all dimensions.\n\n| Dimension | Pass criteria |\n|---|---|\n| Smoke and standard | All pass |\n| Accessibility (basic) | Run browser audit tool (e.g., Lighthouse), score above 90 |\n| Performance (basic) | Lighthouse Performance score above 80, LCP under 2.5s, CLS under 0.1 |\n| Mobile responsiveness | Tested at 375px, 768px, 1024px, 1440px |\n| Cross-browser | Tested in Chrome, Safari, Firefox (and Edge if relevant audience) |\n| Forms | All forms submit successfully and validate correctly |\n| Internal links | No broken internal links (sample 20 random) |\n| External links | All return 200 (sample 10) |\n| Sitemap | Returns 200, lists canonical URLs only |\n| robots.txt | Allows production crawlers, blocks staging if applicable |\n| Security headers | HSTS, X-Frame-Options, X-Content-Type-Options present |\n| HTTPS | All resources load over HTTPS, no mixed content |\n| 404 handling | 404 pages return HTTP 404 (not soft 200) |\n| Schema validation | All schema validates in Rich Results Test |\n| Analytics | Events fire as expected on key user actions |\n| Cache behavior | Cache headers appropriate for page type |\n\nFor headers, run:\n\n```javascript\nfetch(window.location.origin, { method: 'HEAD' })\n  .then(r => {\n    const headers = {};\n    for (const [k, v] of r.headers.entries()) headers[k] = v;\n    console.log(JSON.stringify(headers, null, 2));\n  });\n```\n\nLook for: `strict-transport-security`, `x-frame-options`, `x-content-type-options`.\n\n---\n\n## Specific QA snippets\n\n### Image audit\n\n```javascript\nconst imgs = [...document.querySelectorAll('img')].map(i => ({\n  src: i.src.split('/').pop().split('?')[0].slice(0, 60),\n  alt: i.alt || 'MISSING',\n  width: i.naturalWidth,\n  height: i.naturalHeight,\n  loaded: i.complete && i.naturalWidth > 0,\n}));\nconsole.table(imgs);\nconsole.log({\n  total: imgs.length,\n  broken: imgs.filter(i => !i.loaded).length,\n  noAlt: imgs.filter(i => i.alt === 'MISSING').length,\n});\n```\n\n### Heading hierarchy check\n\n```javascript\nconst headings = [...document.querySelectorAll('h1, h2, h3, h4, h5, h6')].map(h => ({\n  level: parseInt(h.tagName[1]),\n  text: h.innerText.trim().slice(0, 80),\n}));\nconsole.table(headings);\n\n// Check for skipped levels\nconst levels = headings.map(h => h.level);\nlet skipped = false;\nfor (let i = 1; i < levels.length; i++) {\n  if (levels[i] > levels[i-1] + 1) {\n    console.warn(`Skipped from H${levels[i-1]} to H${levels[i]}: \"${headings[i].text}\"`);\n    skipped = true;\n  }\n}\nif (!skipped) console.log('No skipped heading levels');\n```\n\n### Contrast spot-check\n\n```javascript\nfunction contrast(bg, fg) {\n  function lum(hex) {\n    return [hex.slice(1,3), hex.slice(3,5), hex.slice(5,7)]\n      .map(h => parseInt(h, 16) / 255)\n      .map(v => v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4))\n      .reduce((a, v, i) => a + v * [0.2126, 0.7152, 0.0722][i], 0);\n  }\n  const [l1, l2] = [lum(bg), lum(fg)];\n  const r = ((Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05)).toFixed(2);\n  return r + ':1 ' + (parseFloat(r) >= 4.5 ? 'PASS body' : parseFloat(r) >= 3 ? 'PASS large only' : 'FAIL');\n}\n\n// Examples\ncontrast('#FFFFFF', '#4B5563'); // body color check\ncontrast('#FFFFFF', '#9CA3AF'); // verify gray choices\n```\n\n### Form audit (per form)\n\n```javascript\n[...document.querySelectorAll('form')].forEach((form, i) => {\n  const fields = [...form.querySelectorAll('input, select, textarea')].map(field => ({\n    type: field.type || field.tagName.toLowerCase(),\n    name: field.name,\n    hasLabel: !!form.querySelector(`label[for=\"${field.id}\"]`) || !!field.closest('label'),\n    required: field.required,\n  }));\n  console.log(`Form ${i + 1}:`);\n  console.table(fields);\n});\n```\n\n### External link audit\n\n```javascript\nconst externalLinks = [...document.querySelectorAll('a[href^=\"http\"]')]\n  .filter(a => !a.href.includes(window.location.host));\nconst issues = externalLinks.filter(a =>\n  a.target === '_blank' && (!a.rel?.includes('noopener') || !a.rel?.includes('noreferrer'))\n);\nif (issues.length) {\n  console.warn(`${issues.length} external links missing noopener/noreferrer:`);\n  issues.forEach(a => console.warn(a.href));\n} else {\n  console.log(`All ${externalLinks.length} external links properly attributed`);\n}\n```\n\n---\n\n## Workflow\n\n1. **Pick the tier.** Smoke for routine deploys. Standard for new work. Full for releases.\n2. **Run the snippet.** Paste the appropriate console snippet, review output.\n3. **Note failures.** Each failure either gets fixed before ship or filed as a known issue.\n4. **For Standard tier**, add: visual review at 375px, 768px, 1440px. Test the primary user flow.\n5. **For Full tier**, add: cross-browser testing, Lighthouse audit, schema validation, security headers, 404 handling.\n6. **Document.** Use the template in [`references/qa-report-template.md`](references/qa-report-template.md) for full audits.\n\n---\n\n## Failure patterns\n\n- **Skipping smoke tests on \"small\" deploys.** Half of broken-production incidents start with a deploy that \"looked safe.\"\n- **Running snippets but not reading the output.** The console snippet is a tool. The judgment is reading what it returns.\n- **Visual-only QA.** Eyeballing a page misses missing alt text, broken schema, missing canonical. Always run the snippet.\n- **Single-browser testing.** Mobile Safari and Chrome differ enough to surprise you. Test at least Chrome and Safari.\n- **No mobile QA.** The 375px viewport is where most users live. Test there or get burned later.\n- **Pass-fail with no remediation.** A failed QA must produce a fix or a known-issue ticket. Failed QA that ships unfixed is process theater.\n\n---\n\n## Output format\n\nFor smoke tests: console output is the report.\n\nFor standard and full audits: a markdown report at `qa-report-[date].md`. Use the template in [`references/qa-report-template.md`](references/qa-report-template.md).\n\n---\n\n## Reference files\n\n- [`references/qa-report-template.md`](references/qa-report-template.md) - Markdown report template for standard and full audits.","tags":["testing","claude","skills","rampstackco","agent-skills","anthropic","awesome-claude-code","awesome-claude-prompts","awesome-claude-skills","claude-code","claude-skills","good-first-issue"],"capabilities":["skill","source-rampstackco","skill-qa-testing","topic-agent-skills","topic-anthropic","topic-awesome-claude-code","topic-awesome-claude-prompts","topic-awesome-claude-skills","topic-claude","topic-claude-code","topic-claude-skills","topic-good-first-issue","topic-mcp","topic-product-management","topic-seo"],"categories":["claude-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/rampstackco/claude-skills/qa-testing","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add rampstackco/claude-skills","source_repo":"https://github.com/rampstackco/claude-skills","install_from":"skills.sh"}},"qualityScore":"0.540","qualityRationale":"deterministic score 0.54 from registry signals: · indexed on github topic:agent-skills · 181 github stars · SKILL.md body (10,790 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:55:19.226Z","embedding":null,"createdAt":"2026-04-30T01:01:29.587Z","updatedAt":"2026-05-18T18:55:19.226Z","lastSeenAt":"2026-05-18T18:55:19.226Z","tsv":"'-1':934,942 '0':353,507,527,853,855,867,906,1008 '0.03928':990 '0.05':1021,1025 '0.055':995 '0.0722':1006 '0.1':677 '0.2126':1004 '0.7152':1005 '1':281,902,925,935,973,1030,1091,1141 '1.055':996 '10':260,421,722 '1024px':684 '12.92':992 '120':598 '1440px':685,1193 '16':985 '160':600 '2':250,285,359,416,589,821,1027,1156 '2.4':997 '2.5':673 '20':714 '200':720,725,769 '255':986 '3':226,631,974,976,1038,1167 '30':274,366,636 '375px':682,1191,1310 '4':1183 '4.5':1033 '404':760,762,766,1214 '4b5563':1046 '5':977,979,1199 '6':1216 '60':368,508,856 '7':980 '768px':683,1192 '80':670,907 '90':663 '9ca3af':1052 'a.href':1131 'a.href.includes':1106 'a.rel':536,1114,1117 'a.target':1112 'access':49,85,159,164,214,266,436,653 'accessibility-audit':84,163 'across':277 'action':787 'add':1187,1203 'addit':593 'agnost':72 'allow':731 'alt':386,857,1277 'alway':1283 'analyt':779 'anyth':291 'applic':737 'application/ld':333,544 'appropri':792,1162 'ask':29 'attribut':626,1139 'audienc':698 'audit':34,86,114,131,165,419,428,443,587,657,841,1057,1096,1209,1226,1364,1391 'baselin':188 'basic':53,265,434,654,665 'behavior':789 'beyond':220 'bg':966,1013 'blank':533,618,1113 'block':734 'bodi':1035,1047 'break':290 'broken':388,710,873,1238,1279 'broken-product':1237 'brokenimag':346,520 'browser':211,302,656,688,1206,1289 'bug':39 'burn':1321 'cach':788,790 'canon':312,316,370,448,452,727,1282 'card':486,607 'catch':342,564 'charact':369,601 'check':37,219,293,641,886,910,962,1049 'choic':1055 'chrome':691,1294,1303 'cls':675 'code':173,179 'code-review-web':178 'color':1048 'complianc':160 'comprehens':276 'concern':217 'consol':74,298,439,1163,1256,1355 'console-snippet':73 'console.log':355,585,817,870,954,1088,1133 'console.table':868,908,1092 'console.warn':936,1122,1130 'const':306,442,549,806,809,843,888,914,1009,1016,1066,1098,1108 'content':459,465,473,480,487,747,759,834 'context':239 'contrast':959,965,1044,1050 'core':100 'correct':706 'cover':429,642 'coverag':245 'crawler':733 'criteria':361,591,647 'critic':252 'cross':687,1205 'cross-brows':686,1204 'd':550,554,556,562 'date':1372 'debug':176 'declar':67,624 'deep':113,158,166 'deeper':89,98,407 'deploy':42,120,249,289,297,1148,1234,1244 'depth':18 'descript':458,464,597,612 'dev':212,303 'differ':1295 'dimens':279,644,645 'document':1217 'document.documentelement.lang':577 'document.queryselector':313,449,455,461,468,475,482,493,569,581 'document.queryselectorall':319,323,330,347,489,497,501,510,514,521,530,541,845,890,1061,1100 'document.title':309,445 'document.title.length':311,447 'domain':375 'driven':76 'e':343,565 'e.g':659 'edg':695 'either':1172 'els':1132 'enough':1296 'event':780 'everi':119,248,296 'exact':381 'exampl':1043 'exist':363 'expect':393,783 'extern':614,716,1094,1124,1136 'externallink':1099 'externallinks.filter':1110 'externallinks.length':1135 'externallinkswithoutnoopen':529 'eyebal':1272 'fail':402,1042,1325,1330,1342 'failur':1169,1171,1227 'fals':921 'faster':82 'favicon':628 'featur':10,61,129,259,427 'fetch':800 'ffffff':1045,1051 'fg':967,1015 'field':1067,1073,1093 'field.closest':1084 'field.id':1083 'field.name':1078 'field.required':1087 'field.tagname.tolowercase':1076 'field.type':1075 'file':1178,1381 'filter':325,349,516,523,534,1104 'fire':781 'firefox':693 'first':573 'first-of-typ':572 'fix':414,1174,1335 'flow':1198 'foreach':1063 'form':699,701,1056,1059,1062,1064,1089 'form.queryselector':1080 'form.queryselectorall':1068 'format':1351 'frame':743,830 'framework':225 'full':12,22,136,210,268,632,1153,1201,1225,1363,1390 'function':964,968 'general':107 'get':1173,1320 'goe':88,97 'graph':555,557 'gray':1054 'h':504,898,917,939,944,982,984 'h.innertext.trim':505,904 'h.level':918 'h.tagname':901 'h1':320,383,490,494,891 'h1count':318,488 'h1text':492 'h2':498,502,892 'h2count':496 'h2s':500,609 'h3':893 'h4':894 'h5':895 'h6':896 'half':1235 'handl':761,1215 'hasfavicon':580 'haslabel':1079 'hasskiplink':568 'head':803,884,889,909,947,957 'header':739,791,797,807,814,819,1213 'headings.map':916 'height':862 'hex':970 'hex.slice':972,975,978 'hierarchi':885 'href':317,453,571,1102 'hsts':740 'http':765,1103 'https':751,756 'i.alt':327,518,858,881 'i.complete':351,525,865 'i.loaded':876 'i.naturalheight':863 'i.naturalwidth':352,526,861,866 'i.src.split':850 'icon':584 'imag':389,472,603,840 'img':324,348,511,515,522,844,846,869 'imgs.filter':874,879 'imgs.length':872 'incid':1240 'includ':391,537,1115,1118 'initi':182 'innertext':495 'input':194,1069 'intern':707,711 'invalid':345,567 'investig':139,168 'issu':412,1109,1182,1340 'issues.foreach':1128 'issues.length':1121,1123 'javascript':305,441,799,842,887,963,1060,1097 'json':334,545 'json.parse':339,551 'json.stringify':356,586,818 'judgment':1262 'k':810,815 'key':785 'known':1181,1339 'known-issu':1338 'l1':1010,1019,1023 'l2':1011,1020,1024 'label':1081,1085 'lang':625 'languag':623 'larg':1040 'later':1322 'launch':124,147,273,640 'lcp':671 'least':1302 'length':321,328,354,466,491,499,512,519,528,539,877,883 'let':919,923 'level':899,913,915,930,932,940,945,958 'levels.length':927 'lighthous':660,666,1208 'link':314,450,582,615,708,712,717,1095,1125,1137 'list':726 'live':1316 'load':754,864 'look':142,822,1246 'lum':969,1012,1014 'major':134,269 'map':335,503,546,558,847,897,981,987,1072 'markdown':1366,1384 'match':237 'math.max':1018 'math.min':1022 'math.pow':993 'matrix':138,634 'md':1373 'meta':456,462,469,476,483,596 'metadesc':454 'metadesclen':460 'method':802 'minut':251,261,275,286,422,637 'miss':385,859,882,1126,1275,1276,1281 'missingalt':322,513 'mix':758 'mobil':678,1291,1307 'must':1332 'name':457,463,484,1077 'need':206 'never':376 'new':126,256,424,1151 'new-page-or-featur':423 'noalt':878 'noopen':538,621,1116 'noopener/noreferrer':1127 'noreferr':1119 'note':1168 'null':358,588,820 'obvious':292 'og':471,478,602,604 'ogimag':467 'ogtitl':474 'on-pag':262,431 'one':15,382 'optim':95,172 'option':744,749,831,836 'output':1166,1254,1350,1356 'page':9,33,60,127,196,257,264,397,418,425,433,622,763,794,1274 'pagelanguag':576 'parsefloat':1031,1036 'parseint':900,983 'pass':360,590,646,652,1034,1039,1324 'pass-fail':1323 'past':300,1160 'pattern':1228 'per':1058 'perform':50,94,167,171,664,667 'performance-optim':93,170 'pick':233,1142 'plus':435 'point':371 'pop':851 'pre':146,272,639 'pre-launch':145,271,638 'present':608,610,629,750 'preview':379 'primari':1196 'proceed':405 'process':1348 'produc':1333 'product':374,732,1239 'proper':1138 'properti':470,477 'qa':2,5,45,55,108,205,228,838,1271,1308,1331,1343,1370 'qa-report':1369 'qa-test':1 'r':805,1017,1029,1032,1037 'r.headers.entries':813 'random':715 'read':1252,1264 'reduc':998 'refer':1380 'references/qa-report-template.md':1222,1223,1378,1379,1382,1383 'rel':315,451,583,620 'releas':135,137,270,633,1155 'relev':697 'remedi':1328 'report':144,1359,1367,1371,1385 'requir':193,1086 'resourc':753 'respons':679 'result':777 'return':338,344,553,566,719,724,764,971,1028,1267 'review':48,174,180,1165,1189 'rich':776 'robots.txt':730 'routin':1147 'run':4,43,243,294,655,798,1157,1248,1284 's.innertext':340,552 'safari':692,1292,1305 'safe':1247 'sampl':713,721 'scale':229 'schema':329,390,540,770,773,1210,1280 'score':661,668 'script':331,542 'section':153 'secur':738,827,1212 'select':1070 'seo':52,187,191 'seo-techn':190 'set':579 'setup':184 'ship':69,1176,1345 'signal':253 'singl':1288 'single-brows':1287 'site':13,36,63,151,183,199 'sitemap':723 'skill':25,80,105 'skill-qa-testing' 'skip':912,920,937,950,953,956,1229 'slice':506,854,905 'small':1233 'smoke':20,121,207,246,282,307,357,411,595,648,1145,1230,1353 'snippet':75,299,440,839,1159,1164,1249,1257,1286 'soft':768 'someth':141 'source-rampstackco' 'specialist':111 'specif':216,837 'speed':78 'split':852 'spot':961 'spot-check':960 'src':849 'stack':71 'stack-agnost':70 'stage':377,735 'stake':232 'standard':21,130,208,222,255,417,650,1149,1185,1361,1388 'start':1241 'strict':825 'strict-transport-secur':824 'structur':267,438 'submit':702 'success':703 'surpris':1298 'sweep':46 'target':532,617 'technic':186,192 'templat':1220,1376,1386 'test':3,6,31,56,122,201,283,408,680,689,778,1194,1207,1231,1290,1300,1317,1354 'text':903,949,1278 'textarea':1071 'theater':1349 'three':17 'ticket':1341 'tier':19,203,223,227,235,240,280,415,630,1144,1186,1202 'time':244 'titl':308,362,444,479,605 'titlelen':310,446 'tofix':1026 'tool':213,304,658,1260 'topic-agent-skills' 'topic-anthropic' 'topic-awesome-claude-code' 'topic-awesome-claude-prompts' 'topic-awesome-claude-skills' 'topic-claude' 'topic-claude-code' 'topic-claude-skills' 'topic-good-first-issue' 'topic-mcp' 'topic-product-management' 'topic-seo' 'total':871 'totalimag':509 'transport':826 'tri':337,548 'trigger':54 'true':951 'twitter':485,606 'twittercard':481 'type':332,341,394,543,561,563,575,748,795,835,1074 'unfix':1346 'url':197,380,728 'use':23,103,109,117,157,162,169,177,189,1218,1374 'user':28,786,1197,1315 'v':811,816,988,989,991,994,1000,1003 'valid':705,771,774,1211 'verif':148 'verifi':40,57,1053 'viewport':1311 'visual':1188,1269 'visual-on':1268 'vital':102 'wcag':91 'web':101,181 'whenev':26 'width':860 'window.location.host':1107 'window.location.origin':801 'work':65,161,1152 'workflow':1140 'x':559,560,742,746,829,833 'x-content-type-opt':745,832 'x-frame-opt':741,828 'zero':384,387","prices":[{"id":"d9f81ec7-a094-47ba-be02-d73e44158db8","listingId":"496c1505-0815-4bff-a001-d0920d2f41ee","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"rampstackco","category":"claude-skills","install_from":"skills.sh"},"createdAt":"2026-04-30T01:01:29.587Z"}],"sources":[{"listingId":"496c1505-0815-4bff-a001-d0920d2f41ee","source":"github","sourceId":"rampstackco/claude-skills/qa-testing","sourceUrl":"https://github.com/rampstackco/claude-skills/tree/main/skills/qa-testing","isPrimary":false,"firstSeenAt":"2026-04-30T01:01:29.587Z","lastSeenAt":"2026-05-18T18:55:19.226Z"}],"details":{"listingId":"496c1505-0815-4bff-a001-d0920d2f41ee","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"rampstackco","slug":"qa-testing","github":{"repo":"rampstackco/claude-skills","stars":181,"topics":["agent-skills","anthropic","awesome-claude-code","awesome-claude-prompts","awesome-claude-skills","claude","claude-code","claude-skills","good-first-issue","mcp","product-management","seo","show-hn","showcase","showdev","web-design","web-development"],"license":"mit","html_url":"https://github.com/rampstackco/claude-skills","pushed_at":"2026-05-10T22:40:22Z","description":"Stack-agnostic Claude Skills covering the full website lifecycle: brand, design, content, SEO, dev, ops, growth, and research. Build, ship, audit, optimize.","skill_md_sha":"22a57a511ad1508aec6b90ae6de966e981bedd54","skill_md_path":"skills/qa-testing/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/rampstackco/claude-skills/tree/main/skills/qa-testing"},"layout":"multi","source":"github","category":"claude-skills","frontmatter":{"name":"qa-testing","description":"Run QA testing on a page, feature, or full site at one of three depth tiers (smoke, standard, full). Use this skill whenever the user asks to test a page, audit a site, check for bugs, verify a deploy, run a QA sweep, or review accessibility, performance, or SEO basics. Triggers on test, QA, audit, verify, check, is it working, does it look right, broken, 404, image not loading, post-deploy check, regression test. Also triggers proactively after any significant code change or new page launch where verification matters."},"skills_sh_url":"https://skills.sh/rampstackco/claude-skills/qa-testing"},"updatedAt":"2026-05-18T18:55:19.226Z"}}