| name | mino-qa |
| description | SwiftUI 피쳐가 끝났을 때 접근성 부여 → 테스트 작성 → 빌드 → 시뮬레이터 실행 → 판정을 순서대로 돌리는 QA 파이프라인. "QA 돌려줘", "피쳐 끝났어 검증해줘", "mino-qa" 요청 시 사용. 별도 UI 테스트 타깃 없이 AXe로 화면을 직접 구동한다. |
| argument-hint | [대상 화면/파일 또는 브랜치] [--unit-only | --ui-only] |
Mino QA 파이프라인
목적
SwiftUI 피쳐가 끝났을 때, 사람이 테스트를 일일이 쓰는 대신 다섯 단계를 순서대로 돌려 QA를 자동화한다.
각 단계는 독립된 에이전트가 맡고, 앞 단계의 산출물이 뒤 단계의 입력이 된다.
화면 작성 끝
│
▼ ① accessibility-auditor 뷰 → accessibilityIdentifier 부여 + 식별자 매니페스트
│
▼ ② test-author 단위테스트(Swift Testing) + AXe UI 시나리오 작성
│
▼ ③ build-runner 빌드 → 시뮬레이터 설치·실행 (실패/대상없음이면 게이트, 시뮬레이터 미가용은 소프트)
│
▼ ④ simulator-qa AXe로 시뮬레이터 실행 + 단계별 스크린샷
│
▼ ⑤ qa-reviewer 스크린샷+테스트 결과 판정 → PR용 QA 리포트
절차
- 대상 확정: 인자로 화면/파일/브랜치를 받는다. 없으면
git diff로 변경된 SwiftUI 뷰를 대상으로 잡는다.
- ① 접근성:
accessibility-auditor를 호출한다. 결과로 식별자 매니페스트를 받는다
(qa/manifests/<Screen>.json으로도 저장됨 — 파이프라인이 끊겨도 이 지점부터 다시 잇는다).
- 게이트: 인터랙션 요소에 식별자가 안 붙으면 여기서 멈추고 보고한다(뒤 단계가 선택자를 못 찾음).
- ② 테스트 작성: 매니페스트를 넘겨
test-author를 호출한다. 단위테스트 + AXe 시나리오를 받는다.
--unit-only면 시나리오를 건너뛴다.
--ui-only면 단위테스트 작성을 건너뛰고 시나리오만 작성한다(③④⑤는 그대로 진행 — UI 검증엔 빌드·실행이 필요하다).
- 게이트:
swift test가 컴파일조차 안 되면 멈추고 보고한다(--ui-only면 이 게이트도 건너뛴다).
- 매니페스트 기계검증(게이트):
python3 scripts/verify_manifest.py <Screen>을 돌려 ①의 식별자가 실제 소스에
반영됐는지·시나리오의 --id가 매니페스트에 있는지 결정론적으로 확인한다(빌드 비용 전에). 위반이면 멈추고 보고한다.
- ③ 빌드:
build-runner를 호출해 빌드·시뮬레이터 설치·실행까지 진행한다.
--unit-only면 이 단계와 이후 전부 건너뛴다.
- 게이트: 빌드 실패·앱 타깃 없음이면 멈추고 보고한다. 빌드는 됐지만 설치·실행(시뮬레이터 미가용 등)까지
못 갔으면 멈추지 않고 다음 단계를 HOLD로 넘긴다.
- ④ 실행:
simulator-qa를 호출한다. 시뮬레이터 미부팅/axe 미설치면 안내하고 멈춘다.
- ⑤ 판정:
qa-reviewer를 호출해 최종 리포트를 받는다.
각 단계는 별도 에이전트 컨텍스트에서 돈다(Agent 툴). 메인 컨텍스트는 산출물 요약만 보유한다.
게이트에 걸리면 멈춘다
이 스킬은 대화형이다. 게이트에 걸리면 남은 단계를 건너뛰지 말고 멈추고 사람에게 보고한다 — 옆에서 사람이
판단·수정해 다시 이을 수 있다는 것이 전제다. 걸린 지점·사유와, 무엇을 고치면 이어갈 수 있는지를 함께 낸다.
호출 맥락 — ios-workflow 의 동작 테스트 단계
이 스킬의 주 호출자는 /ios-workflow 의 동작 테스트 단계다. 그 단계가 프로젝트 프로필의 「동작 테스트 자동화」
슬롯을 보고 이 스킬을 소환한다.
- 입력: 호출자가 넘긴 수동 동작 테스트 시나리오 파일. 시나리오가 이미 주어졌으면 ②단계는 그것을 AXe batch
형식으로 옮기기만 하고 새로 지어내지 않는다.
- 출력: 판정 리포트. 호출자는 PASS 항목을 체크 처리하고 판정 보류·FAIL 항목만 사용자 수동 확인으로 넘긴다.
근거가 부족한 항목을 통과로 밀면 사람 검증까지 통째로 건너뛰게 되므로, 보류는 반드시 보류로 낸다.
- 리포트 경로는 호출자가 지정한다. 지정이 없으면
qa-artifacts/<Screen>-qa-report.md.
단독 호출(/mino-qa <화면>)도 가능하며, 그때는 시나리오를 ②단계가 새로 작성한다.
단계 매핑
| 단계 | 에이전트 | 소환 스킬 |
|---|
| ① 접근성 | accessibility-auditor | swiftui-expert-skill |
| ② 테스트 | test-author | swift-testing-expert, swift-concurrency |
| ③ 빌드 | build-runner | — (xcodebuild/simctl) |
| ④ 실행 | simulator-qa | axe |
| ⑤ 판정 | qa-reviewer | — (시각 판단) |
한계 (반드시 인지)
- 한글 입력 불가: AXe
type은 US 키보드 문자만 지원한다. 한글 입력 흐름은 시드 데이터로 우회하거나 시나리오에서 제외한다.
- 접근성 트리 의존: 식별자가 안 붙은 화면은 선택자로 못 찾는다. ①이 선행되지 않으면 ④가 무력하다.
- 네트워크 타이밍: AXe HID 명령은 fire-and-forget이라 "처리 완료"를 보장하지 않는다.
--wait-timeout 폴링과 스크린샷 검증으로 보완하되, 그래도 모호하면 qa-reviewer가 "판정 보류"로 분리한다.
- fire-and-forget: 탭이 뷰가 인터랙티브해지기 전이나 전환 중에 떨어질 수 있다. 결과는 항상
describe-ui/screenshot로 따로 검증한다.
- 접근성 게이트는 개수만 본다: ①의 게이트는 식별자 총 개수가 0보다 큰지만 확인한다 — 화면의 인터랙션 요소 중
일부가 식별자 없이 빠져도 게이트는 통과한다. 요소별 완전 커버리지 검사는 하지 않는다.
산출물
- 수정된 뷰(식별자 부여) /
qa/manifests/*.json / 단위테스트 / qa/scenarios/*.txt / 빌드·설치 결과 / qa-artifacts/*.png / QA 판정 리포트