{"id":"84aedbdf-f748-4e37-a6a6-a76fc751b39e","shortId":"RLVgvH","kind":"skill","title":"qa","tagline":"QA verification with Firefox DevTools browser automation — load when a diff touches UI, views, or user-facing flows and needs functional verification before committing","description":"Perform QA verification using Firefox DevTools browser automation.\n\n## Setup\n\n1. **Read `.opencode/context-log.md`** for issue context, acceptance criteria, and components to test\n2. **Detect Port** — Run `source .envrc && echo $PORT`, fall back to 3000\n3. **Verify Server** — curl localhost:PORT before browser automation\n4. **If server not running** — Report clearly and stop\n\n## Session Audit Trail\n\nAt the start of every run:\n\n```bash\nSESSION_DIR=\"/tmp/qa-$(date +%Y%m%d-%H%M%S)\"\nmkdir -p \"$SESSION_DIR\"\n```\n\nAfter **every** browser action (navigate, click, fill, submit), scroll then screenshot:\n\n- Interacted with a specific element → `evaluate_script` with `(el) => el.scrollIntoView({ block: 'center' })`, passing the element's UID as an arg\n- General page-state shot → `evaluate_script` with `() => window.scrollTo(0, 0)`\n\nThen save the screenshot:\n\n```\nscreenshot_page saveTo=\"$SESSION_DIR/001-page-name.png\"\n```\n\nNumber files sequentially (`001-`, `002-`, …). Use a short descriptive slug as the name.\n\nAfter all testing is done, generate and open the HTML report:\n\n```bash\n(cd \"$SESSION_DIR\" && printf '<html><body style=\"font-family:sans-serif\">' > report.html && for f in *.png; do printf '<figure style=\"margin:2em 0\"><img src=\"%s\" style=\"max-width:100%%;border:1px solid #ccc\"><figcaption>%s</figcaption></figure>\\n' \"$f\" \"$f\" >> report.html; done && printf '</body></html>' >> report.html && open report.html)\n```\n\n## Verification\n\nUse firefox-devtools MCP tools. Check project AGENTS.md for selectors/credentials.\n\nVerify the main flow, then edge cases (empty states, errors, boundaries). Screenshot key states. Check tab navigation and focus for accessibility.\n\n## Resilience\n\n- Element not found → try alternative selectors, wait longer, scroll into view\n- Timeout → increase wait time, check if page is still loading\n- Try at least 3 approaches before giving up\n- When truly blocked: report what was verified, what failed, and why\n\n## Output\n\n1. Pass/fail summary with issues found\n2. Session directory path (e.g. `/tmp/qa-20260515-143022/`)\n3. HTML report opened for inspection (all screenshots in sequence)\n4. Steps to reproduce failures","tags":["dotfiles","athal7","agent-skills"],"capabilities":["skill","source-athal7","skill-qa","topic-agent-skills"],"categories":["dotfiles"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/athal7/dotfiles/qa","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add athal7/dotfiles","source_repo":"https://github.com/athal7/dotfiles","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 6 github stars · SKILL.md body (2,160 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:14:35.763Z","embedding":null,"createdAt":"2026-05-18T13:22:31.017Z","updatedAt":"2026-05-18T19:14:35.763Z","lastSeenAt":"2026-05-18T19:14:35.763Z","tsv":"'/tmp/qa-':90 '/tmp/qa-20260515-143022':285 '0':142,143 '001':156 '002':157 '1':36,274 '2':48,280 '3':60,257,286 '3000':59 '4':69,296 'accept':42 'access':231 'action':105 'agents.md':208 'altern':237 'approach':258 'arg':132 'audit':79 'autom':8,34,68 'back':57 'bash':87,177 'block':123,264 'boundari':221 'browser':7,33,67,104 'case':217 'cd':178 'center':124 'check':206,225,248 'clear':75 'click':107 'commit':26 'compon':45 'context':41 'criteria':43 'curl':63 'd':94 'date':91 'descript':161 'detect':49 'devtool':6,32,203 'diff':12 'dir':89,101,180 'dir/001-page-name.png':152 'directori':282 'done':170,194 'e.g':284 'echo':54 'edg':216 'el':121 'el.scrollintoview':122 'element':117,127,233 'empti':218 'envrc':53 'error':220 'evalu':118,138 'everi':85,103 'f':184,191,192 'face':19 'fail':270 'failur':300 'fall':56 'file':154 'fill':108 'firefox':5,31,202 'firefox-devtool':201 'flow':20,214 'focus':229 'found':235,279 'function':23 'general':133 'generat':171 'give':260 'h':95 'html':175,287 'increas':245 'inspect':291 'interact':113 'issu':40,278 'key':223 'least':256 'load':9,253 'localhost':64 'longer':240 'm':93,96 'main':213 'mcp':204 'mkdir':98 'n':190 'name':165 'navig':106,227 'need':22 'number':153 'open':173,197,289 'opencode/context-log.md':38 'output':273 'p':99 'page':135,149,250 'page-st':134 'pass':125 'pass/fail':275 'path':283 'perform':27 'png':186 'port':50,55,65 'printf':181,188,195 'project':207 'qa':1,2,28 'read':37 'report':74,176,265,288 'report.html':182,193,196,198 'reproduc':299 'resili':232 'run':51,73,86 'save':145 'saveto':150 'screenshot':112,147,148,222,293 'script':119,139 'scroll':110,241 'selector':238 'selectors/credentials':210 'sequenc':295 'sequenti':155 'server':62,71 'session':78,88,100,151,179,281 'setup':35 'short':160 'shot':137 'skill' 'skill-qa' 'slug':162 'sourc':52 'source-athal7' 'specif':116 'start':83 'state':136,219,224 'step':297 'still':252 'stop':77 'submit':109 'summari':276 'tab':226 'test':47,168 'time':247 'timeout':244 'tool':205 'topic-agent-skills' 'touch':13 'trail':80 'tri':236,254 'truli':263 'ui':14 'uid':129 'use':30,158,200 'user':18 'user-fac':17 'verif':3,24,29,199 'verifi':61,211,268 'view':15,243 'wait':239,246 'window.scrollto':141 'y':92","prices":[{"id":"d02cac64-f103-4ed8-9963-f4e71b852004","listingId":"84aedbdf-f748-4e37-a6a6-a76fc751b39e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"athal7","category":"dotfiles","install_from":"skills.sh"},"createdAt":"2026-05-18T13:22:31.017Z"}],"sources":[{"listingId":"84aedbdf-f748-4e37-a6a6-a76fc751b39e","source":"github","sourceId":"athal7/dotfiles/qa","sourceUrl":"https://github.com/athal7/dotfiles/tree/main/skills/qa","isPrimary":false,"firstSeenAt":"2026-05-18T13:22:31.017Z","lastSeenAt":"2026-05-18T19:14:35.763Z"}],"details":{"listingId":"84aedbdf-f748-4e37-a6a6-a76fc751b39e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"athal7","slug":"qa","github":{"repo":"athal7/dotfiles","stars":6,"topics":["agent-skills"],"license":null,"html_url":"https://github.com/athal7/dotfiles","pushed_at":"2026-05-18T18:53:57Z","description":null,"skill_md_sha":"6943cd7f7be61bb0df21cc49554739540622a2dc","skill_md_path":"skills/qa/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/athal7/dotfiles/tree/main/skills/qa"},"layout":"multi","source":"github","category":"dotfiles","frontmatter":{"name":"qa","license":"MIT","description":"QA verification with Firefox DevTools browser automation — load when a diff touches UI, views, or user-facing flows and needs functional verification before committing","compatibility":"opencode"},"skills_sh_url":"https://skills.sh/athal7/dotfiles/qa"},"updatedAt":"2026-05-18T19:14:35.763Z"}}