| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /feature-qa |
| Aliases | /qa, /quality-check |
| Category | kobic-development |
| Complexity | moderate |
/feature-qa โ ๊ธฐ๋ฅ ํ์ง ๊ฑด๊ฐ๊ฒ์ง#
ํ๋ง๋๋ก#
์์ฑํ ๊ธฐ๋ฅ์ ๊ฑด๊ฐ๊ฒ์งํ๋ฏ 5๊ฐ ํญ๋ชฉ์ผ๋ก ์ ์ ๋งค๊ธฐ๊ณ A~F ๋ฑ๊ธ์ ๋งค๊ธฐ๋ ๋๊ตฌ์ ๋๋ค. ์ง๋๋ฒ ์ ์์ ๋น๊ตํด์ "์์ ๋ณด๋ค ๋๋น ์ง ๊ณณ"์ด ์๋์ง๋ ์๋ ค์ค๋๋ค.
๋๊ฐยท์ธ์ ์ฐ๋์#
- ๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ฅ์ ๋ค ๋ง๋ ์งํ ํ์ง์ด ๊ด์ฐฎ์์ง ํ์ธํ๊ณ ์ถ์ ๋
- PR(์ฝ๋ ์ ์ถ)์ ์ฌ๋ฆฌ๊ธฐ ์ ๋ง์ง๋ง ์ ๊ฒ(ํ์ง ๊ฒ์ดํธ)์ผ๋ก
- ์ด๋ฏธ ์๋ ๊ธฐ๋ฅ์ด ์์ ๋ณด๋ค ๋๋น ์ง์ง ์์๋์ง ๋ค์ ํ์ธํ๊ณ ์ถ์ ๋
๋ฌด์์ ํด์ฃผ๋์#
-
๊ธฐ๋ฅ์ 5๊ฐ์ง ๊ด์ ์ผ๋ก ์ฑ์ ํด 100์ ๋ง์ ์ ์์ A~F ๋ฑ๊ธ์ ์ค๋๋ค.
- ๊ธฐ๋ฅ ์์ฑ๋(30%), ํ๋ฉด/UX(20%), ์ ๊ทผ์ฑ(20%), ์ฑ๋ฅ(15%), ๋ค๊ตญ์ด(15%)
- ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ๋ณด์ด๋ ์ ์ํ(๋ง๋๊ทธ๋ํ) ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ , ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๋ฅผ ํ๋ก ์ ๋ฆฌํฉ๋๋ค.
- ์ฑ์ ๊ฒฐ๊ณผ๋ฅผ
.qa-baseline/{๊ธฐ๋ฅ์ด๋ฆ}.jsonํ์ผ์ ์๋ ์ ์ฅํด ๊ธฐ์ค์ (baseline) ์ผ๋ก ์ผ์ต๋๋ค. - ๋ค์๋ฒ ๊ฒ์ฌ ๋ ์ด ๊ธฐ์ค์ ๊ณผ ๋น๊ตํด ์ข์์ก๋์งยท๋๋น ์ก๋์ง(ํ๊ท) ๋ฆฌํฌํธ๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
์ด๋ป๊ฒ ์ฐ๋์#
# ๊ธฐ๋ณธ: ๊ธฐ๋ฅ ํด๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด ๊ฒ์ฌ
/feature-qa feature/auth/
# ์ง๋๋ฒ ๊ธฐ์ค์ ๊ณผ ๋น๊ต (์ข์์ก๋ ๋๋น ์ก๋)
/feature-qa feature/auth/ --regression
# ๋น ๋ฅธ ์ ๊ฒ (๊ธฐ๋ฅ ์์ฑ๋๋ง)
/feature-qa feature/auth/ --quick
# ํน์ ํญ๋ชฉ๋ง ์ง์ค ๊ฒ์ฌ
/feature-qa feature/auth/ --focus ui,a11y
# 5๊ฐ ํญ๋ชฉ ๋์ ๊ฒ์ฌ (Agent Teams ํ์, ๋ ๋น ๋ฆ)
/feature-qa feature/auth/ --parallel
- ๋งจ ์์ ๊ธฐ๋ฅ ๊ฒฝ๋ก(
feature/auth/๋ฑ)๋ ๋ฐ๋์ ํ์ํฉ๋๋ค. -
--focus์ ๋ฃ์ ์ ์๋ ํญ๋ชฉ:ui(ํ๋ฉด),a11y(์ ๊ทผ์ฑ),perf(์ฑ๋ฅ),i18n(๋ค๊ตญ์ด),func(๊ธฐ๋ฅ). - ๊ธฐ์ค์ ์ ์ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋์
๋๋ค. ์ ์ฅํ์ง ์์ผ๋ ค๋ฉด
--no-save๋ฅผ ๋ถ์ด์ธ์.
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
- ์ง์ ํ ๊ธฐ๋ฅ์ 5๊ฐ ๊ด์ ์ผ๋ก ์ฑ์ ํฉ๋๋ค โ ๊ธฐ๋ฅ ์์ฑ๋, ํ๋ฉด/UX, ์ ๊ทผ์ฑ, ์ฑ๋ฅ, ๋ค๊ตญ์ด.
- ๊ฐ ํญ๋ชฉ ์ ์์ ๋น์ค์ ๊ณฑํด ๋ํ๊ณ , ์ฌ๊ฐํ ๋ฌธ์ 1๊ฑด๋น 10์ ์ฉ ๊น์ ์ด์ ๊ณผ ๋ฑ๊ธ(A~F) ์ ๊ณ์ฐํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ฅผ ์ ์ํ๊ณผ ๋ฌธ์ ๋ชฉ๋ก์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ ,
.qa-baseline/ํด๋์ ๊ธฐ์ค์ ํ์ผ๋ก ์ ์ฅํฉ๋๋ค. --regression์ ์ฐ๋ฉด ์ ์ฅ๋ผ ์๋ ์ง๋ ๊ธฐ์ค์ ๊ณผ ๋น๊ตํด ํญ๋ชฉ๋ณ ์ฆ๊ฐ ๋ฆฌํฌํธ๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.--parallel์ ์ฐ๋ฉด ํญ๋ชฉ๋ค์ ์ฌ๋ฌ ํ์ด ๋์์ ๊ฒ์ฌํด ๋ ๋น ๋ฅด๊ฒ ๋๋ ๋๋ค. (๋ถ๊ฐ๋ฅํ๋ฉด ์๋์ผ๋ก ์์ฐจ ๊ฒ์ฌ๋ก ์ ํ)
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Triggers#
- After feature implementation for quality verification
- As a quality gate before PR creation
- To check quality regression of existing features
Usage#
# Basic usage: QA by feature path
/feature-qa feature/auth/
# Regression comparison (against previous baseline)
/feature-qa feature/auth/ --regression
# Quick check (functional completeness only)
/feature-qa feature/auth/ --quick
# Specific axis only
/feature-qa feature/auth/ --focus ui,a11y
# Parallel evaluation (Agent Teams)
/feature-qa feature/auth/ --parallelParameters#
| Parameter | Required | Description | Example |
|---|---|---|---|
feature_path | โ | Feature module path | feature/auth/ |
--regression | โ | Compare against previous baseline | |
--quick | โ | Quick check (functional completeness only) | |
--focus | โ | Focus on specific axes | ui, a11y, perf, i18n, func |
--parallel | โ | 5-axis parallel evaluation (requires Agent Teams) | |
--save-baseline | โ | Save baseline (default: auto-save) | |
--no-save | โ | Do not save baseline |
5-Axis Evaluation System#
Functional Completeness โ Weight 30%#
| Item | Points | Inspection Method |
|---|---|---|
| Acceptance Criteria met | 30 | Map issue AC to implementation code |
| Edge case handling | 25 | Check null/empty/boundary handling |
| Error handling | 25 | try-catch, ErrorState, user messages |
| Test coverage | 20 | UseCase 100%, BLoC 80%+ target |
Inspection Items:
- Are all ACs mapped to implementation code
- Is null safety handled properly
- Is there user feedback on network errors
- Is empty list state (EmptyState) handled
- Is loading state displayed
UI/UX (Visual) โ Weight 20%#
| Item | Points | Inspection Method |
|---|---|---|
| Correct CoUI component usage | 30 | Verify component API compliance |
| Layout consistency | 25 | Gap/Insets constants used, alignment |
| Color system compliance | 25 | appColors/colorScheme used |
| Typography compliance | 20 | context.textStyles used |
Inspection Items:
- Are CoUI component APIs used correctly (features parameter, etc.)
- Are Gap/Insets constants used (no hardcoded values)
- Are colors accessed via context.appColors / context.colorScheme
- Are text styles accessed via context.textStyles
- Are non-existent APIs like ButtonSize.medium not used
Accessibility โ Weight 20%#
| Item | Points | Inspection Method |
|---|---|---|
| Semantic Labels | 35 | Labels present on images, icons, buttons |
| Touch target size | 30 | Minimum 48x48 verified |
| Color contrast | 20 | WCAG AA criteria |
| Screen reader order | 15 | Logical tab order |
Inspection Items:
- Do Image/Icon have semanticLabel
- Are touchable elements at least 48x48
- Is text-background color contrast 4.5:1 or above
- Are widgets arranged in a meaningful order
Performance โ Weight 15%#
| Item | Points | Inspection Method |
|---|---|---|
| const widget usage | 30 | Check const-eligible widgets |
| BlocBuilder optimization | 25 | buildWhen/listenWhen usage |
| Image optimization | 25 | cacheWidth/cacheHeight applied |
| Resource cleanup | 20 | dispose/cancel verified |
Inspection Items:
- Are const-eligible widgets declared as const
- Is buildWhen applied to BlocBuilder
- Do network images have cacheWidth/cacheHeight
- Are Stream subscriptions cancelled in dispose
- Is BLoC isClosed checked in async handlers
Internationalization (i18n) โ Weight 15%#
| Item | Points | Inspection Method |
|---|---|---|
| Translation key usage | 40 | context.t.* pattern used |
| No hardcoded strings | 30 | UI text hardcoding detection |
| Pluralization handling | 15 | plural/ordinal applied |
| Dynamic value parameterization | 15 | Parameters instead of string interpolation |
Inspection Items:
- Do all UI texts use context.t.*
- Are there no hardcoded Korean/English strings
- Is pluralization handled for texts containing numbers
- Are dynamic values passed as parameters
Health Score Calculation#
Score Computation#
Total = Sum(each axis score x weight) - (Critical issue count x 10)
Each axis score = Sum(item scores) / 100 x 100Grade Criteria#
| Grade | Score Range | Meaning |
|---|---|---|
| A | 90-100 | Excellent โ production ready |
| B | 80-89 | Good โ minor improvements needed |
| C | 70-79 | Average โ improvements recommended |
| D | 60-69 | Insufficient โ improvements required |
| F | 0-59 | Poor โ must fix before PR creation |
Baseline Storage and Regression Comparison#
Baseline Storage#
Automatically saved to .qa-baseline/{feature-name}.json on QA execution:
{
" feature " : " auth " ,
" date " : " 2026-03-13T10:30:00Z " ,
" grade " : " B " ,
" totalScore " : 85,
" scores " : {
" functional " : { " score " : 90, " weight " : 0.30, " weighted " : 27.0 },
" visual " : { " score " : 80, " weight " : 0.20, " weighted " : 16.0 },
" accessibility " : { " score " : 75, " weight " : 0.20, " weighted " : 15.0 },
" performance " : { " score " : 85, " weight " : 0.15, " weighted " : 12.75 },
" i18n " : { " score " : 90, " weight " : 0.15, " weighted " : 13.5 }
},
" criticalIssues " : 0,
" penalty " : 0,
" issues " : [
{
" axis " : " accessibility " ,
" severity " : " warning " ,
" message " : " semantic label missing " ,
" file " : " lib/src/presentation/widget/author_card.dart " ,
" line " : 42
}
]
}Regression Comparison#
When using the --regression option, compares against the previous baseline:
## Regression Report: auth
| Axis | Previous | Current | Change |
|------|----------|---------|--------|
| Functional Completeness | 90 | 92 | โ
+2 |
| UI/UX | 80 | 80 | โก๏ธ 0 |
| Accessibility | 75 | 70 | โ ๏ธ -5 |
| Performance | 85 | 88 | โ
+3 |
| i18n | 90 | 90 | โก๏ธ 0 |
| **Total** | **85 (B)** | **84 (B)** | โ ๏ธ -1 |
### Regression Items (score decrease)
- โฟ Accessibility -5 points: semanticLabel missing on newly added ProfileImageOutput Format#
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Feature QA Health Score: auth โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฃ
โ โ
โ Grade: B (85/100) โ
โ โ
โ ๐งช Functional โโโโโโโโโโโโโโโโโโโโโโ 90/100 (ร0.30 = 27.0) โ
โ ๐จ UI/UX โโโโโโโโโโโโโโโโโโโโโโ 80/100 (ร0.20 = 16.0) โ
โ โฟ Accessibility โโโโโโโโโโโโโโโโโโโโโโ 75/100 (ร0.20 = 15.0) โ
โ โก Performance โโโโโโโโโโโโโโโโโโโโโโ 85/100 (ร0.15 = 12.8) โ
โ ๐ i18n โโโโโโโโโโโโโโโโโโโโโโ 90/100 (ร0.15 = 13.5) โ
โ โ
โ Critical: 0 items | Penalty: 0 points โ
โ Baseline: Saved (.qa-baseline/auth.json) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
### Issues Found (5 items)
| # | Axis | Severity | Issue | File |
|---|------|----------|-------|------|
| 1 | โฟ Accessibility | โ ๏ธ | semantic label missing | author_card.dart:42 |
| 2 | โก Performance | โ ๏ธ | cacheWidth not specified | author_image.dart:15 |
| 3 | ๐ i18n | ๐ก | hardcoded string | author_list_page.dart:28 |
| 4 | ๐จ UI/UX | ๐ก | SizedBox used instead of Gap | author_form.dart:55 |
| 5 | ๐งช Functional | ๐ก | EmptyState not handled | author_list_bloc.dart:30 |Parallel Evaluation (--parallel, Agent Teams)#
Prerequisites#
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1environment variable set- If Agent Teams unavailable, automatically falls back to sequential evaluation
Parallel Execution Flow#
When --parallel option is used:
1. Check Agent Teams availability
helpers.md#Check-Agent-Teams-Available
โ Falls back to sequential evaluation if unavailable
2. 3-team parallel evaluation (3 Teammates)
โโ Teammate 1: Functional Completeness (30%)
โ โโ Acceptance Criteria met
โ โโ Edge case handling
โ โโ Error handling
โ โโ Test coverage
โ
โโ Teammate 2: UI/UX (20%) + Accessibility (20%)
โ โโ Correct CoUI component usage
โ โโ Layout/color/typography consistency
โ โโ Semantic Labels
โ โโ Touch target size
โ โโ Color contrast
โ
โโ Teammate 3: Performance (15%) + i18n (15%)
โโ const widgets / BlocBuilder optimization
โโ Image optimization / resource cleanup
โโ Translation key usage
โโ Hardcoded string detection
3. Lead merges results
โโ helpers.md#Collect-Team-Results
โโ Sum each axis score and apply weights
โโ Critical issue count x 10 point penalty
โโ Final grade calculation (A~F)Fallback (Sequential Evaluation)#
If Agent Teams unavailable, runs 5-axis sequential evaluation as before.
Automation#
# Run tests (for coverage verification)
melos run test:with-html-coverage -- --scope= " *auth* "
# Static analysis
melos run analyze -- --scope= " *auth* "
# Code review (detailed)
/code-review feature/auth/ --gate-modeRelated Commands#
/code-review- 8-category code review/checklist:feature-complete- Feature complete checklist/dev:run- Full development cycle (can be auto-invoked at Step 8.7)