[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71GSH1FGF1ASSPANW2B6DMN":3,"skill-same:01M71GSH1FGF1ASSPANW2B6DMN":93},{"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":34,"publishedAt":55,"linkOnly":56,"markdownContent":57,"markdownBody":58,"frontMatter":59,"refName":70,"commitSha":71,"skillDirectory":72,"forksCount":73,"repositoryHtmlUrl":74,"repositoryHomepageUrl":6,"ownerHtmlUrl":75,"ownerBlogUrl":76,"ownerDescription":77,"updatedAt":78,"install":79,"resources":92},"01M71GSH1FGF1ASSPANW2B6DMN","qa-only",null,"Report-only QA of a web app: health score, screenshots and repro steps for each bug. Never fixes anything.","timurgaleev\u002Fvibestack","timurgaleev","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F32696429?v=4","01M71GMS53Z9B4JQTCQEFXAE9E","Timur Galeev","01M71GMS5S1Q7BEYB3Z7GY3E85",8,"MIT","https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Fskills\u002Fqa-only\u002FSKILL.md",[18,23,26,29],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":30,"categoryName":31,"taxonomyType":32,"taxonomyTypeDesc":33},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"qa","qa only","only","just","for","fixes","bugs","screenshots","but","steps","bug","write","read","websearch","Bash","repro","fix","qa report","never","app","2026-11-10 10:12:30",false,"---\nname: qa-only\ndescription: |\n  Report-only QA of a web app: health score, screenshots and repro steps for each bug. Never fixes anything.\nallowed-tools:\n  - Bash\n  - Read\n  - Write\n  - AskUserQuestion\n  - WebSearch\ntriggers:\n  - qa report only\n  - just report bugs\n  - test but dont fix\n---\n\nIf this session was compacted, the copy of this skill in context may be cut off.\nRead `${CLAUDE_SKILL_DIR}\u002FSKILL.md` from disk and resume at the step you are on.\n\n## When to invoke\n\nUse when asked to \"just report bugs\", \"qa report only\", or \"test but don't fix\". For the full test-fix-verify loop, use \u002Fqa instead.\n\nProactively suggest when the user wants a bug report without any code changes.\n\nVoice triggers (speech-to-text aliases): \"bug report\", \"just check for bugs\".\n\n## Preamble\n\n```bash\neval \"$(\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-slug\" 2>\u002Fdev\u002Fnull)\" 2>\u002Fdev\u002Fnull || SLUG=\"unknown\"\n_LEARN_FILE=\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F${SLUG:-unknown}\u002Flearnings.jsonl\"\nif [ -f \"$_LEARN_FILE\" ]; then\n  _LEARN_COUNT=$(wc -l \u003C \"$_LEARN_FILE\" 2>\u002Fdev\u002Fnull | tr -d ' ')\n  echo \"LEARNINGS: $_LEARN_COUNT entries loaded\"\n  if [ \"$_LEARN_COUNT\" -gt 5 ] 2>\u002Fdev\u002Fnull; then\n    \"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-learnings-search\" --limit 5 2>\u002Fdev\u002Fnull || true\n  fi\nelse\n  echo \"LEARNINGS: none yet\"\nfi\n```\n\n{{include lib\u002Fsnippets\u002Fsession-host.md}}\n\n{{include lib\u002Fsnippets\u002Fdecision-brief.md}}\n\n{{include lib\u002Fsnippets\u002Fworking-protocols.md}}\n\n{{include lib\u002Fsnippets\u002Fstate-protocols.md}}\n\n---\n\n# \u002Fqa-only: Report-Only QA Testing\n\nYou are a QA engineer. Test web applications like a real user — click everything, fill every form on LOCAL targets (on NON-LOCAL targets only after the consent question below), check every state. Produce a structured report with evidence. **NEVER fix anything.**\n\nEvery instruction that follows describes how to observe and record. Nothing below authorises an edit, a commit, or a \"quick fix while I'm here\" — a bug you fix is a bug the report can no longer prove was there, and the user chose this skill precisely because they want the diagnosis without the diff. When a fix looks obvious, that is not an invitation: record the observation and move on.\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:\u002F\u002Fmyapp.com`, `http:\u002F\u002Flocalhost:3000` |\n| Mode | full | `--quick`, `--regression` (compares with the newest earlier run), `--regression \u003Cpath>\u002Fbaseline.json` |\n| Output dir | `.vibestack\u002Fqa-reports\u002F` | `Output to \u002Ftmp\u002Fqa` |\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{{include lib\u002Fsnippets\u002Fbrowse-detect.md}}\n\n{{include lib\u002Fsnippets\u002Fqa-run-dir.md}}\n\nIf `BROWSE_NOT_AVAILABLE`: skip all `$B` commands and use text-only fallbacks (curl, open, direct HTTP checks).\n\n{{include lib\u002Fsnippets\u002Fprior-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 the project dir under `${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F` for recent `*-test-plan-*.md` files for this repo\n   ```bash\n   setopt +o nomatch 2>\u002Fdev\u002Fnull || true  # zsh compat\n   eval \"$(\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-slug\" 2>\u002Fdev\u002Fnull)\"\n   ls -t \"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F$SLUG\u002F\"*-test-plan-*.md 2>\u002Fdev\u002Fnull | head -1\n   ```\n2. **Conversation context:** Check if a prior `\u002Fplan-eng-review` or `\u002Fplan-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{{include lib\u002Fsnippets\u002Fqa-scope.md}}\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 `\u002Fqa` 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\u002Froutes** from the changed files:\n   - Controller\u002Froute files → which URL paths they serve\n   - View\u002Ftemplate\u002Fcomponent files → which pages render them\n   - Model\u002Fservice files → which pages use those models (check controllers that reference them)\n   - CSS\u002Fstyle files → which pages include those stylesheets\n   - API endpoints → test them directly with `$B js \"await fetch('\u002Fapi\u002F...')\"`\n   - Static pages (markdown, HTML) → navigate to them directly\n\n   **If no obvious pages\u002Froutes are identified from the diff:** the change still gets tested — on the surface \"Choosing the surface\" selects. A CLI, library, job or API-only change is a functional surface: follow \"Functional surface\", not a homepage smoke test. When the app has pages that run on the changed backend, config or infrastructure, the surface is mixed: probe the changed behavior functionally, and run Quick mode in the browser (homepage, top 5 navigation targets, console, interactive elements) to verify the app still works.\n\n3. **Detect the running app** — probe common local dev ports for a real HTTP answer (a browse `goto` is not a liveness check: it can exit 0 on a refused connection):\n   ```bash\n   for p in 3000 4000 8080; do curl -sI --max-time 3 \"http:\u002F\u002Flocalhost:$p\" >\u002Fdev\u002Fnull 2>&1 && echo \"APP_PORT: $p\"; done; echo PORT_SCAN_DONE\n   ```\n   Use the port on the first `APP_PORT:` line. No `APP_PORT:` line before `PORT_SCAN_DONE` means no local app is running. If no local app is found, check for a staging\u002Fpreview URL in the PR or environment. If nothing works, ask the user for the URL.\n\n4. **Test each affected page\u002Froute:**\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\u002Froutes 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`)\nSmoke test on a soft 3-minute budget, timed from the first `$B goto`. Visit homepage + top 5 navigation targets. Check: page loads? Console errors? Broken links? At the cap, start nothing new and list the unfinished coverage (targets not visited, checks not run) in the report. Produce a health score labelled partial coverage: the accessibility checks do not run, so Accessibility is `not run`. No detailed issue documentation.\n\n### Regression (`--regression \u003Cbaseline>`)\nRun full mode, then compare with the prior baseline resolved at setup — `prior-baseline.json` in this run's directory, copied from the `--regression` path or the newest earlier run. Diff: which issues are fixed? Which are new? What's the score delta? Append regression section to report.\n\n---\n\n{{include lib\u002Fsnippets\u002Fqa-probe-consent.md}}\n\n{{include lib\u002Fsnippets\u002Fqa-functional.md}}\n\n---\n\n## Workflow\n\n### Phase 1: Initialize\n\n1. Find browse binary (see Setup above)\n2. Create this run's report directory (see Setup above)\n3. Copy report template from `${CLAUDE_SKILL_DIR:-$HOME\u002F.claude\u002Fskills\u002Fqa-only}\u002F..\u002Fqa\u002Ftemplates\u002Fqa-report-template.md` to `$REPORT_DIR`. If the template cannot be read (another host, a partial install), write the report without it: metadata, health score table, Top 3, console health, severity counts, then one entry per issue with severity, category, URL, repro steps and the fields in \"Assemble the report from evidence\".\n4. Start timer for duration tracking\n\n### Phase 2: Authenticate (if needed)\n\n**If the user gave credentials for a throwaway test account on a LOCAL target:**\n\n```bash\nB='\u003CBROWSE_BIN>'\n$B goto \u003Clogin-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\nB='\u003CBROWSE_BIN>'\n$B cookie-import cookies.json\n$B goto \u003Ctarget-url>\n```\n\n**On a NON-LOCAL target:** never type credentials. Ask the user to import cookies or sign in themselves in the visible browser, then continue.\n\n**If 2FA\u002FOTP is required:** Ask the user to complete it in the browser, then continue.\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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B goto \u003Ctarget-url>\n$B snapshot -i -a -o \"$REPORT_DIR\u002Fscreenshots\u002Finitial.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\u002Fdata` 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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B goto \u003Cpage-url>\n$B snapshot -i -a -o \"$REPORT_DIR\u002Fscreenshots\u002Fpage-name.png\"\n$B console --errors\n```\n\nThen follow the **per-page exploration checklist** (see `${CLAUDE_SKILL_DIR:-$HOME\u002F.claude\u002Fskills\u002Fqa-only}\u002F..\u002Fqa\u002Freferences\u002Fissue-taxonomy.md`; the list below stands on its own when that file cannot be read):\n\n1. **Visual scan** — Look at the annotated screenshot for layout issues\n2. **Interactive elements** — Click buttons, links, controls. Do they work? (NON-LOCAL: consent first; never the logout\u002Fdelete link class)\n3. **Forms** — Fill and submit. Test empty, invalid, edge cases (NON-LOCAL: consent first; never the logout\u002Fdelete link class)\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='\u003CBROWSE_BIN>'\n   REPORT_DIR='\u003CREPORT_DIR>'\n   $B viewport 375x812\n   $B screenshot \"$REPORT_DIR\u002Fscreenshots\u002Fpage-mobile.png\"\n   $B viewport 1280x720\n   ```\n8. **Accessibility (manual, mandatory)** — outside quick mode, run the \"Accessibility checks\" in the Health Score Rubric below on every page.\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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B screenshot \"$REPORT_DIR\u002Fscreenshots\u002Fissue-001-step-1.png\"\n$B click @e5\n$B screenshot \"$REPORT_DIR\u002Fscreenshots\u002Fissue-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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B snapshot -i -a -o \"$REPORT_DIR\u002Fscreenshots\u002Fissue-002.png\"\n```\n\n**Write each issue to the report immediately** using the template format from `${CLAUDE_SKILL_DIR:-$HOME\u002F.claude\u002Fskills\u002Fqa-only}\u002F..\u002Fqa\u002Ftemplates\u002Fqa-report-template.md`.\n\n**Proposed regression test (functional and console issues only).** Under the issue, name the test `\u002Fqa` should write to lock the fix in, held to the bar below:\n\n{{include lib\u002Fsnippets\u002Ftest-value-bar.md}}\n\nFrom the browser alone you can answer `protects` (the user-visible behavior) and `fails_when` (the repro). This skill reads source only as rules 5 and 11 allow, never to check coverage, so write `why_new=unchecked` and `seam=unchecked`; `\u002Fqa` answers those before writing the test. Propose nothing for a purely visual or content issue.\n\n### Assemble the report from evidence\n\nBefore Phase 6, rebuild every issue entry from what this run recorded — screenshots, `snapshot -D` diffs, console lines, command output — not from memory of the session:\n\n- **Observed** — one sentence of what happened, in the evidence's own terms: the console message verbatim, the status code, the text on screen.\n- **Expected** — what should have happened, and where that expectation comes from (the PR description, the page's own label, the contract map).\n- **Evidence** — the screenshot paths and the exact output lines that show it.\n- **Confirmation** — `replayed` when rule 2's replay failed the same way; otherwise `observed once`.\n- **Hypothesis** — optional, a guess at the cause from what the browser showed, labelled as a guess and kept out of Observed.\n\nTop 3, the severity summary and any one-line summary quote each issue's Observed sentence verbatim, so no summary states more than its issue entry does. A proposed regression test asserts on the channel the bug was seen on — the console error, the response, the rendered element — because a test on another channel can pass while the bug is still there.\n\nLast, scrub the report: a claim of frequency (\"always\", \"intermittent\", \"3 of 5\") or of a check having run (\"no console errors\", \"all links work\") that no command in this run backs is backed now by running the command, rewritten to what did run, or marked `not run`.\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 `$REPORT_DIR\u002Fbaseline.json` with:\n   ```json\n   {\n     \"date\": \"YYYY-MM-DD\",\n     \"url\": \"\u003Ctarget>\",\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 `$REPORT_DIR\u002Fprior-baseline.json` — never the `baseline.json` this run just wrote, so the run never compares with itself. With `PRIOR_BASELINE: none` or `BASELINE_MISSING`, skip the comparison and say why in the report. Compare:\n- Health score delta — only when both runs scored the same categories; otherwise report the per-category deltas and say which category was `not run`, since a change in what could be checked is not a change in the app\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{{include lib\u002Fsnippets\u002Fqa-health-rubric.md}}\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\u002Fdata` 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\u002FStimulus 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 (`\u002Fwp-json\u002F`)\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\u002Fforward — 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 browser issue needs at least one screenshot; on a functional surface, the probe transcript (command, exit code, output, read-back) is the evidence instead. No exceptions.\n2. **Verify before documenting.** Replay the exact command or interaction from the same starting state (same URL, auth and inputs, after a reload) to confirm it is reproducible, not a fluke. It fails the same way → `replayed`; it does not → the issue stays `observed once`, never confirmed. Never replay a non-idempotent action (a submit, send, purchase or delete) on a non-local target: a reload restores the page, not the server state, so the replay repeats the action. Such an issue stays `observed once`.\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. **Test as a user, not a developer.** The one exception is diff-aware mode: read the branch diff and the route, controller and view files it names only to work out which pages to test. The other is the contract map rule 11 allows on a functional surface. Never read source to explain, diagnose or fix a bug.\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 on a selected browser surface.** When the surface is browser or mixed, open the browser and test — never suggest evals, unit tests, or other alternatives as a substitute, even if the diff appears to have no UI changes. On a functional surface the contract-map probes are the test, and a unit-test run does not replace them either.\n\n---\n\n## Output\n\nWrite the report to both local and project-scoped locations:\n\n**Local:** `$REPORT_DIR\u002Fqa-report.md` — `.vibestack\u002Fqa-reports\u002Frun-\u003CUTC>\u002F{qa-report.md, functional-report.md (functional or mixed surface), baseline.json, prior-baseline.json, screenshots\u002F}`\n\n**Project-scoped:** Write test outcome artifact for cross-session context:\n```bash\neval \"$(\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-slug\" 2>\u002Fdev\u002Fnull)\" 2>\u002Fdev\u002Fnull || SLUG=\"unknown\"\nPROJECT_DIR=\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F${SLUG:-unknown}\"\nmkdir -p \"$PROJECT_DIR\"\n_user=\"$(printf '%s' \"$(id -un 2>\u002Fdev\u002Fnull)\" | tr -c '[:alnum:]-' '-')\"\n[ -n \"$_user\" ] || _user=\"unknown-user\"\n_branch=\"$(printf '%s' \"$(git symbolic-ref --short -q HEAD 2>\u002Fdev\u002Fnull)\" | tr -c '[:alnum:]-' '-')\"\n[ -n \"$_branch\" ] || _branch=\"detached\"\n_base=\"$PROJECT_DIR\u002F${_user}-${_branch}-test-outcome-$(date -u +%Y%m%dT%H%M%SZ)\"\nOUTCOME_FILE=\"$_base.md\"; _n=2\n# Reserve the name (noclobber create), so a run in the same second cannot take it too.\nwhile ! ( set -C; : > \"$OUTCOME_FILE\" ) 2>\u002Fdev\u002Fnull; do\n  [ -e \"$OUTCOME_FILE\" ] || { echo \"ERROR: cannot create $OUTCOME_FILE\" >&2; exit 1; }\n  OUTCOME_FILE=\"$_base-$_n.md\"; _n=$((_n + 1))\ndone\necho \"OUTCOME_FILE: $OUTCOME_FILE\"\n```\nWrite the test outcome to the path printed on the `OUTCOME_FILE:` line.\n\n### Output Structure\n\n```\n.vibestack\u002Fqa-reports\u002F\n└── run-\u003CUTC>\u002F                             # One directory per run, never overwritten\n    ├── qa-report.md                       # Structured report\n    ├── functional-report.md               # Contract-map rows (functional or mixed surface only)\n    ├── baseline.json                      # This run's baseline, for later runs\n    ├── prior-baseline.json                # The baseline this run compares with (if any)\n    └── screenshots\u002F\n        ├── initial.png                    # Landing page annotated screenshot\n        ├── issue-001-step-1.png           # Per-issue evidence\n        ├── issue-001-result.png\n        └── ...\n```\n\n`\u003CUTC>` is the run's start time, e.g. `run-20260312T141500Z`.\n\n---\n\n{{include lib\u002Fsnippets\u002Fcapture-learnings.md}}\n## Additional Rules (qa-only specific)\n\n11. **Never fix bugs.** Find and document only. Do not edit files or suggest fixes in the report, and read source only as rule 5 allows — or, on a functional surface, read-only to build the contract map (entry points, `--help`, handler signatures, existing tests), never to explain or diagnose a bug. Your job is to report what's broken, not to fix it. Use `\u002Fqa` 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 `\u002Fqa` to bootstrap one and enable regression test generation.\"\n","If this session was compacted, the copy of this skill in context may be cut off.\nRead `${CLAUDE_SKILL_DIR}\u002FSKILL.md` from disk and resume at the step you are on.\n\n## When to invoke\n\nUse when asked to \"just report bugs\", \"qa report only\", or \"test but don't fix\". For the full test-fix-verify loop, use \u002Fqa instead.\n\nProactively suggest when the user wants a bug report without any code changes.\n\nVoice triggers (speech-to-text aliases): \"bug report\", \"just check for bugs\".\n\n## Preamble\n\n```bash\neval \"$(\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-slug\" 2>\u002Fdev\u002Fnull)\" 2>\u002Fdev\u002Fnull || SLUG=\"unknown\"\n_LEARN_FILE=\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F${SLUG:-unknown}\u002Flearnings.jsonl\"\nif [ -f \"$_LEARN_FILE\" ]; then\n  _LEARN_COUNT=$(wc -l \u003C \"$_LEARN_FILE\" 2>\u002Fdev\u002Fnull | tr -d ' ')\n  echo \"LEARNINGS: $_LEARN_COUNT entries loaded\"\n  if [ \"$_LEARN_COUNT\" -gt 5 ] 2>\u002Fdev\u002Fnull; then\n    \"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-learnings-search\" --limit 5 2>\u002Fdev\u002Fnull || true\n  fi\nelse\n  echo \"LEARNINGS: none yet\"\nfi\n```\n\n{{include lib\u002Fsnippets\u002Fsession-host.md}}\n\n{{include lib\u002Fsnippets\u002Fdecision-brief.md}}\n\n{{include lib\u002Fsnippets\u002Fworking-protocols.md}}\n\n{{include lib\u002Fsnippets\u002Fstate-protocols.md}}\n\n---\n\n# \u002Fqa-only: Report-Only QA Testing\n\nYou are a QA engineer. Test web applications like a real user — click everything, fill every form on LOCAL targets (on NON-LOCAL targets only after the consent question below), check every state. Produce a structured report with evidence. **NEVER fix anything.**\n\nEvery instruction that follows describes how to observe and record. Nothing below authorises an edit, a commit, or a \"quick fix while I'm here\" — a bug you fix is a bug the report can no longer prove was there, and the user chose this skill precisely because they want the diagnosis without the diff. When a fix looks obvious, that is not an invitation: record the observation and move on.\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:\u002F\u002Fmyapp.com`, `http:\u002F\u002Flocalhost:3000` |\n| Mode | full | `--quick`, `--regression` (compares with the newest earlier run), `--regression \u003Cpath>\u002Fbaseline.json` |\n| Output dir | `.vibestack\u002Fqa-reports\u002F` | `Output to \u002Ftmp\u002Fqa` |\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{{include lib\u002Fsnippets\u002Fbrowse-detect.md}}\n\n{{include lib\u002Fsnippets\u002Fqa-run-dir.md}}\n\nIf `BROWSE_NOT_AVAILABLE`: skip all `$B` commands and use text-only fallbacks (curl, open, direct HTTP checks).\n\n{{include lib\u002Fsnippets\u002Fprior-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 the project dir under `${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F` for recent `*-test-plan-*.md` files for this repo\n   ```bash\n   setopt +o nomatch 2>\u002Fdev\u002Fnull || true  # zsh compat\n   eval \"$(\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-slug\" 2>\u002Fdev\u002Fnull)\"\n   ls -t \"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F$SLUG\u002F\"*-test-plan-*.md 2>\u002Fdev\u002Fnull | head -1\n   ```\n2. **Conversation context:** Check if a prior `\u002Fplan-eng-review` or `\u002Fplan-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{{include lib\u002Fsnippets\u002Fqa-scope.md}}\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 `\u002Fqa` 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\u002Froutes** from the changed files:\n   - Controller\u002Froute files → which URL paths they serve\n   - View\u002Ftemplate\u002Fcomponent files → which pages render them\n   - Model\u002Fservice files → which pages use those models (check controllers that reference them)\n   - CSS\u002Fstyle files → which pages include those stylesheets\n   - API endpoints → test them directly with `$B js \"await fetch('\u002Fapi\u002F...')\"`\n   - Static pages (markdown, HTML) → navigate to them directly\n\n   **If no obvious pages\u002Froutes are identified from the diff:** the change still gets tested — on the surface \"Choosing the surface\" selects. A CLI, library, job or API-only change is a functional surface: follow \"Functional surface\", not a homepage smoke test. When the app has pages that run on the changed backend, config or infrastructure, the surface is mixed: probe the changed behavior functionally, and run Quick mode in the browser (homepage, top 5 navigation targets, console, interactive elements) to verify the app still works.\n\n3. **Detect the running app** — probe common local dev ports for a real HTTP answer (a browse `goto` is not a liveness check: it can exit 0 on a refused connection):\n   ```bash\n   for p in 3000 4000 8080; do curl -sI --max-time 3 \"http:\u002F\u002Flocalhost:$p\" >\u002Fdev\u002Fnull 2>&1 && echo \"APP_PORT: $p\"; done; echo PORT_SCAN_DONE\n   ```\n   Use the port on the first `APP_PORT:` line. No `APP_PORT:` line before `PORT_SCAN_DONE` means no local app is running. If no local app is found, check for a staging\u002Fpreview URL in the PR or environment. If nothing works, ask the user for the URL.\n\n4. **Test each affected page\u002Froute:**\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\u002Froutes 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`)\nSmoke test on a soft 3-minute budget, timed from the first `$B goto`. Visit homepage + top 5 navigation targets. Check: page loads? Console errors? Broken links? At the cap, start nothing new and list the unfinished coverage (targets not visited, checks not run) in the report. Produce a health score labelled partial coverage: the accessibility checks do not run, so Accessibility is `not run`. No detailed issue documentation.\n\n### Regression (`--regression \u003Cbaseline>`)\nRun full mode, then compare with the prior baseline resolved at setup — `prior-baseline.json` in this run's directory, copied from the `--regression` path or the newest earlier run. Diff: which issues are fixed? Which are new? What's the score delta? Append regression section to report.\n\n---\n\n{{include lib\u002Fsnippets\u002Fqa-probe-consent.md}}\n\n{{include lib\u002Fsnippets\u002Fqa-functional.md}}\n\n---\n\n## Workflow\n\n### Phase 1: Initialize\n\n1. Find browse binary (see Setup above)\n2. Create this run's report directory (see Setup above)\n3. Copy report template from `${CLAUDE_SKILL_DIR:-$HOME\u002F.claude\u002Fskills\u002Fqa-only}\u002F..\u002Fqa\u002Ftemplates\u002Fqa-report-template.md` to `$REPORT_DIR`. If the template cannot be read (another host, a partial install), write the report without it: metadata, health score table, Top 3, console health, severity counts, then one entry per issue with severity, category, URL, repro steps and the fields in \"Assemble the report from evidence\".\n4. Start timer for duration tracking\n\n### Phase 2: Authenticate (if needed)\n\n**If the user gave credentials for a throwaway test account on a LOCAL target:**\n\n```bash\nB='\u003CBROWSE_BIN>'\n$B goto \u003Clogin-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\nB='\u003CBROWSE_BIN>'\n$B cookie-import cookies.json\n$B goto \u003Ctarget-url>\n```\n\n**On a NON-LOCAL target:** never type credentials. Ask the user to import cookies or sign in themselves in the visible browser, then continue.\n\n**If 2FA\u002FOTP is required:** Ask the user to complete it in the browser, then continue.\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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B goto \u003Ctarget-url>\n$B snapshot -i -a -o \"$REPORT_DIR\u002Fscreenshots\u002Finitial.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\u002Fdata` 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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B goto \u003Cpage-url>\n$B snapshot -i -a -o \"$REPORT_DIR\u002Fscreenshots\u002Fpage-name.png\"\n$B console --errors\n```\n\nThen follow the **per-page exploration checklist** (see `${CLAUDE_SKILL_DIR:-$HOME\u002F.claude\u002Fskills\u002Fqa-only}\u002F..\u002Fqa\u002Freferences\u002Fissue-taxonomy.md`; the list below stands on its own when that file cannot be read):\n\n1. **Visual scan** — Look at the annotated screenshot for layout issues\n2. **Interactive elements** — Click buttons, links, controls. Do they work? (NON-LOCAL: consent first; never the logout\u002Fdelete link class)\n3. **Forms** — Fill and submit. Test empty, invalid, edge cases (NON-LOCAL: consent first; never the logout\u002Fdelete link class)\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='\u003CBROWSE_BIN>'\n   REPORT_DIR='\u003CREPORT_DIR>'\n   $B viewport 375x812\n   $B screenshot \"$REPORT_DIR\u002Fscreenshots\u002Fpage-mobile.png\"\n   $B viewport 1280x720\n   ```\n8. **Accessibility (manual, mandatory)** — outside quick mode, run the \"Accessibility checks\" in the Health Score Rubric below on every page.\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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B screenshot \"$REPORT_DIR\u002Fscreenshots\u002Fissue-001-step-1.png\"\n$B click @e5\n$B screenshot \"$REPORT_DIR\u002Fscreenshots\u002Fissue-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\nB='\u003CBROWSE_BIN>'\nREPORT_DIR='\u003CREPORT_DIR>'\n$B snapshot -i -a -o \"$REPORT_DIR\u002Fscreenshots\u002Fissue-002.png\"\n```\n\n**Write each issue to the report immediately** using the template format from `${CLAUDE_SKILL_DIR:-$HOME\u002F.claude\u002Fskills\u002Fqa-only}\u002F..\u002Fqa\u002Ftemplates\u002Fqa-report-template.md`.\n\n**Proposed regression test (functional and console issues only).** Under the issue, name the test `\u002Fqa` should write to lock the fix in, held to the bar below:\n\n{{include lib\u002Fsnippets\u002Ftest-value-bar.md}}\n\nFrom the browser alone you can answer `protects` (the user-visible behavior) and `fails_when` (the repro). This skill reads source only as rules 5 and 11 allow, never to check coverage, so write `why_new=unchecked` and `seam=unchecked`; `\u002Fqa` answers those before writing the test. Propose nothing for a purely visual or content issue.\n\n### Assemble the report from evidence\n\nBefore Phase 6, rebuild every issue entry from what this run recorded — screenshots, `snapshot -D` diffs, console lines, command output — not from memory of the session:\n\n- **Observed** — one sentence of what happened, in the evidence's own terms: the console message verbatim, the status code, the text on screen.\n- **Expected** — what should have happened, and where that expectation comes from (the PR description, the page's own label, the contract map).\n- **Evidence** — the screenshot paths and the exact output lines that show it.\n- **Confirmation** — `replayed` when rule 2's replay failed the same way; otherwise `observed once`.\n- **Hypothesis** — optional, a guess at the cause from what the browser showed, labelled as a guess and kept out of Observed.\n\nTop 3, the severity summary and any one-line summary quote each issue's Observed sentence verbatim, so no summary states more than its issue entry does. A proposed regression test asserts on the channel the bug was seen on — the console error, the response, the rendered element — because a test on another channel can pass while the bug is still there.\n\nLast, scrub the report: a claim of frequency (\"always\", \"intermittent\", \"3 of 5\") or of a check having run (\"no console errors\", \"all links work\") that no command in this run backs is backed now by running the command, rewritten to what did run, or marked `not run`.\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 `$REPORT_DIR\u002Fbaseline.json` with:\n   ```json\n   {\n     \"date\": \"YYYY-MM-DD\",\n     \"url\": \"\u003Ctarget>\",\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 `$REPORT_DIR\u002Fprior-baseline.json` — never the `baseline.json` this run just wrote, so the run never compares with itself. With `PRIOR_BASELINE: none` or `BASELINE_MISSING`, skip the comparison and say why in the report. Compare:\n- Health score delta — only when both runs scored the same categories; otherwise report the per-category deltas and say which category was `not run`, since a change in what could be checked is not a change in the app\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{{include lib\u002Fsnippets\u002Fqa-health-rubric.md}}\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\u002Fdata` 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\u002FStimulus 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 (`\u002Fwp-json\u002F`)\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\u002Fforward — 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 browser issue needs at least one screenshot; on a functional surface, the probe transcript (command, exit code, output, read-back) is the evidence instead. No exceptions.\n2. **Verify before documenting.** Replay the exact command or interaction from the same starting state (same URL, auth and inputs, after a reload) to confirm it is reproducible, not a fluke. It fails the same way → `replayed`; it does not → the issue stays `observed once`, never confirmed. Never replay a non-idempotent action (a submit, send, purchase or delete) on a non-local target: a reload restores the page, not the server state, so the replay repeats the action. Such an issue stays `observed once`.\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. **Test as a user, not a developer.** The one exception is diff-aware mode: read the branch diff and the route, controller and view files it names only to work out which pages to test. The other is the contract map rule 11 allows on a functional surface. Never read source to explain, diagnose or fix a bug.\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 on a selected browser surface.** When the surface is browser or mixed, open the browser and test — never suggest evals, unit tests, or other alternatives as a substitute, even if the diff appears to have no UI changes. On a functional surface the contract-map probes are the test, and a unit-test run does not replace them either.\n\n---\n\n## Output\n\nWrite the report to both local and project-scoped locations:\n\n**Local:** `$REPORT_DIR\u002Fqa-report.md` — `.vibestack\u002Fqa-reports\u002Frun-\u003CUTC>\u002F{qa-report.md, functional-report.md (functional or mixed surface), baseline.json, prior-baseline.json, screenshots\u002F}`\n\n**Project-scoped:** Write test outcome artifact for cross-session context:\n```bash\neval \"$(\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fbin\u002Fvibe-slug\" 2>\u002Fdev\u002Fnull)\" 2>\u002Fdev\u002Fnull || SLUG=\"unknown\"\nPROJECT_DIR=\"${VIBESTACK_HOME:-$HOME\u002F.vibestack}\u002Fprojects\u002F${SLUG:-unknown}\"\nmkdir -p \"$PROJECT_DIR\"\n_user=\"$(printf '%s' \"$(id -un 2>\u002Fdev\u002Fnull)\" | tr -c '[:alnum:]-' '-')\"\n[ -n \"$_user\" ] || _user=\"unknown-user\"\n_branch=\"$(printf '%s' \"$(git symbolic-ref --short -q HEAD 2>\u002Fdev\u002Fnull)\" | tr -c '[:alnum:]-' '-')\"\n[ -n \"$_branch\" ] || _branch=\"detached\"\n_base=\"$PROJECT_DIR\u002F${_user}-${_branch}-test-outcome-$(date -u +%Y%m%dT%H%M%SZ)\"\nOUTCOME_FILE=\"$_base.md\"; _n=2\n# Reserve the name (noclobber create), so a run in the same second cannot take it too.\nwhile ! ( set -C; : > \"$OUTCOME_FILE\" ) 2>\u002Fdev\u002Fnull; do\n  [ -e \"$OUTCOME_FILE\" ] || { echo \"ERROR: cannot create $OUTCOME_FILE\" >&2; exit 1; }\n  OUTCOME_FILE=\"$_base-$_n.md\"; _n=$((_n + 1))\ndone\necho \"OUTCOME_FILE: $OUTCOME_FILE\"\n```\nWrite the test outcome to the path printed on the `OUTCOME_FILE:` line.\n\n### Output Structure\n\n```\n.vibestack\u002Fqa-reports\u002F\n└── run-\u003CUTC>\u002F                             # One directory per run, never overwritten\n    ├── qa-report.md                       # Structured report\n    ├── functional-report.md               # Contract-map rows (functional or mixed surface only)\n    ├── baseline.json                      # This run's baseline, for later runs\n    ├── prior-baseline.json                # The baseline this run compares with (if any)\n    └── screenshots\u002F\n        ├── initial.png                    # Landing page annotated screenshot\n        ├── issue-001-step-1.png           # Per-issue evidence\n        ├── issue-001-result.png\n        └── ...\n```\n\n`\u003CUTC>` is the run's start time, e.g. `run-20260312T141500Z`.\n\n---\n\n{{include lib\u002Fsnippets\u002Fcapture-learnings.md}}\n## Additional Rules (qa-only specific)\n\n11. **Never fix bugs.** Find and document only. Do not edit files or suggest fixes in the report, and read source only as rule 5 allows — or, on a functional surface, read-only to build the contract map (entry points, `--help`, handler signatures, existing tests), never to explain or diagnose a bug. Your job is to report what's broken, not to fix it. Use `\u002Fqa` 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 `\u002Fqa` to bootstrap one and enable regression test generation.\"\n",{"name":5,"triggers":60,"description":64,"allowed-tools":65},[61,62,63],"qa report only","just report bugs","test but dont fix","Report-only QA of a web app: health score, screenshots and repro steps for each bug. Never fixes anything.\n",[49,66,67,68,69],"Read","Write","AskUserQuestion","WebSearch","main","777ec643a83c17a0955856b2eb7f596601709fda","skills\u002Fqa-only",0,"https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack","https:\u002F\u002Fgithub.com\u002Ftimurgaleev","https:\u002F\u002Ftgaleev.com\u002F","Forward Deployed Engineer \u002F\r\nAWS Community Builder \u002F Cloud Architect ","2026-11-11 04:50:32",{"source":8,"skillName":5,"commands":80,"prompt":90,"zipAvailable":91},[81,84,87],{"tool":82,"command":83},"npx","npx skills add timurgaleev\u002Fvibestack --skill qa-only",{"tool":85,"command":86},"bunx","bunx skills add timurgaleev\u002Fvibestack --skill qa-only",{"tool":88,"command":89},"pnpm","pnpm dlx skills add timurgaleev\u002Fvibestack --skill qa-only","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Fskills\u002Fqa-only\u002FSKILL.md",true,[],[94,100,106,112,118,124],{"skillNo":95,"name":96,"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":97,"categories":98,"keywords":99,"publishedAt":55},"01M71GVHCCSQCCPVM8XPSPTA73","docs","https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frender\u002F15-backtick-info-string\u002Fskills\u002Fdocs\u002FSKILL.md",[],[96],{"skillNo":101,"name":102,"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":103,"categories":104,"keywords":105,"publishedAt":55},"01M71GVFT1S5MRNM0AYRT2E6VQ","fences","https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frender\u002F14-indented-tilde-fence\u002Fskills\u002Ffences\u002FSKILL.md",[],[102],{"skillNo":107,"name":108,"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":109,"categories":110,"keywords":111,"publishedAt":55},"01M71GVEYB54K1S83FGRNKN8CF","dirty","https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frender\u002F10-check-with-drift\u002Fskills\u002Fdirty\u002FSKILL.md",[],[108],{"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":55},"01M71GVDX9PMND1337C4388DK4","clean","https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frender\u002F09-check-no-drift\u002Fskills\u002Fclean\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":123,"publishedAt":55},"01M71GVC3VM66F1ZQT2G8JXDR0","bare","https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frender\u002F08-no-frontmatter\u002Fskills\u002Fbare\u002FSKILL.md",[],[120],{"skillNo":125,"name":126,"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":127,"categories":128,"keywords":129,"publishedAt":55},"01M71GV9T8DAYZT0PX52QX0TE1","idem","https:\u002F\u002Fgithub.com\u002Ftimurgaleev\u002Fvibestack\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frender\u002F07-idempotent-rerender\u002Fskills\u002Fidem\u002FSKILL.md",[],[126]]