Skip to content
cccskills
FreePublished on GitHub

tdd-legacy

테스트 없는 기존 코드에 행위 보존 안전망(Characterization → Approval → Mutation)을 구축한 뒤 개선 스킬로 핸드오프. "레거시에 테스트 추가", "안전망 구축", "characterization test" 요청 시 사용. /tdd-legacy로 호출.

The English summary is being prepared. Showing the original description.

See how to install

Files included (1)

  • SKILL.md6.4 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

TDD Legacy — 레거시 코드 안전망 구축

테스트 없는 기존 코드의 현재 행위를 고정하는 안전망을 만들고, 개선은 기존 스킬로 넘깁니다.

GOAL

  • 성공 = 대상 코드의 현재 행위가 테스트로 고정되고, mutation 검증으로 안전망의 실효성이 확인되며, 개선 스킬로 핸드오프됨
  • characterization 테스트가 현재 행위(옳은 행위가 아니라)를 기록함
  • 모든 어설션이 sabotage 검증을 통과함 (동어반복 어설션 없음)
  • mutation score가 합의된 임계값에 도달함 (기본: 대상 메소드 기준 100%)
  • /tdd-tidy 또는 /system-wide-refactoring 핸드오프 안내로 종료

CONSTRAINTS

Hard Rules

  • 현재 행위를 기록한다 — 버그로 보이는 동작도 일단 고정한다. 수정은 안전망 완성 후 별도 작업 (발견한 의심 동작은 사용자에게 보고만).
  • 프로덕션 코드를 변경하지 않는다 — 이 스킬의 산출물은 테스트뿐이다. sabotage로 일시 변경한 코드는 반드시 원복하고 커밋에 포함하지 않는다.
  • 단계(1→2→3) 경계마다 사용자 검토 후 진행 (레거시는 확신이 낮은 상황 — 기어 모델의 low 상당 밀도로 고정).
  • 리팩토링·seam 생성·의존성 깨기(dependency breaking)는 범위 밖 — 필요하면 핸드오프 후 진행.

Principles

  • 테스트하기 어려운 의존성(DB·시간·랜덤)이 있으면 값을 고정할 수 있는 가장 얇은 방법(고정 입력, 시스템 프로퍼티, 테스트 전용 설정)을 먼저 찾고, 불가능하면 그 지점을 사용자에게 보고한다 — 의존성 깨기는 이 스킬이 하지 않는다.
  • unit test vs approval test는 트레이드오프다: 설계가 매우 나쁠 때는 approval이 효율적이고, 설계가 좋아지면 composable한 unit test가 낫다. 둘은 공존 가능하다.

OUTPUT FORMAT

호출 형식

/tdd-legacy <대상 클래스 FQCN 또는 파일 경로>

1단계: Characterization — 현재 행위 고정

  1. 대상 선정: 인자의 클래스에서 변경 예정 지점(사용자에게 확인) 우선. public 메소드부터, 입력 조합이 단순한 것부터.
  2. golden master 작성: 대표 입력으로 현재 출력을 그대로 어설션에 고정. 기대값을 추측하지 말고 실제 실행 결과를 기록한다.
  3. 어설션 정확성 검증 — SUT sabotage: 통과하는 어설션마다
    • SUT를 일시적으로 변형해서(값 하나 변경 등) 테스트를 실행
    • 해당 어설션이 실제로 실패하는지 확인
    • 원복 후 다시 통과 확인
    • 실패하지 않는 어설션 = 동어반복 — 어설션을 고친다
  4. 비결정 출력 정규화 — scrubber: 타임스탬프·랜덤·해시·순서 등 실행마다 변하는 부분은 정규화(치환) 후 비교한다.
  5. 커밋: test: <대상> characterization 테스트 추가. 커밋 메시지는 docs/reviewable-commits.md(없으면 ${CLAUDE_PLUGIN_ROOT}/references/reviewable-commits.md) 표준을 따른다 — body에 어떤 행위를 고정했고 sabotage 검증 결과를 기록. 길이는 ../../references/commit-style.md의 간결성 규칙(제목 + 핵심 bullet 2~4줄)을 따른다. 커밋 직전 git diff --stat으로 테스트 외 파일 변경이 없는지 확인한다 (sabotage 원복 누락 차단).
  6. 사용자 검토 대기 — 고정한 행위 목록과 의심 동작 보고

2단계: Approval — 조합 커버리지 확장

  1. 입력 조합이 많은 메소드는 CombinationApprovals.verifyAllCombinations()로 조합 전체를 승인 파일에 고정 (approvaltests 의존성 필요 — 없으면 추가를 사용자에게 확인).
  2. 조합이 적거나 설계가 깨끗한 부분은 1단계의 unit 스타일을 유지 — 전환은 트레이드오프 판단이며 전부 approval로 바꾸지 않는다.
  3. 승인 파일(approved.txt)도 scrubber 적용.
  4. 커밋: test: <대상> combination approval 추가
  5. 사용자 검토 대기 — 커버한 조합 범위 보고

3단계: Mutation 검증 — 안전망 실효성 확인

  1. 도구 선택:
    • mutate4java가 있으면 그것을 사용 (1순위) — 에이전트 mutate4java-runner 또는 jar 직접 실행. 설치·판정은 ../../references/hardening-tools.md
    • 없으면 PIT를 직접 설정:
      • Gradle: plugins { id "info.solidsoft.pitest" version "1.15.0" } + pitest { targetClasses = ["<대상 FQCN>"] } → ./gradlew pitest
      • Maven: org.pitest:pitest-maven 플러그인 <targetClasses> 설정 → mvn test-compile org.pitest:pitest-maven:mutationCoverage
  2. 대상 클래스에 mutation 실행 → 살아남은 뮤턴트 = 안전망의 미검출 영역
  3. 뮤턴트를 죽이는 테스트를 보강하고 재실행 (반복). 죽일 수 없는 동등 뮤턴트(equivalent mutant)로 판정되면 사유와 함께 사용자에게 보고하고 score 계산에서 제외를 합의한다 (무한 보강 루프 금지).
  4. DoD: 대상 메소드 기준 mutation score 100% 또는 사용자가 합의한 임계값
  5. 커밋: test: <대상> 뮤턴트 킬 테스트 보강
  6. 사용자 검토 대기 — mutation score 전/후 보고

완료: 핸드오프

안전망 완료를 보고하고 종료한다:

안전망 완료 (characterization N개 + approval M개, mutation score X%). 이제 개선을 진행하세요: 코드 정리는 /tdd-tidy, 구조 개선은 /system-wide-refactoring. 새 기능 추가는 /tdd-feature.

개선 실행은 이 스킬 범위 밖이다.

FAILURE CONDITIONS

  • characterization 어설션 중 sabotage 검증을 거치지 않은 것이 있다
  • 프로덕션 코드 변경이 커밋에 포함됐다 (sabotage 원복 누락)
  • "현재 행위"가 아니라 "옳다고 생각하는 행위"를 어설션에 넣었다
  • mutation 검증 없이 안전망 완료를 선언했다
  • 단계 경계에서 사용자 검토 없이 다음 단계로 진행했다
  • 리팩토링/의존성 깨기를 이 스킬 안에서 수행했다

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

동일한 결과를 내는 여러 조건문(OR 나열·중첩 AND)을 하나로 통합하고 의미 있는 boolean 메서드로 추출. "조건문 합쳐", "같은 결과 반환하는 if 정리", "중첩 if 평탄화", "/consolidate-conditional" 요청 시 사용. 단, 여러 메서드에 흩어진 동일 조건을 호출자 쪽으로 올리는 것은 /lift-up-conditional, 복잡한 조건식·분기를 메서드로 쪼개는 것은 /decompose-conditional이 적합. /consolidate-conditional [commit-ref]로 호출.

The English summary is being prepared. Showing the original description.

msbaek/msbaek-claude-plugins8Updated Oct 16, 2026

기능의 external behavior를 Cucumber 인수 테스트(주 검증층)로 구축 — .feature 실행으로 문서↔코드 드리프트를 구조적으로 차단, Four Layer(Steps→Protocol Driver→SUT), 태그 기반 가역 제외, 기존 JUnit 인수 테스트 이관. "인수 테스트 도입", "Gherkin을 실행 가능하게", "cucumber 셋업" 요청 시 사용. /cucumber-acceptance로 호출.

The English summary is being prepared. Showing the original description.

msbaek/msbaek-claude-plugins8Updated Oct 16, 2026

복잡한 if/then/else의 조건식과 각 분기를 의미 있는 메서드로 추출하여 가독성 향상. "조건문 분해", "if 가독성", "복잡한 조건식에 이름 붙여", "/decompose-conditional" 요청 시 사용. 단, 같은 결과를 내는 조건문들을 하나로 합치는 것은 /consolidate-conditional, 타입별 분기를 클래스로 바꾸는 것은 /replace-conditional-with-poly가 적합. /decompose-conditional [commit-ref]로 호출.

The English summary is being prepared. Showing the original description.

msbaek/msbaek-claude-plugins8Updated Oct 16, 2026

Primitive Obsession 제거 — 검증·연산이 따라다니는 primitive 필드(금액+통화, 이메일 문자열 등)를 도메인 개념을 담은 Value Object로 치환. "값 객체 도입", "primitive obsession", "Money 클래스로", "/discover-value-object" 요청 시 사용. 단, 함께 전달되는 파라미터 묶음을 객체로 바꾸는 것은 /introduce-parameter-object, 컬렉션을 감싸는 것은 /first-class-collection이 적합. /discover-value-object [commit-ref]로 호출.

The English summary is being prepared. Showing the original description.

msbaek/msbaek-claude-plugins8Updated Oct 16, 2026

컬렉션 getter가 내부 List/Set을 직접 노출하는 것을 방지 — unmodifiable 반환 + add/remove 메서드 제공. "컬렉션 캡슐화", "getter가 List 그대로 노출", "unmodifiable로", "/encapsulate-collection" 요청 시 사용. 단, 컬렉션과 관련 로직을 전용 클래스로 뽑는 것은 /first-class-collection이 적합. /encapsulate-collection [commit-ref]로 호출.

The English summary is being prepared. Showing the original description.

msbaek/msbaek-claude-plugins8Updated Oct 16, 2026

암묵적 의존성(전역 변수·클래스 필드·싱글턴 접근)을 명시적 파라미터로 전환하여 메서드 투명성 향상. "숨은 의존성 드러내", "필드 대신 파라미터로", "전역 참조 제거", "/explicit-parameters" 요청 시 사용. 단, 파라미터가 많아져 묶어야 하면 /introduce-parameter-object, I/O와 계산 분리는 /segregate-functional-core가 적합. /explicit-parameters [commit-ref]로 호출.

The English summary is being prepared. Showing the original description.

msbaek/msbaek-claude-plugins8Updated Oct 16, 2026

See all skills by msbaek

Report a problem with this skill