一键导入
spec-compliance-checker
Spec 문서와 구현 코드의 추적성(FR별 파일 매핑·테스트 존재·누락 판정)을 검증한다. 구현 완료 후 스펙 충족 여부를 확인할 때 사용한다.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Spec 문서와 구현 코드의 추적성(FR별 파일 매핑·테스트 존재·누락 판정)을 검증한다. 구현 완료 후 스펙 충족 여부를 확인할 때 사용한다.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | spec-compliance-checker |
| description | Spec 문서와 구현 코드의 추적성(FR별 파일 매핑·테스트 존재·누락 판정)을 검증한다. 구현 완료 후 스펙 충족 여부를 확인할 때 사용한다. |
| context | fork |
| agent | general-purpose |
| model | sonnet |
역할: 당신은 Spec 문서와 구현 코드 간의 추적성(Traceability)을 검증하는 Spec 준수 감사 전문가입니다. 컨텍스트: Forge Dev P5 구현 완료 후 Check P5.5에서 자동 실행됩니다. 출력: FR별 구현 파일 매핑·테스트 존재 여부·API 계약 일치·데이터 모델 일치 결과를 PASS/WARN/FAIL JSON으로 반환합니다.
Spec 문서와 구현 코드 간의 추적성(Traceability)을 검증하는 전문 스킬. Forge Dev Check P5.5에서 사용된다.
이 스킬은 반드시 독립 subagent로 실행한다. 구현 에이전트(Generator)가 직접 자신의 코드를 Spec에 대조하면 자기평가 편향이 발생한다. 독립 컨텍스트를 가진 별도 에이전트만이 편향 없는 Traceability 감사를 수행할 수 있다.
Check P5.5 시점에 Lead가 아래 방식으로 독립 감사 에이전트를 스폰한다. 실행 순서: pipeline.md L462 순차 mandate 준수 — Check 5 → 5.5(본 스킬) → 5.6 → 5.7 → 5.9 순차 (QA=P6 별도 phase). Check P5.5가 완료(PASS 또는 STOP 게이트 해소)된 후에만 P5.6/P5.7/P5.9 진입 가능.
# Check P5.5 단독 스폰 (순차 실행)
spec_compliance_agent = Agent(
subagent_type="general-purpose",
model="sonnet",
prompt="""
당신은 독립 Spec 준수 감사 에이전트입니다.
구현 에이전트(Generator)의 컨텍스트를 공유받지 않습니다.
오직 Spec 문서와 코드 파일만을 직접 읽어 감사하십시오.
Spec 경로: {spec_path}
구현 완료 브랜치: {branch}
Traceability Matrix (있으면): {matrix_path}
이 스킬 파일 Read: ${FORGE_ROOT:-$HOME/forge}/.claude/skills/spec-compliance-checker/SKILL.md
Step-by-Step 절차를 따라 감사 수행 후 JSON 결과만 반환.
결과 저장 경로: {result_path}
"""
)
# 주의: P5.5 PASS 확인 후 P5.6/P5.7/P5.9 순차 진입. P5.5와 병렬 스폰 금지.
# pipeline.md: "Check 5 → 5.5 → 5.6(조건부) → 5.7 → 5.9 순차 → P6 QA"
파일 기반 입력:
{spec_path}: .specify/specs/{spec-name}.md{matrix_path}: .specify/traceability/{spec-name}-matrix.json (있으면){branch}: 현재 구현 브랜치명{result_path}: .claude/state/check-8.5-result.jsonspec_path 미제공 또는 파일 미존재 시:
/spec-write로 먼저 Spec을 작성하세요."아래 생각이 들면 그것은 관대해지고 있다는 신호 → 더 엄격하게 본다:
행동 규칙:
implStatus: "found" 주장)를 그대로 믿지 않는다 — 파일 존재만으로 충분하지 않다모든 이슈는 반드시 세 요소를 포함한다:
FR-003 결제 실패 시나리오에 테스트 없음 (payment.service.spec.ts 확인, 위치) → 실패 분기 코드(payment.service.ts:87)가 검증되지 않음 (이유) → should throw PaymentException on declined card 케이스 추가 (방법)"출력 JSON의 누락 FR 항목은 이 3요소를 채워야 한다.
구현이 PASS처럼 보일 때 역방향으로 질문한다:
→ 3가지 중 1개 이상 "아니오" = WARN 격상.
PASS 판정 직전 마지막 절차: "PASS라고 생각하는 이유 3가지" → 각각에 대해 "왜 틀릴 수 있는가?" 질문. 반박 가능한 근거 1개 이상 발견 시 WARN 유지.
감사 수행 중 아래 편향 패턴을 능동적으로 감지하고 억제한다:
| 편향 | 증상 | 억제 절차 |
|---|---|---|
| Confirmation Bias (확증 편향) | 구현 파일이 있으면 "됐다"고 판단 | DISCONFIRMATION 패스 필수 (위 절차 참조) |
| Anchoring Bias (기준점 편향) | 첫 번째 파일 발견으로 FR 전체를 found로 간주 | FR별 독립 검증 — 공유 상태 없이 재확인 |
| Sunk-cost Bias (매몰 비용 편향) | 이미 많이 검증했으니 나머지는 OK일 것 | 마지막 FR도 첫 번째 FR과 동일 엄격도 적용 |
| Availability Bias (가용성 편향) | 최근 검증한 파일과 유사하면 OK로 추론 | 유사성 아닌 실제 코드 경로 확인 의무 |
반박 절차: 편향 감지 시 → "왜 이것이 PASS일 수 없는가?" 1개 반박 논거 생성 → 반박 가능 시 WARN 유지.
감사 착수 전 범위 추정 시:
summary 필드에 planning-fallacy: true 플래그 추가./forge-check-traceability.specify/traceability/{spec-name}-matrix.json) — 우선 사용.specify/specs/{spec-name}.md) — Matrix 미존재 시 직접 추출docs/walkthroughs/) — Files Changed 크로스 체크Canonical SSoT =
~/.claude/rules-on-demand/verification-patterns.md. 아래는 검증 실행 편의 요약 — Level 정의·Stub 패턴 변경 시 verification-patterns.md를 우선 갱신(drift 방지).
검증 깊이를 4단계로 분류한다. 상위 Level은 하위를 포함한다.
| Level | 이름 | 확인 내용 | 실패 신호 |
|---|---|---|---|
| 1 | Exists | 파일/함수/클래스 물리적 존재 | 파일 없음 |
| 2 | Substantive | 실제 로직 구현 (stub 아님) | placeholder/TODO만 |
| 3 | Wired | 호출 체인 연결 (import, DI, route 등록) | import 있으나 미연결 |
| 4 | Functional | 실제 동작 + test assertion 검증 | assertion 없음 |
최소 기준: High FR = Level 3(Wired) 이상 확인 필수. Level 1-2만 확인 = WARN 격상.
순방향(파일 탐색)만으로는 stub을 "found"로 오인할 수 있다. FR에서 역방향으로 검증:
다음 패턴 발견 시 Level 2 FAIL 처리:
return null / return undefined / return {} 단독 함수 본문throw new Error('not implemented') 또는 TODO: 주석만 있는 구현// placeholder / // stub 주석 포함Spec 문서의 각 기능 요구사항이 실제 코드에 구현되었는지 확인:
implementationFiles 경로에서 관련 코드 존재 확인Spec의 각 기능 요구사항에 대응하는 테스트가 존재하는지 확인:
testFiles 경로에서 관련 테스트 존재 확인Spec의 API 엔드포인트 정의와 실제 구현이 일치하는지 확인:
Spec의 데이터 모델 정의와 실제 Entity/Interface가 일치하는지 확인
Spec §2.0 소스 커버리지 표를 파싱하여, 소스 기획서·기능명세의 기능/비즈니스룰이 FR로 승격됐는지 확인:
상태가 uncovered이거나 매핑 FR이 비어 있으면 → unmappedFRs[]에 type: "source_feature"(기능) 또는 "business_rule"(BR)로 등록범위외 상태는 사유가 있으면 통과, 사유 없으면 WARN(근거 없는 누락){
"checkId": "check-8.5",
"status": "PASS|WARN|FAIL",
"oracleStatus": "full|spec-only",
"matrixSource": "traceability-json|spec-extracted",
"requirements": [
{
"id": "FR-001",
"description": "요구사항 설명",
"priority": "High|Medium|Low",
"implStatus": "found|missing",
"implFile": "path/to/file.ts",
"testStatus": "found|missing",
"testFile": "path/to/test.ts",
"testType": "unit|integration|both",
"relatedDescribeBlocks": ["describe block name 1", "describe block name 2"],
"acceptance_predicate": "oracle-checkable 단언 텍스트 또는 null(미작성)",
"frState": "DONE|PARTIAL|NOT_DONE|CHANGED|UNVERIFIABLE",
"verifiedLevel": 1
}
],
"unmappedFRs": [
{ "id": "FR-003", "type": "impl|test|uiux|acceptance_predicate|source_feature|business_rule", "reason": "구현 파일 없음" }
],
"acceptance_predicate_missing": ["FR-002", "FR-005"],
"frByState": { "DONE": 0, "PARTIAL": 0, "NOT_DONE": 0, "CHANGED": 0, "UNVERIFIABLE": 0 },
"summary": "전체 N개, 구현 N개 (N%), 테스트 N개 (N%), 누락 N개",
"autoFixable": false
}
raw grep/read 출력을 그대로 반환하지 않는다. 반드시 구조화 JSON만 반환.
implStatus/testStatus/검증 Level은 근거이고, frState가 결론이다.
아래 규칙으로 FR 항목마다 정확히 하나의 frState를 부여한다.
| frState | 조건 |
|---|---|
DONE | impl found AND test found AND Level 3(Wired) 이상 확인 |
PARTIAL | impl found 이나 test missing, 또는 Level 1~2만 확인(Exists/Substantive — stub 의심) |
NOT_DONE | impl missing (구현 자체가 없음) |
CHANGED | impl found 이나 spec과 범위·인터페이스가 다르게 구현됨 (감사자 판정 — 근거를 reason에 명시) |
UNVERIFIABLE | 검증 수단 부재로 판정 불가 (실행 불가·외부 의존·계측 없음). "확인 안 해봤다"는 UNVERIFIABLE이 아니다 — 확인하라. |
frByState = 위 값들의 건수 집계. 불변식: sum(frByState.values()) == len(requirements).
눈으로 세지 말고 requirements에서 기계 도출할 것.NOT_DONE·UNVERIFIABLE 1건이면 verification-routing.md가
[STOP] 머지 금지로 보낸다. 관대한 DONE 부여는 게이트를 무력화한다./forge-check-traceability가 이 값을 docs/qa/fr-verdict.json(fr_by_state)으로 그대로 옮긴다.
축 판정(status: PASS/WARN/FAIL)과 직교한다 — 서로를 대체하지 않는다.2026-07-15 이전엔 이 스킬이
implStatus/testStatus만 내보내는데 소비처는 5-state를 요구해, 중간에서 상태를 암묵적으로 추측해야 했다.frState를 명시 산출로 승격해 그 추측을 제거했다.
| 판정 | 조건 | 행동 |
|---|---|---|
| PASS | 모든 High FR implStatus+testStatus 모두 found (이중확인 필수). oracleStatus=full 시 uiux FR도 포함. acceptance_predicate 전부 작성됨 | 통과 |
| WARN | Medium/Low FR 누락 or uiux FR WARN or Level 1-2만 확인 (Wired 미확인) or acceptance_predicate 미작성 FR 1개+ or 소스 커버리지 uncovered/무근거 범위외 항목 1개+ (A3) | Lead에게 보고 |
| FAIL | High FR 1개+ impl 또는 test missing → unmappedFRs에 등록 | Lead에게 보고 |
AC-testability 체크 (A1, WARN): Step 3.5에서 각 FR의
acceptance_predicate필드 존재 여부 확인. 미작성 FR →acceptance_predicate_missing배열 추가 + WARN 격상. 1주 metrics 후 BLOCK 승격 검토.
PASS = Level 3(Wired) 이상 확인 완료. Level 1-2만 = WARN 격상.
IF {project}/.specify/oracle-manifest.json 존재
→ 로드: { spec, uiux, frontend_source }
→ oracleStatus: "full"
→ frontend_source="extracted" → uiux 검증 면제 (기능 Spec 유지)
→ uiux 화면 목록 → "FR-UI-{screen-id}" 형태로 requirements 추가
→ uiux 화면 매핑 완결성 체크:
mapped = uiux.screens 중 실제 코드 경로 보유 수
total = uiux.screens 총 수
IF mapped < total → WARN ("uiux 매핑 미완성: {mapped}/{total}")
route_map 확인: gitnexus route_map 우선, 미사용 시 grep "{screen-id}" 폴백
ELSE
→ oracleStatus: "spec-only" (기존 Spec-only 동작)
→ 프론트엔드 프로젝트 감지 시 (*.tsx/*.vue/*.svelte 파일 존재): WARN ("oracle-manifest.json 없음 — /spec-write Phase 2.6로 생성 권장")
PRD 요구사항 → FR 파생 여부 체크 (끊긴 노드=0 목표):
"완결성체인 갭: FR-NNN PRD 파생 불명확" (BLOCK 아님)IF .specify/traceability/{spec-name}-matrix.json 존재
→ Matrix JSON 로드 (matrixSource: "traceability-json")
ELSE IF .specify/specs/{spec-name}.md 존재
→ Spec 파일에서 FR/NFR 추출 (matrixSource: "spec-extracted")
→ "## 기능 요구사항" 또는 "## Functional Requirements" 섹션 파싱
→ 각 항목에서 ID(FR-NNN), 설명, 우선순위 추출
ELSE
→ FAIL: 입력 소스 없음
Matrix 사용 시:
implementationFiles 배열 순회implStatus: "found" / 미존재 → implStatus: "missing"Spec 직접 추출 시:
implStatus: "found" + 파일 경로 기록implStatus: "missing"Matrix 사용 시:
testFiles 배열 순회Spec 직접 추출 시:
*.spec.ts, *.test.ts, *.e2e-spec.ts 파일에서 FR 키워드 GreptestStatus: "found" + 관련 describe 블록 이름 기록testStatus: "missing"각 FR의 acceptance_predicate 필드 유무 확인:
IF traceability-json 소스
→ matrix JSON 각 항목에서 acceptance_predicate 키 확인
ELSE spec-extracted 소스
→ Spec 파일 각 FR 항목에서 "acceptance_predicate:" 또는 "AC predicate:" 패턴 검색
→ 미발견 = 미작성
미작성 FR 목록 → acceptance_predicate_missing 배열
미작성 FR 1개+ → WARN 격상 (BLOCK 아님 — 1주 metrics 후 BLOCK 승격 검토)
tautology 감지: "동작한다"/"성공한다" 단독 predicate = 무효(tautology), WARN 추가
@Get/@Post/@Put/@Delete/@Patch 데코레이터 검색@UseGuards(JwtAuthGuard) 등 인증 데코레이터 존재 확인*.entity.ts 파일에서 @Column, @PrimaryGeneratedColumn 검색소스 커버리지 표를 파싱상태=uncovered 또는 매핑 FR 공란 → unmappedFRs[{id, type:"source_feature"|"business_rule", reason:"소스에 존재하나 FR 미승격"}] 등록 + WARN범위외 행: 사유 텍스트 존재 확인. 사유 없으면 WARN("근거 없는 범위 외 처리")전체 High FR 중 구현+테스트 모두 존재 → PASS
Medium/Low FR만 누락 → WARN
High FR 1개+ 누락 → FAIL
Walkthrough 파일이 존재하면 추가 검증:
{
"spec": "spec-name",
"plan": "plan-name",
"createdAt": "2026-03-08",
"requirements": [
{
"id": "FR-001",
"description": "기능 요구사항 설명",
"priority": "High",
"implementationFiles": ["src/modules/xxx/xxx.service.ts"],
"testFiles": ["src/modules/xxx/xxx.service.spec.ts"],
"task": "Task 이름",
"owner": "Teammate 이름"
}
]
}
이 포맷은 Phase 6 요구사항 분석 시 자동 생성되며, P5 구현 중 implementationFiles와 testFiles가 업데이트된다.
실패 시 [[pev-self-correction]] 적용
병렬/다단계 실행 = Workflow 도구로 컨텍스트 격리 + resume 지원. 패턴: parallel() 4축(FR→코드/테스트, API계약, 데이터모델) → 집계.
실행: Workflow({ script: Bash("cat ~/.claude/skills/spec-compliance-checker/workflow.js"), args: { specPath, branch } })
CLAUDE_CODE_DISABLE_WORKFLOWS=1 시 기존 Subagent 격리 방식 fallback.
~/.claude/rules-on-demand/verification-patterns.mdMulti-worker 검수 스킬 (Codex + Gemini Double / Opus + Codex + Gemini Triple). 단일 Codex 검수 대비 100% 보완 카테고리 커버. 트리거: /cr-multi, /cr-double, /cr-triple, plan/spec 저장 후 자동(CR_MULTI_AUTO=on), plateau 3회 자동 승격.
Forge 하네스 읽기전용 레거시 감사: 낡은룰/중복/과대 전역컨텍스트/넓은 Skill/불필요 Hook·MCP/제품중복 분류. 트리거: /harness-legacy-scan
YouTube 영상을 트랜스크립트·댓글·설명란까지 수집해 비판적 분석·팩트체크·시스템 개선 제안을 생성한다. 사용자가 YouTube URL을 보내거나 영상 분석을 요청할 때 사용한다.
REST API 엔드포인트 HTTP 레벨 E2E 자동 테스트. Spec 또는 OpenAPI(Swagger) YAML/JSON을 읽어 엔드포인트별 테스트 케이스(happy path/인증 실패/잘못된 입력/경계값)를 자동 생성하고 curl로 실행한다. 응답 스키마를 OpenAPI 스펙과 대조해 드리프트를 감지한다. /qa 스킬이 서버/API 프로젝트 감지 시 자동 트리거. 직접 호출: /api-e2e <spec-path> [--base-url http://localhost:3000]
기획서를 CEO(비즈니스)→Design(UX)→Engineering(기술) 3관점 순차 리뷰 + Synthesizer 종합 + 독립 Evaluator 검증(5-Wave)하는 스킬. Phase 3 에이전트 회의 후 자동 트리거. (적대적 Codex 검수는 cr-triple/codex-review 별도 게이트.)
PR 생성 전 develop 대비 feature 브랜치의 성능을 비교하는 스킬. 번들 크기, 테스트 시간, API 응답 시간을 측정. P7 PR 생성 전 자동 트리거.