{"id":"9e968d8a-f065-40e9-80f8-a0d9b8514ac9","shortId":"Hkevxh","kind":"skill","title":"qa-only","tagline":"Report-only QA testing. Systematically tests a web application and produces a\nstructured report with health score, screenshots, and repro steps — but never\nfixes anything. Use when asked to \"just report bugs\", \"qa report only\", or\n\"test but don't fix\". For the full test-fix-verif","description":"## Preamble\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\" 2>/dev/null || SLUG=\"unknown\"\n_LEARN_FILE=\"${VIBESTACK_HOME:-$HOME/.vibestack}/projects/${SLUG:-unknown}/learnings.jsonl\"\nif [ -f \"$_LEARN_FILE\" ]; then\n  _LEARN_COUNT=$(wc -l < \"$_LEARN_FILE\" 2>/dev/null | tr -d ' ')\n  echo \"LEARNINGS: $_LEARN_COUNT entries loaded\"\n  if [ \"$_LEARN_COUNT\" -gt 5 ] 2>/dev/null; then\n    ~/.vibestack/bin/vibe-learnings-search --limit 5 2>/dev/null || true\n  fi\nelse\n  echo \"LEARNINGS: none yet\"\nfi\n```\n\n## Setup\n\n**Parse the user's request for these parameters:**\n\n| Parameter | Default | Override example |\n|-----------|---------|-----------------:|\n| Target URL | (auto-detect or required) | `https://myapp.com`, `http://localhost:3000` |\n| Mode | full | `--quick`, `--regression .vibestack/qa-reports/baseline.json` |\n| Output dir | `.vibestack/qa-reports/` | `Output to /tmp/qa` |\n| Scope | Full app (or diff-scoped) | `Focus on the billing page` |\n| Auth | None | `Sign in to user@example.com`, `Import cookies from cookies.json` |\n\n**If no URL is given and you're on a feature branch:** Automatically enter **diff-aware mode** (see Modes below). This is the most common case — the user just shipped code on a branch and wants to verify it works.\n\n**Find the browse binary:**\n\n## SETUP\n\n```bash\n# vibestack does not include a browse daemon.\necho \"BROWSE_NOT_AVAILABLE\"\nREPORT_DIR=\".vibestack/qa-reports\"\nmkdir -p \"$REPORT_DIR/screenshots\"\n```\n\nIf `BROWSE_NOT_AVAILABLE`: skip all `$B` commands and use text-only fallbacks (curl, open, direct HTTP checks).\n\n{{include lib/snippets/prior-learnings.md}}\n## Test Plan Context\n\nBefore falling back to git diff heuristics, check for richer test plan sources:\n\n1. **Project-scoped test plans:** Check `~/.vibestack/projects/` for recent `*-test-plan-*.md` files for this repo\n   ```bash\n   setopt +o nomatch 2>/dev/null || true  # zsh compat\n   eval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\"\n   ls -t ~/.vibestack/projects/$SLUG/*-test-plan-*.md 2>/dev/null | head -1\n   ```\n2. **Conversation context:** Check if a prior `/plan-eng-review` or `/plan-ceo-review` produced test plan output in this conversation\n3. **Use whichever source is richer.** Fall back to git diff analysis only if neither is available.\n\n---\n\n## Modes\n\n### Diff-aware (automatic when on a feature branch with no URL)\n\nThis is the **primary mode** for developers verifying their work. When the user says `/qa` without a URL and the repo is on a feature branch, automatically:\n\n1. **Analyze the branch diff** to understand what changed:\n   ```bash\n   git diff main...HEAD --name-only\n   git log main..HEAD --oneline\n   ```\n\n2. **Identify affected pages/routes** from the changed files:\n   - Controller/route files → which URL paths they serve\n   - View/template/component files → which pages render them\n   - Model/service files → which pages use those models (check controllers that reference them)\n   - CSS/style files → which pages include those stylesheets\n   - API endpoints → test them directly with `$B js \"await fetch('/api/...')\"`\n   - Static pages (markdown, HTML) → navigate to them directly\n\n   **If no obvious pages/routes are identified from the diff:** Do not skip browser testing. The user invoked /qa because they want browser-based verification. Fall back to Quick mode — navigate to the homepage, follow the top 5 navigation targets, check console for errors, and test any interactive elements found. Backend, config, and infrastructure changes affect app behavior — always verify the app still works.\n\n3. **Detect the running app** — check common local dev ports:\n   ```bash\n   $B goto http://localhost:3000 2>/dev/null && echo \"Found app on :3000\" || \\\n   $B goto http://localhost:4000 2>/dev/null && echo \"Found app on :4000\" || \\\n   $B goto http://localhost:8080 2>/dev/null && echo \"Found app on :8080\"\n   ```\n   If no local app is found, check for a staging/preview URL in the PR or environment. If nothing works, ask the user for the URL.\n\n4. **Test each affected page/route:**\n   - Navigate to the page\n   - Take a screenshot\n   - Check console for errors\n   - If the change was interactive (forms, buttons, flows), test the interaction end-to-end\n   - Use `snapshot -D` before and after actions to verify the change had the expected effect\n\n5. **Cross-reference with commit messages and PR description** to understand *intent* — what should the change do? Verify it actually does that.\n\n6. **Check TODOS.md** (if it exists) for known bugs or issues related to the changed files. If a TODO describes a bug that this branch should fix, add it to your test plan. If you find a new bug during QA that isn't in TODOS.md, note it in the report.\n\n7. **Report findings** scoped to the branch changes:\n   - \"Changes tested: N pages/routes affected by this branch\"\n   - For each: does it work? Screenshot evidence.\n   - Any regressions on adjacent pages?\n\n**If the user provides a URL with diff-aware mode:** Use that URL as the base but still scope testing to the changed files.\n\n### Full (default when URL is provided)\nSystematic exploration. Visit every reachable page. Document 5-10 well-evidenced issues. Produce health score. Takes 5-15 minutes depending on app size.\n\n### Quick (`--quick`)\n30-second smoke test. Visit homepage + top 5 navigation targets. Check: page loads? Console errors? Broken links? Produce health score. No detailed issue documentation.\n\n### Regression (`--regression <baseline>`)\nRun full mode, then load `baseline.json` from a previous run. Diff: which issues are fixed? Which are new? What's the score delta? Append regression section to report.\n\n---\n\n## Workflow\n\n### Phase 1: Initialize\n\n1. Find browse binary (see Setup above)\n2. Create output directories\n3. Copy report template from `qa/templates/qa-report-template.md` to output dir\n4. Start timer for duration tracking\n\n### Phase 2: Authenticate (if needed)\n\n**If the user specified auth credentials:**\n\n```bash\n$B goto <login-url>\n$B snapshot -i                    # find the login form\n$B fill @e3 \"user@example.com\"\n$B fill @e4 \"[REDACTED]\"         # NEVER include real passwords in report\n$B click @e5                      # submit\n$B snapshot -D                    # verify login succeeded\n```\n\n**If the user provided a cookie file:**\n\n```bash\n$B cookie-import cookies.json\n$B goto <target-url>\n```\n\n**If 2FA/OTP is required:** Ask the user for the code and wait.\n\n**If CAPTCHA blocks you:** Tell the user: \"Please complete the CAPTCHA in the browser, then tell me to continue.\"\n\n### Phase 3: Orient\n\nGet a map of the application:\n\n```bash\n$B goto <target-url>\n$B snapshot -i -a -o \"$REPORT_DIR/screenshots/initial.png\"\n$B links                          # map navigation structure\n$B console --errors               # any errors on landing?\n```\n\n**Detect framework** (note in report metadata):\n- `__next` in HTML or `_next/data` requests → Next.js\n- `csrf-token` meta tag → Rails\n- `wp-content` in URLs → WordPress\n- Client-side routing with no page reloads → SPA\n\n**For SPAs:** The `links` command may return few results because navigation is client-side. Use `snapshot -i` to find nav elements (buttons, menu items) instead.\n\n### Phase 4: Explore\n\nVisit pages systematically. At each page:\n\n```bash\n$B goto <page-url>\n$B snapshot -i -a -o \"$REPORT_DIR/screenshots/page-name.png\"\n$B console --errors\n```\n\nThen follow the **per-page exploration checklist** (see `qa/references/issue-taxonomy.md`):\n\n1. **Visual scan** — Look at the annotated screenshot for layout issues\n2. **Interactive elements** — Click buttons, links, controls. Do they work?\n3. **Forms** — Fill and submit. Test empty, invalid, edge cases\n4. **Navigation** — Check all paths in and out\n5. **States** — Empty state, loading, error, overflow\n6. **Console** — Any new JS errors after interactions?\n7. **Responsiveness** — Check mobile viewport if relevant:\n   ```bash\n   $B viewport 375x812\n   $B screenshot \"$REPORT_DIR/screenshots/page-mobile.png\"\n   $B viewport 1280x720\n   ```\n\n**Depth judgment:** Spend more time on core features (homepage, dashboard, checkout, search) and less on secondary pages (about, terms, privacy).\n\n**Quick mode:** Only visit homepage + top 5 navigation targets from the Orient phase. Skip the per-page checklist — just check: loads? Console errors? Broken links visible?\n\n### Phase 5: Document\n\nDocument each issue **immediately when found** — don't batch them.\n\n**Two evidence tiers:**\n\n**Interactive bugs** (broken flows, dead buttons, form failures):\n1. Take a screenshot before the action\n2. Perform the action\n3. Take a screenshot showing the result\n4. Use `snapshot -D` to show what changed\n5. Write repro steps referencing screenshots\n\n```bash\n$B screenshot \"$REPORT_DIR/screenshots/issue-001-step-1.png\"\n$B click @e5\n$B screenshot \"$REPORT_DIR/screenshots/issue-001-result.png\"\n$B snapshot -D\n```\n\n**Static bugs** (typos, layout issues, missing images):\n1. Take a single annotated screenshot showing the problem\n2. Describe what's wrong\n\n```bash\n$B snapshot -i -a -o \"$REPORT_DIR/screenshots/issue-002.png\"\n```\n\n**Write each issue to the report immediately** using the template format from `qa/templates/qa-report-template.md`.\n\n### Phase 6: Wrap Up\n\n1. **Compute health score** using the rubric below\n2. **Write \"Top 3 Things to Fix\"** — the 3 highest-severity issues\n3. **Write console health summary** — aggregate all console errors seen across pages\n4. **Update severity counts** in the summary table\n5. **Fill in report metadata** — date, duration, pages visited, screenshot count, framework\n6. **Save baseline** — write `baseline.json` with:\n   ```json\n   {\n     \"date\": \"YYYY-MM-DD\",\n     \"url\": \"<target>\",\n     \"healthScore\": N,\n     \"issues\": [{ \"id\": \"ISSUE-001\", \"title\": \"...\", \"severity\": \"...\", \"category\": \"...\" }],\n     \"categoryScores\": { \"console\": N, \"links\": N, ... }\n   }\n   ```\n\n**Regression mode:** After writing the report, load the baseline file. Compare:\n- Health score delta\n- Issues fixed (in baseline but not current)\n- New issues (in current but not baseline)\n- Append the regression section to the report\n\n---\n\n## Health Score Rubric\n\nCompute each category score (0-100), then take the weighted average.\n\n### Console (weight: 15%)\n- 0 errors → 100\n- 1-3 errors → 70\n- 4-10 errors → 40\n- 10+ errors → 10\n\n### Links (weight: 10%)\n- 0 broken → 100\n- Each broken link → -15 (minimum 0)\n\n### Per-Category Scoring (Visual, Functional, UX, Content, Performance, Accessibility)\nEach category starts at 100. Deduct per finding:\n- Critical issue → -25\n- High issue → -15\n- Medium issue → -8\n- Low issue → -3\nMinimum 0 per category.\n\n### Weights\n| Category | Weight |\n|----------|--------|\n| Console | 15% |\n| Links | 10% |\n| Visual | 10% |\n| Functional | 20% |\n| UX | 15% |\n| Performance | 10% |\n| Content | 5% |\n| Accessibility | 15% |\n\n### Final Score\n`score = Σ (category_score × weight)`\n\n---\n\n## Framework-Specific Guidance\n\n### Next.js\n- Check console for hydration errors (`Hydration failed`, `Text content did not match`)\n- Monitor `_next/data` requests in network — 404s indicate broken data fetching\n- Test client-side navigation (click links, don't just `goto`) — catches routing issues\n- Check for CLS (Cumulative Layout Shift) on pages with dynamic content\n\n### Rails\n- Check for N+1 query warnings in console (if development mode)\n- Verify CSRF token presence in forms\n- Test Turbo/Stimulus integration — do page transitions work smoothly?\n- Check for flash messages appearing and dismissing correctly\n\n### WordPress\n- Check for plugin conflicts (JS errors from different plugins)\n- Verify admin bar visibility for logged-in users\n- Test REST API endpoints (`/wp-json/`)\n- Check for mixed content warnings (common with WP)\n\n### General SPA (React, Vue, Angular)\n- Use `snapshot -i` for navigation — `links` command misses client-side routes\n- Check for stale state (navigate away and back — does data refresh?)\n- Test browser back/forward — does the app handle history correctly?\n- Check for memory leaks (monitor console after extended use)\n\n---\n\n## Important Rules\n\n1. **Repro is everything.** Every issue needs at least one screenshot. No exceptions.\n2. **Verify before documenting.** Retry the issue once to confirm it's reproducible, not a fluke.\n3. **Never include credentials.** Write `[REDACTED]` for passwords in repro steps.\n4. **Write incrementally.** Append each issue to the report as you find it. Don't batch.\n5. **Never read source code.** Test as a user, not a developer.\n6. **Check console after every interaction.** JS errors that don't surface visually are still bugs.\n7. **Test like a user.** Use realistic data. Walk through complete workflows end-to-end.\n8. **Depth over breadth.** 5-10 well-documented issues with evidence > 20 vague descriptions.\n9. **Never delete output files.** Screenshots and reports accumulate — that's intentional.\n10. **Use `snapshot -C` for tricky UIs.** Finds clickable divs that the accessibility tree misses.\n11. **Show screenshots to the user.** After every `$B screenshot`, `$B snapshot -a -o`, or `$B responsive` command, use the Read tool on the output file(s) so the user can see them inline. For `responsive` (3 files), Read all three. This is critical — without it, screenshots are invisible to the user.\n12. **Never refuse to use the browser.** When the user invokes /qa or /qa-only, they are requesting browser-based testing. Never suggest evals, unit tests, or other alternatives as a substitute. Even if the diff appears to have no UI changes, backend changes affect app behavior — always open the browser and test.\n\n---\n\n## Output\n\nWrite the report to both local and project-scoped locations:\n\n**Local:** `.vibestack/qa-reports/qa-report-{domain}-{YYYY-MM-DD}.md`\n\n**Project-scoped:** Write test outcome artifact for cross-session context:\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\" && mkdir -p ~/.vibestack/projects/$SLUG\n```\nWrite to `~/.vibestack/projects/{slug}/{user}-{branch}-test-outcome-{datetime}.md`\n\n### Output Structure\n\n```\n.vibestack/qa-reports/\n├── qa-report-{domain}-{YYYY-MM-DD}.md    # Structured report\n├── screenshots/\n│   ├── initial.png                        # Landing page annotated screenshot\n│   ├── issue-001-step-1.png               # Per-issue evidence\n│   ├── issue-001-result.png\n│   └── ...\n└── baseline.json                          # For regression mode\n```\n\nReport filenames use the domain and date: `qa-report-myapp-com-2026-03-12.md`\n\n---\n\n{{include lib/snippets/capture-learnings.md}}\n## Additional Rules (qa-only specific)\n\n11. **Never fix bugs.** Find and document only. Do not read source code, edit files, or suggest fixes in the report. Your job is to report what's broken, not to fix it. Use `/qa` for the test-fix-verify loop.\n12. **No test framework detected?** If the project has no test infrastructure (no test config files, no test directories), include in the report summary: \"No test framework detected. Run `/qa` to bootstrap one and enable regression test generation.\"","tags":["only","vibestack","timurgaleev","agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"capabilities":["skill","source-timurgaleev","skill-qa-only","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-cursor-ide","topic-developer-tools","topic-kiro","topic-mcp","topic-prompt-engineering","topic-slash-commands"],"categories":["vibestack"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/timurgaleev/vibestack/qa-only","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add timurgaleev/vibestack","source_repo":"https://github.com/timurgaleev/vibestack","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 15 github stars · SKILL.md body (14,977 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-18T19:06:23.225Z","embedding":null,"createdAt":"2026-05-18T19:06:23.225Z","updatedAt":"2026-05-18T19:06:23.225Z","lastSeenAt":"2026-05-18T19:06:23.225Z","tsv":"'+1':1616 '-001':1413 '-1':314 '-10':790,1482,1831 '-100':1465 '-15':800,1497,1523 '-25':1520 '-3':1478,1529 '-8':1526 '/.vibestack/bin/vibe-learnings-search':101 '/.vibestack/bin/vibe-slug':56,300,2007 '/.vibestack/projects':279,305,2012,2016 '/api':461 '/dev/null':58,60,84,99,105,295,302,312,550,561,572,2009 '/learnings.jsonl':71 '/plan-ceo-review':324 '/plan-eng-review':322 '/projects':68 '/qa':376,487,1931,2105,2142 '/qa-only':1933 '/tmp/qa':147 '/wp-json':1669 '0':1464,1474,1491,1499,1531 '1':272,389,864,866,1106,1249,1303,1342,1477,1726 '10':1485,1487,1490,1540,1542,1548,1853 '100':1476,1493,1514 '11':1868,2071 '12':1920,2113 '1280x720':1177 '15':1473,1538,1546,1552 '2':57,59,83,98,104,294,301,311,315,411,549,560,571,873,893,1117,1256,1312,1350,1739,2008 '20':1544,1838 '2fa/otp':953 '3':332,534,877,984,1127,1260,1353,1358,1363,1755,1904 '30':808 '3000':136,548,555 '375x812':1170 '4':603,886,1075,1137,1267,1375,1481,1766 '40':1484 '4000':559,566 '404s':1582 '5':97,103,507,649,789,799,815,1145,1204,1226,1275,1383,1550,1782,1830 '6':672,1152,1339,1395,1794 '7':723,1160,1810 '70':1480 '8':1826 '8080':570,577 '9':1841 'access':1509,1551,1865 'accumul':1849 'across':1373 'action':640,1255,1259 'actual':669 'add':699 'addit':2065 'adjac':749 'admin':1657 'affect':413,525,606,735,1964 'aggreg':1368 'altern':1948 'alway':528,1967 'analysi':343 'analyz':390 'angular':1682 'annot':1112,1307,2043 'anyth':29 'api':451,1667 'app':150,526,531,538,553,564,575,581,804,1711,1965 'appear':1642,1956 'append':857,1450,1769 'applic':13,991 'artifact':1999 'ask':32,597,956 'auth':160,901 'authent':894 'auto':130 'auto-detect':129 'automat':182,353,388 'avail':227,238,348 'averag':1470 'await':459 'awar':186,352,760 'away':1700 'b':241,457,545,556,567,904,906,913,917,927,931,945,950,993,995,1002,1007,1084,1086,1093,1168,1171,1175,1282,1286,1289,1293,1318,1876,1878,1883 'back':261,339,496,1702 'back/forward':1708 'backend':520,1962 'bar':1658 'base':493,767,1939 'baselin':1397,1430,1439,1449 'baseline.json':839,1399,2051 'bash':54,216,290,398,544,903,944,992,1083,1167,1281,1317,2005 'batch':1236,1781 'behavior':527,1966 'bill':158 'binari':214,869 'block':966 'bootstrap':2144 'branch':181,204,358,387,392,696,729,738,2019 'breadth':1829 'broken':823,1222,1243,1492,1495,1584,2099 'brows':213,222,225,236,868 'browser':482,492,977,1707,1926,1938,1970 'browser-bas':491,1937 'bug':36,680,693,710,1242,1297,1809,2074 'button':625,1070,1121,1246 'c':1856 'captcha':965,974 'case':196,1136 'catch':1598 'categori':1416,1462,1502,1511,1533,1535,1557 'categoryscor':1417 'chang':397,417,524,621,644,665,686,730,731,774,1274,1961,1963 'check':253,266,278,318,439,510,539,584,615,673,818,1139,1162,1218,1565,1601,1613,1638,1647,1670,1695,1715,1795 'checklist':1103,1216 'checkout':1188 'click':928,1120,1287,1592 'clickabl':1861 'client':1040,1061,1589,1692 'client-sid':1039,1060,1588,1691 'cls':1603 'code':201,961,1786,2083 'command':242,1052,1689,1885 'commit':654 'common':195,540,1675 'compar':1432 'compat':298 'complet':972,1820 'comput':1343,1460 'config':521,2127 'confirm':1748 'conflict':1650 'consol':511,616,821,1008,1094,1153,1220,1365,1370,1418,1471,1537,1566,1620,1720,1796 'content':1035,1507,1549,1573,1611,1673 'context':258,317,2004 'continu':982 'control':440,1123 'controller/route':419 'convers':316,331 'cooki':167,942,947 'cookie-import':946 'cookies.json':169,949 'copi':878 'core':1184 'correct':1645,1714 'count':78,90,95,1378,1393 'creat':874 'credenti':902,1758 'critic':1518,1911 'cross':651,2002 'cross-refer':650 'cross-sess':2001 'csrf':1028,1625 'csrf-token':1027 'css/style':444 'cumul':1604 'curl':249 'current':1442,1446 'd':86,636,933,1270,1295 'daemon':223 'dashboard':1187 'data':1585,1704,1817 'date':1388,1402,2061 'datetim':2023 'dd':1406,1991,2035 'dead':1245 'deduct':1515 'default':124,777 'delet':1843 'delta':856,1435 'depend':802 'depth':1178,1827 'describ':691,1313 'descript':658,1840 'detail':829 'detect':131,535,1014,2117,2140 'dev':542 'develop':368,1622,1793 'diff':153,185,264,342,351,393,400,478,759,844,1955 'diff-awar':184,350,758 'diff-scop':152 'differ':1654 'dir':143,229,885 'dir/screenshots':234 'dir/screenshots/initial.png':1001 'dir/screenshots/issue-001-result.png':1292 'dir/screenshots/issue-001-step-1.png':1285 'dir/screenshots/issue-002.png':1324 'dir/screenshots/page-mobile.png':1174 'dir/screenshots/page-name.png':1092 'direct':251,455,469 'directori':876,2131 'dismiss':1644 'div':1862 'document':788,831,1227,1228,1742,1834,2077 'domain':1987,2031,2059 'durat':890,1389 'dynam':1610 'e3':915 'e4':919 'e5':929,1288 'echo':87,109,224,551,562,573 'edg':1135 'edit':2084 'effect':648 'element':518,1069,1119 'els':108 'empti':1133,1147 'enabl':2147 'end':631,633,1823,1825 'end-to-end':630,1822 'endpoint':452,1668 'enter':183 'entri':91 'environ':593 'error':513,618,822,1009,1011,1095,1150,1157,1221,1371,1475,1479,1483,1486,1569,1652,1801 'eval':55,299,1943,2006 'even':1952 'everi':785,1730,1798,1875 'everyth':1729 'evid':745,1239,1837,2049 'evidenc':793 'exampl':126 'except':1738 'exist':677 'expect':647 'explor':783,1076,1102 'extend':1722 'f':73 'fail':1571 'failur':1248 'fall':260,338,495 'fallback':248 'featur':180,357,386,1185 'fetch':460,1586 'fi':107,113 'file':64,75,82,286,418,420,427,433,445,687,775,943,1431,1845,1893,1905,2085,2128 'filenam':2056 'fill':914,918,1129,1384 'final':1553 'find':211,707,725,867,909,1067,1517,1777,1860,2075 'fix':28,45,51,698,848,1356,1437,2073,2088,2102,2110 'flash':1640 'flow':626,1244 'fluke':1754 'focus':155 'follow':504,1097 'form':624,912,1128,1247,1629 'format':1335 'found':519,552,563,574,583,1233 'framework':1015,1394,1561,2116,2139 'framework-specif':1560 'full':48,138,149,776,835 'function':1505,1543 'general':1678 'generat':2150 'get':986 'git':263,341,399,406 'given':174 'goto':546,557,568,905,951,994,1085,1597 'gt':96 'guidanc':1563 'handl':1712 'head':313,402,409 'health':20,796,826,1344,1366,1433,1457 'healthscor':1408 'heurist':265 'high':1521 'highest':1360 'highest-sever':1359 'histori':1713 'home':66 'home/.vibestack':67 'homepag':503,813,1186,1202 'html':465,1022 'http':252 'hydrat':1568,1570 'id':1411 'identifi':412,475 'imag':1302 'immedi':1231,1331 'import':166,948,1724 'includ':220,254,448,922,1757,2063,2132 'increment':1768 'indic':1583 'infrastructur':523,2124 'initi':865 'initial.png':2040 'inlin':1901 'instead':1073 'integr':1632 'intent':661,1852 'interact':517,623,629,1118,1159,1241,1799 'invalid':1134 'invis':1916 'invok':486,1930 'isn':714 'issu':682,794,830,846,1116,1230,1300,1327,1362,1410,1412,1436,1444,1519,1522,1525,1528,1600,1731,1745,1771,1835,2048 'issue-001-result.png':2050 'issue-001-step-1.png':2045 'item':1072 'job':2093 'js':458,1156,1651,1800 'json':1401 'judgment':1179 'known':679 'l':80 'land':1013,2041 'layout':1115,1299,1605 'leak':1718 'learn':63,74,77,81,88,89,94,110 'least':1734 'less':1191 'lib/snippets/capture-learnings.md':2064 'lib/snippets/prior-learnings.md':255 'like':1812 'limit':102 'link':824,1003,1051,1122,1223,1420,1488,1496,1539,1593,1688 'load':92,820,838,1149,1219,1428 'local':541,580,1979,1985 'localhost':135,547,558,569 'locat':1984 'log':407,1662 'logged-in':1661 'login':911,935 'look':1109 'loop':2112 'low':1527 'ls':303 'main':401,408 'map':988,1004 'markdown':464 'match':1576 'may':1053 'md':285,310,1992,2024,2036 'medium':1524 'memori':1717 'menu':1071 'messag':655,1641 'meta':1030 'metadata':1019,1387 'minimum':1498,1530 'minut':801 'miss':1301,1690,1867 'mix':1672 'mkdir':231,2010 'mm':1405,1990,2034 'mobil':1163 'mode':137,187,189,349,366,499,761,836,1199,1423,1623,2054 'model':438 'model/service':432 'monitor':1577,1719 'myapp.com':134 'n':733,1409,1419,1421,1615 'name':404 'name-on':403 'nav':1068 'navig':466,500,508,608,816,1005,1058,1138,1205,1591,1687,1699 'need':896,1732 'neither':346 'network':1581 'never':27,921,1756,1783,1842,1921,1941,2072 'new':709,851,1155,1443 'next':1020 'next.js':1026,1564 'next/data':1024,1578 'nomatch':293 'none':111,161 'note':718,1016 'noth':595 'o':292,999,1090,1322,1881 'obvious':472 'one':1735,2145 'onelin':410 'open':250,1968 'orient':985,1209 'outcom':1998,2022 'output':142,145,328,875,884,1844,1892,1973,2025 'overflow':1151 'overrid':125 'p':232,2011 'page':159,429,435,447,463,611,750,787,819,1045,1078,1082,1101,1194,1215,1374,1390,1608,1634,2042 'page/route':607 'pages/routes':414,473,734 'paramet':122,123 'pars':115 'password':924,1762 'path':423,1141 'per':1100,1214,1501,1516,1532,2047 'per-categori':1500 'per-issu':2046 'per-pag':1099,1213 'perform':1257,1508,1547 'phase':863,892,983,1074,1210,1225,1338 'plan':257,270,277,284,309,327,704 'pleas':971 'plugin':1649,1655 'port':543 'pr':591,657 'preambl':53 'presenc':1627 'previous':842 'primari':365 'prior':321 'privaci':1197 'problem':1311 'produc':15,325,795,825 'project':274,1982,1994,2120 'project-scop':273,1981,1993 'provid':754,781,940 'qa':2,7,37,712,2029,2068 'qa-on':1,2067 'qa-report':2028 'qa-report-myapp-com-2026-03-12.md':2062 'qa/references/issue-taxonomy.md':1105 'qa/templates/qa-report-template.md':882,1337 'queri':1617 'quick':139,498,806,807,1198 'rail':1032,1612 're':177 'reachabl':786 'react':1680 'read':1784,1888,1906,2081 'real':923 'realist':1816 'recent':281 'redact':920,1760 'refer':442,652 'referenc':1279 'refresh':1705 'refus':1922 'regress':140,747,832,833,858,1422,1452,2053,2148 'relat':683 'relev':1166 'reload':1046 'render':430 'repo':289,382 'report':5,18,35,38,228,233,722,724,861,879,926,1000,1018,1091,1173,1284,1291,1323,1330,1386,1427,1456,1774,1848,1976,2030,2038,2055,2091,2096,2135 'report-on':4 'repro':24,1277,1727,1764 'reproduc':1751 'request':119,1025,1579,1936 'requir':133,955 'respons':1161,1884,1903 'rest':1666 'result':1056,1266 'retri':1743 'return':1054 'richer':268,337 'rout':1042,1599,1694 'rubric':1348,1459 'rule':1725,2066 'run':537,834,843,2141 'save':1396 'say':375 'scan':1108 'scope':148,154,275,726,770,1983,1995 'score':21,797,827,855,1345,1434,1458,1463,1503,1554,1555,1558 'screenshot':22,614,744,1113,1172,1252,1263,1280,1283,1290,1308,1392,1736,1846,1870,1877,1914,2039,2044 'search':1189 'second':809 'secondari':1193 'section':859,1453 'see':188,870,1104,1899 'seen':1372 'serv':425 'session':2003 'setopt':291 'setup':114,215,871 'sever':1361,1377,1415 'shift':1606 'ship':200 'show':1264,1272,1309,1869 'side':1041,1062,1590,1693 'sign':162 'singl':1306 'size':805 'skill' 'skill-qa-only' 'skip':239,481,1211 'slug':61,69,306,2013,2017 'smoke':810 'smooth':1637 'snapshot':635,907,932,996,1064,1087,1269,1294,1319,1684,1855,1879 'sourc':271,335,1785,2082 'source-timurgaleev' 'spa':1047,1679 'spas':1049 'specif':1562,2070 'specifi':900 'spend':1180 'staging/preview':587 'stale':1697 'start':887,1512 'state':1146,1148,1698 'static':462,1296 'step':25,1278,1765 'still':532,769,1808 'structur':17,1006,2026,2037 'stylesheet':450 'submit':930,1131 'substitut':1951 'succeed':936 'suggest':1942,2087 'summari':1367,1381,2136 'surfac':1805 'systemat':9,782,1079 'tabl':1382 'tag':1031 'take':612,798,1250,1261,1304,1467 'target':127,509,817,1206 'tell':968,979 'templat':880,1334 'term':1196 'test':8,10,41,50,256,269,276,283,308,326,453,483,515,604,627,703,732,771,811,1132,1587,1630,1665,1706,1787,1811,1940,1945,1972,1997,2021,2109,2115,2123,2126,2130,2138,2149 'test-fix-verif':49 'test-fix-verifi':2108 'test-outcom':2020 'test-plan':282,307 'text':246,1572 'text-on':245 'thing':1354 'three':1908 'tier':1240 'time':1182 'timer':888 'titl':1414 'todo':690 'todos.md':674,717 'token':1029,1626 'tool':1889 'top':506,814,1203,1352 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-cursor-ide' 'topic-developer-tools' 'topic-kiro' 'topic-mcp' 'topic-prompt-engineering' 'topic-slash-commands' 'tr':85 'track':891 'transit':1635 'tree':1866 'tricki':1858 'true':106,296 'turbo/stimulus':1631 'two':1238 'typo':1298 'ui':1859,1960 'understand':395,660 'unit':1944 'unknown':62,70 'updat':1376 'url':128,172,361,379,422,588,602,756,764,779,1037,1407 'use':30,244,333,436,634,762,1063,1268,1332,1346,1683,1723,1815,1854,1886,1924,2057,2104 'user':117,198,374,485,599,753,899,939,958,970,1664,1790,1814,1873,1897,1919,1929,2018 'user@example.com':165,916 'ux':1506,1545 'vagu':1839 'verif':52,494 'verifi':208,369,529,642,667,934,1624,1656,1740,2111 'vibestack':65,217 'vibestack/qa-reports':144,230,2027 'vibestack/qa-reports/baseline.json':141 'vibestack/qa-reports/qa-report-':1986 'view/template/component':426 'viewport':1164,1169,1176 'visibl':1224,1659 'visit':784,812,1077,1201,1391 'visual':1107,1504,1541,1806 'vue':1681 'wait':963 'walk':1818 'want':206,490 'warn':1618,1674 'wc':79 'web':12 'weight':1469,1472,1489,1534,1536,1559 'well':792,1833 'well-docu':1832 'well-evidenc':791 'whichev':334 'without':377,1912 'wordpress':1038,1646 'work':210,371,533,596,743,1126,1636 'workflow':862,1821 'wp':1034,1677 'wp-content':1033 'wrap':1340 'write':1276,1325,1351,1364,1398,1425,1759,1767,1974,1996,2014 'wrong':1316 'yet':112 'yyyi':1404,1989,2033 'yyyy-mm-dd':1403,1988,2032 'zsh':297 'σ':1556","prices":[{"id":"291adf9b-22e1-4155-94c4-eabb0ef0c5eb","listingId":"9e968d8a-f065-40e9-80f8-a0d9b8514ac9","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"timurgaleev","category":"vibestack","install_from":"skills.sh"},"createdAt":"2026-05-18T19:06:23.225Z"}],"sources":[{"listingId":"9e968d8a-f065-40e9-80f8-a0d9b8514ac9","source":"github","sourceId":"timurgaleev/vibestack/qa-only","sourceUrl":"https://github.com/timurgaleev/vibestack/tree/main/skills/qa-only","isPrimary":false,"firstSeenAt":"2026-05-18T19:06:23.225Z","lastSeenAt":"2026-05-18T19:06:23.225Z"}],"details":{"listingId":"9e968d8a-f065-40e9-80f8-a0d9b8514ac9","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"timurgaleev","slug":"qa-only","github":{"repo":"timurgaleev/vibestack","stars":15,"topics":["agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"license":"mit","html_url":"https://github.com/timurgaleev/vibestack","pushed_at":"2026-05-18T18:19:05Z","description":"vibestack is a portable skill pack for AI coding agents. Slash commands like /office-hours, /ship, /investigate, /tdd, /review install once and work across every agent that supports the Agent Skills open standard — Claude Code, Cursor, Kiro, and a growing list of others. ","skill_md_sha":"7e89a11eb404f596b25a65bb741b98bb4a90408b","skill_md_path":"skills/qa-only/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/timurgaleev/vibestack/tree/main/skills/qa-only"},"layout":"multi","source":"github","category":"vibestack","frontmatter":{"name":"qa-only","description":"Report-only QA testing. Systematically tests a web application and produces a\nstructured report with health score, screenshots, and repro steps — but never\nfixes anything. Use when asked to \"just report bugs\", \"qa report only\", or\n\"test but don't fix\". For the full test-fix-verify loop, use /qa instead.\nProactively suggest when the user wants a bug report without any code changes.\nVoice triggers (speech-to-text aliases): \"bug report\", \"just check for bugs\"."},"skills_sh_url":"https://skills.sh/timurgaleev/vibestack/qa-only"},"updatedAt":"2026-05-18T19:06:23.225Z"}}