TASK 병렬 추출
Cursor, Antigravity, Claude Code, OpenAI Codex, Gemini CLI
# Target Task
- 전체 TASK 리스트 @TASKS/06_TASK_LIST_v1.md 와 @TASKS 경로 아래의
상세 태스크 명세서 파일들을 확인하여 현재 이미 생성된 TASK 상세 명세서 파일이 없는,
즉, 아직 추출되지 않은 TASK들에 대하여 5개에서 10개 사이의 적절한 개수로
한번에 연속으로 추출할 타겟 TASK 작업 단위를 정하여 각각에 대한 상세 명세서를 작성합니다.
- 반드시 작업 대상이 될 TASK 하나당 하나의 빈 마크다운 파일을 먼저 생성한 후에, 각 파일에 구체적인 TASK 문서 내용 작성을 시작해야 합니다.
- 만약 빈 파일이 생성되어 있다면, 해당 파일은 다른 에이전트가 작업 중이므로 건드려서는 안됩니다.
<aside> 💡
Q. 에이전트 간 충돌 방지하려면 TASK 번호를 미리 썰어두는게 좋지 않을까요?
A. 네, 미리 대상 TASK 를 여러 조각으로 썰어놔도 좋습니다.
다만, 저는 여러가지 모델을 테스트하며 진행했기 때문에 미리 썰어두지 않았습니다.
각 모델이 스스로 작업 범위를 결정하게 하면 해당 모델의 성능에 가장 바람직할 것이라는 가설과 모델 별 작업 사이즈 패턴을 확인하기 위해 동적으로 작업했고, 작은 모델들이 확실히 더 적은 양과 복잡도의 TASK를 가져가는 것을 확인했습니다.
</aside>
추출된 TASK 전체 검토
검수 — 이미 작성된 TASK 파일 중 품질이 부족한 파일을 식별·보강해줘
TASK 지정 검토 (Gemini 3 Flash 모델로 추출한 태스크들에 대해 Opus 4.7 Extra High 로 검토 수행)
아래 7개 TASK 들의 내용이 적절하고 충분한지 검토해줘
1. COM-C-004: 제휴 링크 클릭 이벤트 Mixpanel 추적
2. COM-C-005: 카카오 공유 이벤트 Mixpanel 추적
3. COM-RH-001: Search Route Handler 통합 조립
4. F2-C-005: 뱃지 캐싱 로직 구현 (Next.js Cache)
5. F2-RH-001: Badge Route Handler 통합 조립
6. F4-C-005: 제보 보상(포인트/배지) 지급 로직 구현
7. TEST-F1-006: Super-Calc API 엔드포인트 E2E 흐름 테스트

⇒ 단순비교할 경우 Gemini 3 Flash 가 Opus 4.7 Extra High 에 비해 약 30% 이상 뒤쳐지는 성능으로 확인
보강 진행
[전면 검토 프롬프팅 및 제안 내용 수신]
보강 제안 우선순위 1, 2, 3 전부 진행해줘
최종 추출된 TASK 명세를 기반으로 TASK간 의존성그래프(상세) 작성
개별 TASK 단위로 노드를 표현하는 의존성 상세 다이어그램을 그려줘
Commit & Push
https://github.com/wild-mental/SRS-from-PRD-HealthProdInfo/commit/922b2ddf4bee738b7242b024bfa65477aacb89eb
flowchart TB
subgraph P0["Phase 0 — 인프라 스캐폴딩"]
direction TB
DATA_001["DATA-001"]
end
subgraph P1["Phase 1 — 데이터·계약 (SSOT)"]
direction TB
API_001["API-001"]
API_002["API-002"]
API_003["API-003"]
API_004["API-004"]
API_005["API-005"]
API_006["API-006"]
API_007["API-007"]
API_008["API-008"]
DATA_002["DATA-002"]
DATA_003["DATA-003"]
DATA_004["DATA-004"]
DATA_005["DATA-005"]
DATA_006["DATA-006"]
DATA_007["DATA-007"]
DATA_008["DATA-008"]
DATA_009["DATA-009"]
DATA_010["DATA-010"]
DATA_011["DATA-011"]
DATA_012["DATA-012"]
MOCK_001["MOCK-001"]
MOCK_002["MOCK-002"]
MOCK_003["MOCK-003"]
MOCK_004["MOCK-004"]
MOCK_005["MOCK-005"]
MOCK_006["MOCK-006"]
end
subgraph P2["Phase 2 — 핵심 로직 (CQRS)"]
direction TB
ADM_C_001["ADM-C-001"]
ADM_C_002["ADM-C-002"]
ADM_Q_001["ADM-Q-001"]
ADM_Q_002["ADM-Q-002"]
COM_C_001["COM-C-001"]
COM_C_002["COM-C-002"]
COM_C_003["COM-C-003"]
COM_C_004["COM-C-004"]
COM_C_005["COM-C-005"]
COM_Q_001["COM-Q-001"]
COM_Q_002["COM-Q-002"]
COM_RH_001["COM-RH-001"]
CRON_001["CRON-001"]
F1_C_001["F1-C-001"]
F1_C_002["F1-C-002"]
F1_C_003["F1-C-003"]
F1_C_004["F1-C-004"]
F1_Q_001["F1-Q-001"]
F1_Q_002["F1-Q-002"]
F1_RH_001["F1-RH-001"]
F2_C_001["F2-C-001"]
F2_C_002["F2-C-002"]
F2_C_003["F2-C-003"]
F2_C_004["F2-C-004"]
F2_C_005["F2-C-005"]
F2_Q_001["F2-Q-001"]
F2_Q_002["F2-Q-002"]
F2_RH_001["F2-RH-001"]
F3_C_001["F3-C-001"]
F3_C_002["F3-C-002"]
F3_C_003["F3-C-003"]
F3_Q_001["F3-Q-001"]
F4_C_001["F4-C-001"]
F4_C_002["F4-C-002"]
F4_C_003["F4-C-003"]
F4_C_004["F4-C-004"]
F4_C_005["F4-C-005"]
F4_Q_001["F4-Q-001"]
F4_Q_002["F4-Q-002"]
end
subgraph P3["Phase 3 — 테스트 자동화"]
direction TB
TEST_COM_001["TEST-COM-001"]
TEST_COM_002["TEST-COM-002"]
TEST_COM_003["TEST-COM-003"]
TEST_F1_001["TEST-F1-001"]
TEST_F1_002["TEST-F1-002"]
TEST_F1_003["TEST-F1-003"]
TEST_F1_004["TEST-F1-004"]
TEST_F1_005["TEST-F1-005"]
TEST_F1_006["TEST-F1-006"]
TEST_F2_001["TEST-F2-001"]
TEST_F2_002["TEST-F2-002"]
TEST_F2_003["TEST-F2-003"]
TEST_F2_004["TEST-F2-004"]
TEST_F2_005["TEST-F2-005"]
TEST_F2_006["TEST-F2-006"]
TEST_F3_001["TEST-F3-001"]
TEST_F3_002["TEST-F3-002"]
TEST_F3_003["TEST-F3-003"]
TEST_F4_001["TEST-F4-001"]
TEST_F4_002["TEST-F4-002"]
TEST_F4_003["TEST-F4-003"]
TEST_F4_004["TEST-F4-004"]
TEST_F4_005["TEST-F4-005"]
TEST_F4_006["TEST-F4-006"]
end
subgraph P4["Phase 4 — 비기능·인프라·보안"]
direction TB
NFR_001["NFR-001"]
NFR_002["NFR-002"]
NFR_003["NFR-003"]
NFR_004["NFR-004"]
NFR_005["NFR-005"]
NFR_006["NFR-006"]
NFR_ARCH_001["NFR-ARCH-001"]
NFR_COST_001["NFR-COST-001"]
NFR_COST_002["NFR-COST-002"]
NFR_MON_001["NFR-MON-001"]
NFR_MON_002["NFR-MON-002"]
NFR_MON_003["NFR-MON-003"]
NFR_MON_004["NFR-MON-004"]
NFR_PERF_001["NFR-PERF-001"]
NFR_PERF_002["NFR-PERF-002"]
NFR_SEC_001["NFR-SEC-001"]
NFR_SEC_002["NFR-SEC-002"]
NFR_SEC_003["NFR-SEC-003"]
end
subgraph P5["Phase 5 — UI/UX 프론트엔드"]
direction TB
UI_001["UI-001"]
UI_002["UI-002"]
UI_003["UI-003"]
UI_004["UI-004"]
UI_010["UI-010"]
UI_011["UI-011"]
UI_012["UI-012"]
UI_013["UI-013"]
UI_020["UI-020"]
UI_021["UI-021"]
UI_022["UI-022"]
UI_023["UI-023"]
UI_024["UI-024"]
UI_025["UI-025"]
UI_030["UI-030"]
UI_031["UI-031"]
UI_040["UI-040"]
UI_041["UI-041"]
UI_042["UI-042"]
UI_050["UI-050"]
UI_051["UI-051"]
UI_060["UI-060"]
UI_061["UI-061"]
UI_062["UI-062"]
end
subgraph P6["Phase 6 — 부록 (Should/Could)"]
direction TB
P2_001["P2-001"]
P2_002["P2-002"]
P2_003["P2-003"]
P2_004["P2-004"]
P2_005["P2-005"]
P2_006["P2-006"]
P2_007["P2-007"]
end
%% --- Dependency edges ---
ADM_Q_001 --> ADM_C_001
ADM_Q_002 --> ADM_C_002
F4_C_003 --> ADM_C_002
COM_C_003 --> ADM_Q_001
F4_C_001 --> ADM_Q_002
DATA_004 --> API_001
DATA_005 --> API_002
DATA_002 --> API_003
DATA_003 --> API_003
DATA_007 --> API_004
DATA_002 --> API_005
DATA_001 --> API_006
DATA_001 --> API_007
DATA_001 --> API_008
DATA_009 --> COM_C_001
COM_C_001 --> COM_C_002
API_005 --> COM_C_003
DATA_002 --> COM_C_003
DATA_001 --> COM_C_004
DATA_001 --> COM_C_005
API_003 --> COM_Q_001
DATA_002 --> COM_Q_001
DATA_003 --> COM_Q_001
COM_Q_001 --> COM_Q_002
COM_Q_001 --> COM_RH_001
COM_Q_002 --> COM_RH_001
F1_Q_001 --> CRON_001
F1_C_004 --> CRON_001
NFR_001 --> CRON_001
DATA_001 --> DATA_002
DATA_002 --> DATA_003
DATA_002 --> DATA_004
DATA_003 --> DATA_005
DATA_002 --> DATA_006
DATA_002 --> DATA_007
DATA_009 --> DATA_007
DATA_009 --> DATA_008
DATA_001 --> DATA_009
DATA_007 --> DATA_012
DATA_009 --> DATA_012
DATA_002 --> DATA_010
DATA_012 --> DATA_010
DATA_010 --> DATA_011
API_001 --> F1_C_001
DATA_004 --> F1_C_001
F1_C_001 --> F1_C_002
F1_C_001 --> F1_C_003
F1_C_001 --> F1_C_004
DATA_004 --> F1_C_004
API_006 --> F1_Q_001
MOCK_005 --> F1_Q_001
F1_Q_001 --> F1_Q_002
DATA_004 --> F1_Q_002
F1_Q_001 --> F1_RH_001
F1_Q_002 --> F1_RH_001
F1_C_001 --> F1_RH_001
F1_C_004 --> F1_RH_001
F2_Q_001 --> F2_C_001
F2_Q_002 --> F2_C_001
DATA_005 --> F2_C_001
F2_C_002 --> F2_C_001
DATA_001 --> F2_C_002
DATA_003 --> F2_C_003
F2_C_001 --> F2_C_004
F2_C_001 --> F2_C_005
DATA_003 --> F2_Q_001
API_007 --> F2_Q_002
MOCK_006 --> F2_Q_002
F2_Q_001 --> F2_RH_001
F2_C_001 --> F2_RH_001
DATA_001 --> F3_C_001
F3_C_001 --> F3_C_002
F3_C_002 --> F3_C_003
F1_RH_001 --> F3_Q_001
API_004 --> F4_C_001
DATA_007 --> F4_C_001
F4_C_001 --> F4_C_002
F4_C_001 --> F4_C_003
F4_C_003 --> F4_C_004
F4_C_003 --> F4_C_005
F4_C_004 --> F4_C_005
DATA_012 --> F4_C_005
COM_C_002 --> F4_C_005
DATA_005 --> F4_Q_001
DATA_006 --> F4_Q_001
DATA_006 --> F4_Q_002
NFR_003 --> F4_Q_002
API_001 --> MOCK_001
API_002 --> MOCK_002
API_003 --> MOCK_003
API_004 --> MOCK_004
API_006 --> MOCK_005
API_007 --> MOCK_006
DATA_001 --> NFR_001
DATA_001 --> NFR_002
NFR_002 --> NFR_003
NFR_001 --> NFR_004
NFR_001 --> NFR_005
NFR_001 --> NFR_006
NFR_005 --> NFR_006
API_006 --> NFR_ARCH_001
NFR_001 --> NFR_COST_001
NFR_002 --> NFR_COST_001
NFR_COST_001 --> NFR_COST_002
NFR_001 --> NFR_MON_001
NFR_MON_001 --> NFR_MON_002
NFR_001 --> NFR_MON_003
F4_C_003 --> NFR_MON_004
NFR_MON_002 --> NFR_MON_004
NFR_001 --> NFR_PERF_001
UI_001 --> NFR_PERF_001
F1_RH_001 --> NFR_PERF_002
F2_RH_001 --> NFR_PERF_002
NFR_001 --> NFR_SEC_001
COM_C_001 --> NFR_SEC_002
F2_C_002 --> NFR_SEC_003
DATA_008 --> P2_001
COM_C_002 --> P2_001
F2_RH_001 --> P2_002
CRON_001 --> P2_003
F4_C_004 --> P2_003
UI_010 --> P2_004
UI_011 --> P2_004
DATA_010 --> P2_005
COM_C_002 --> P2_005
NFR_002 --> P2_006
NFR_MON_001 --> P2_007
COM_C_001 --> TEST_COM_001
COM_RH_001 --> TEST_COM_002
COM_C_004 --> TEST_COM_003
COM_C_005 --> TEST_COM_003
F1_C_001 --> TEST_F1_001
F1_C_002 --> TEST_F1_002
F1_C_003 --> TEST_F1_003
F1_Q_002 --> TEST_F1_004
F1_RH_001 --> TEST_F1_004
COM_Q_002 --> TEST_F1_005
F1_RH_001 --> TEST_F1_006
F2_RH_001 --> TEST_F2_001
F2_C_001 --> TEST_F2_002
F2_C_002 --> TEST_F2_003
F2_C_003 --> TEST_F2_004
F2_C_004 --> TEST_F2_005
F2_RH_001 --> TEST_F2_006
F3_C_001 --> TEST_F3_001
F3_C_003 --> TEST_F3_002
F3_Q_001 --> TEST_F3_003
F4_Q_001 --> TEST_F4_001
F4_Q_002 --> TEST_F4_002
F4_C_001 --> TEST_F4_003
F4_C_002 --> TEST_F4_004
F4_C_003 --> TEST_F4_005
F4_C_004 --> TEST_F4_005
F4_C_005 --> TEST_F4_005
F4_C_001 --> TEST_F4_006
DATA_001 --> UI_001
UI_001 --> UI_002
UI_001 --> UI_003
UI_001 --> UI_004
UI_002 --> UI_010
MOCK_003 --> UI_010
UI_002 --> UI_011
MOCK_001 --> UI_011
UI_011 --> UI_012
UI_010 --> UI_013
UI_002 --> UI_020
MOCK_001 --> UI_020
MOCK_002 --> UI_020
UI_001 --> UI_021
UI_001 --> UI_022
UI_021 --> UI_023
UI_020 --> UI_024
UI_024 --> UI_025
UI_002 --> UI_030
MOCK_004 --> UI_030
UI_003 --> UI_031
UI_001 --> UI_040
UI_003 --> UI_040
UI_011 --> UI_040
F3_C_001 --> UI_040
F3_C_002 --> UI_040
F3_C_003 --> UI_040
COM_C_005 --> UI_040
UI_040 --> UI_041
UI_003 --> UI_041
UI_011 --> UI_042
UI_002 --> UI_050
UI_020 --> UI_051
COM_C_002 --> UI_060
ADM_Q_001 --> UI_061
UI_002 --> UI_061
ADM_Q_002 --> UI_062
UI_002 --> UI_062
%% --- Epic-based color classes ---
classDef cInfra fill:#E5E7EB,stroke:#6B7280,color:#111827
classDef cData fill:#DBEAFE,stroke:#2563EB,color:#1E3A8A
classDef cApi fill:#CFFAFE,stroke:#0891B2,color:#164E63
classDef cMock fill:#EDE9FE,stroke:#7C3AED,color:#4C1D95
classDef cF1 fill:#FFEDD5,stroke:#EA580C,color:#7C2D12
classDef cF2 fill:#FEE2E2,stroke:#DC2626,color:#7F1D1D
classDef cF3 fill:#FCE7F3,stroke:#DB2777,color:#831843
classDef cF4 fill:#FEF3C7,stroke:#D97706,color:#78350F
classDef cCommon fill:#CCFBF1,stroke:#0D9488,color:#134E4A
classDef cAdmin fill:#E9D5FF,stroke:#9333EA,color:#581C87
classDef cNfr fill:#F5F5F4,stroke:#78716C,color:#44403C
classDef cUi fill:#D1FAE5,stroke:#059669,color:#064E3B
classDef cTest fill:#F3F4F6,stroke:#9CA3AF,color:#374151
%% --- Apply Epic colors to nodes ---
class ADM_C_001,ADM_C_002,ADM_Q_001,ADM_Q_002,P2_005,UI_060,UI_061,UI_062 cAdmin
class API_001,API_002,API_003,API_004,API_005,API_006,API_007,API_008 cApi
class COM_C_001,COM_C_002,COM_C_003,COM_C_004,COM_C_005,COM_Q_001,COM_Q_002,COM_RH_001,P2_001 cCommon
class DATA_002,DATA_003,DATA_004,DATA_005,DATA_006,DATA_007,DATA_008,DATA_009,DATA_010,DATA_011,DATA_012 cData
class CRON_001,F1_C_001,F1_C_002,F1_C_003,F1_C_004,F1_Q_001,F1_Q_002,F1_RH_001,P2_003 cF1
class F2_C_001,F2_C_002,F2_C_003,F2_C_004,F2_C_005,F2_Q_001,F2_Q_002,F2_RH_001,P2_002 cF2
class F3_C_001,F3_C_002,F3_C_003,F3_Q_001 cF3
class F4_C_001,F4_C_002,F4_C_003,F4_C_004,F4_C_005,F4_Q_001,F4_Q_002 cF4
class DATA_001 cInfra
class MOCK_001,MOCK_002,MOCK_003,MOCK_004,MOCK_005,MOCK_006 cMock
class NFR_001,NFR_002,NFR_003,NFR_004,NFR_005,NFR_006,NFR_ARCH_001,NFR_COST_001,NFR_COST_002,NFR_MON_001,NFR_MON_002,NFR_MON_003,NFR_MON_004,NFR_PERF_001,NFR_PERF_002,NFR_SEC_001,NFR_SEC_002,NFR_SEC_003,P2_006,P2_007 cNfr
class TEST_COM_001,TEST_COM_002,TEST_COM_003,TEST_F1_001,TEST_F1_002,TEST_F1_003,TEST_F1_004,TEST_F1_005,TEST_F1_006,TEST_F2_001,TEST_F2_002,TEST_F2_003,TEST_F2_004,TEST_F2_005,TEST_F2_006,TEST_F3_001,TEST_F3_002,TEST_F3_003,TEST_F4_001,TEST_F4_002,TEST_F4_003,TEST_F4_004,TEST_F4_005,TEST_F4_006 cTest
class P2_004,UI_001,UI_002,UI_003,UI_004,UI_010,UI_011,UI_012,UI_013,UI_020,UI_021,UI_022,UI_023,UI_024,UI_025,UI_030,UI_031,UI_040,UI_041,UI_042,UI_050,UI_051 cUi