1Password에 저장한 비밀번호와 API 키를 명령과 설정 템플릿에 사용합니다. CLI 설치와 인증부터 비밀 값 조회 및 환경 변수 전달까지 안내합니다.
- 1Password CLI 설치와 설정
- 저장된 API 키로 명령 실행
- 설정 템플릿에 비밀 값 삽입
브라우저에서 웹 앱을 직접 조작해 폼, 화면 이동, 레이아웃 문제와 JavaScript 오류를 확인합니다. 재현 절차와 스크린샷을 담아 심각도와 유형별로 보고서를 작성합니다.
Exploratory QA of web apps: find bugs, evidence, reports.
웹 앱을 직접 조작하며 문제를 찾고 증거가 포함된 보고서를 작성합니다. 테스트할 페이지와 기능을 계획하고 링크, 버튼, 폼, 키보드 조작, 화면 이동을 확인합니다. 정상 입력뿐 아니라 잘못된 값과 빈 값도 시도하며 레이아웃 문제와 JavaScript 오류를 살펴봅니다. 발견한 문제는 중복을 정리하고 심각도와 유형을 지정해 report.md에 모읍니다.
출시 전에 사용자의 조작 흐름을 따라 앱을 점검하거나, 개발 담당자가 재현할 수 있는 형태로 문제를 전달할 때 유용합니다. 전체 사이트를 확인하거나 로그인과 검색 같은 특정 기능에 집중할 수 있습니다. 보고서에는 확인한 범위와 미확인 부분, 테스트를 막은 사유도 기록합니다.
페이지 이동, 클릭, 텍스트 입력, 스크린샷 촬영, 콘솔 확인 등을 지원하는 브라우저 도구가 필요합니다. 대상 URL과 테스트 범위를 지정해야 합니다. 출력 위치를 생략하면 이미지와 보고서를 ./dogfood-output에 저장합니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용만을 근거로 4가지 관점에서 판정했습니다. 스타 수나 인기도는 판정에 넣지 않았습니다.
총점은 각 항목을 A=25점, B=15점, C=5점으로 더한 값입니다. 2026년 10월 20일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
This skill guides you through systematic exploratory QA testing of web applications with browser_exec. You will navigate the application, interact with elements, capture evidence of issues, and produce a structured bug report.
browser toolset must be enabled (browser_exec). browser_exec runs Python with pre-imported helpers (new_tab, goto_url, wait_for_load, page_info, js, fill_input, click_at_xy, capture_screenshot, cdp); browser state persists across calls, Python variables do not.The user provides:
./dogfood-output)Follow this 5-phase systematic workflow:
{output_dir}/
├── screenshots/ # Evidence screenshots
└── report.md # Final report (generated in Phase 5)
Batch each step's actions into one browser_exec call. For each page or feature in your plan:
Navigate with a console hook installed. Register the hook on the tab before navigating so errors thrown during page load are captured too:
# Open page with console-error capture
HOOK = """window.__qa_errors = [];
const _e = console.error;
console.error = (...a) => { window.__qa_errors.push(a.map(String).join(' ')); _e(...a); };
addEventListener('error', e => window.__qa_errors.push('uncaught: ' + e.message));
addEventListener('unhandledrejection', e => window.__qa_errors.push('rejection: ' + String(e.reason)));"""
new_tab('about:blank') # first call only: the hook binds to the current tab
cdp('Page.addScriptToEvaluateOnNewDocument', source=HOOK)
goto_url("https://example.com/page")
wait_for_load()
print(page_info())
print(js('window.__qa_errors || []'))
Re-register the hook at the start of any later call that navigates. Silent JS errors are high-value findings.
Read the page structure — list visible interactive elements with their viewport centres (use cdp('Accessibility.getFullAXTree') and filter in Python when you need roles/names):
# List interactive elements
print(js("""(() => [...document.querySelectorAll('a,button,input,select,textarea,[role=button]')]
.filter(e => e.offsetParent).slice(0, 80).map((e, i) => { const r = e.getBoundingClientRect();
return {i, tag: e.tagName, text: (e.innerText || e.value || e.getAttribute('aria-label') || '').trim().slice(0, 60),
id: e.id, name: e.name, x: Math.round(r.x + r.width / 2), y: Math.round(r.y + r.height / 2)}; }))()"""))
Visually assess the page: call capture_screenshot() and inspect the attached image for layout issues, broken elements, or accessibility concerns. If your model cannot view images, pass the printed path to vision_analyze.
Test interactive elements systematically:
js("document.querySelector('#submit').click()"), or click_at_xy(x, y) with a centre from step 2fill_input('input[name=email]', 'test input')cdp('Input.dispatchKeyEvent', type='keyDown', key='Tab', code='Tab', windowsVirtualKeyCode=9) followed by the matching keyUp, then js('document.activeElement.outerHTML.slice(0, 200)') to see where focus landed; same pattern with key='Enter', code='Enter', windowsVirtualKeyCode=13js('window.scrollBy(0, 800)')js('history.back()'), then wait_for_load()After each interaction, in the same call, check for:
print(js('window.__qa_errors || []'))capture_screenshot() and compare with the previous onepage_info(), or js() reading the relevant element)For every issue found:
Take a screenshot showing the issue: capture_screenshot() prints the saved path. Copy it to {output_dir}/screenshots/ under a descriptive name (e.g. issue-03-broken-login.png) — you will reference it in the report.
Record the details:
Classify the issue using the issue taxonomy (see references/issue-taxonomy.md):
Generate the final report using the template at templates/dogfood-report-template.md.
The report must include:
MEDIA:<screenshot_path> for inline images)Save the report to {output_dir}/report.md.
All browser actions are browser_exec calls; these are the helpers and idioms used above.
| Action | browser_exec idiom |
|---|---|
| Go to a URL | new_tab(url) once (or new_tab('about:blank') before registering the hook), then goto_url(url); follow with wait_for_load() |
| Page state | page_info() |
| DOM / accessibility tree | js(...) extraction, or cdp('Accessibility.getFullAXTree') filtered in Python |
| Click | js("document.querySelector(sel).click()") or click_at_xy(x, y) |
| Type into an input | fill_input(selector, text) |
| Scroll | js('window.scrollBy(0, 800)') |
| Go back | js('history.back()') |
| Press a key | cdp('Input.dispatchKeyEvent', type='keyDown', key=..., code=..., windowsVirtualKeyCode=...) + keyUp |
| Screenshot | capture_screenshot() (image attached to the result; text-only models use vision_analyze on the path) |
| JS console errors | hook via cdp('Page.addScriptToEvaluateOnNewDocument', source=HOOK), read with `js('window.__qa_errors |
window.__qa_errors after navigating and after significant interactions. Silent JS errors are among the most valuable findings.browser_exec call (navigate, wait, extract, act, check errors) — fewer round-trips, and the hook stays in place.capture_screenshot() when you need to reason about element positions or when DOM extraction is ambiguous; click_at_xy takes the centres from the element listing.MEDIA:<screenshot_path> so they can see the evidence inline.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
1Password에 저장한 비밀번호와 API 키를 명령과 설정 템플릿에 사용합니다. CLI 설치와 인증부터 비밀 값 조회 및 환경 변수 전달까지 안내합니다.
손익계산서·재무상태표·현금흐름표를 수식으로 연결한 Excel 모델을 만듭니다. 실적과 예측 가정을 입력하고 시나리오를 비교하며 세 재무제표의 일관성을 단계별로 확인합니다.
기존 PyTorch 학습 코드를 적은 수정으로 여러 GPU나 컴퓨터에 맞게 구성합니다. 혼합 정밀도, 메모리 절약 설정과 학습 실행 방법을 안내합니다.
Hermes에서 Actual Computer로 자신의 기기에 AI 모델을 실행하도록 연결을 설정합니다. 중계 서비스와 로컬 연결, 모델 선택, 응답 확인 및 오류 점검을 다룹니다.
기술에 익숙하지 않고 쉽게 불만을 느끼는 사용자로 앱을 시험합니다. 혼란스러운 조작과 이탈 원인을 찾고, 개선 과제와 개인적 불만을 나눠 수정안을 정리합니다.
두 에이전트가 각각 수정한 브랜치의 Git 충돌을 양쪽 변경 내용과 의도에 따라 중립적으로 해결합니다. 충돌별 판단 이유를 기록하고 빌드나 테스트로 통합 결과를 확인합니다.