/cc-e2e:lock — 통과한 테스트를 "공식 시험지"로 박제#
| 항목 | 내용 |
|---|---|
| 실행 명령 | /cc-e2e:lock |
| 분류 | E2E 작성 |
| 난이도 | ●●○ 보통 |
한마디로#
검증을 통과한 자동화 테스트 시나리오를 회귀 시험지(CI 회귀 스위트)에 도장 찍어 등록하는 단계입니다. 한 번 합격한 모의고사 문제를 "이제부터 매번 푸는 정식 시험 문제"로 확정하는 것과 같아요. 등록 후에는 함부로 바꿀 수 없습니다(되돌리려면 명시적인 unlock이 필요).
누가·언제 쓰나요#
- 테스트 시나리오 작성(step-implement)을 끝내고, 자동 실행 결과가 PASS(합격) 로 나온 직후
- 그 시나리오를 CI 회귀 테스트(코드가 바뀔 때마다 자동으로 도는 검사)에 정식으로 포함시키고 싶을 때
무엇을 해주나요#
통과한 시나리오를 검증한 뒤, 정식 테스트 목록에 등록하고 임시 작업 기록을 정리해 줍니다. 끝나면 다음이 남습니다.
test_bundle.dart수정 — 전체 테스트 묶음에 시나리오 추가run_all_scenarios.sh수정 — 한 번에 실행하는 스크립트 갱신.claude/e2e-lock.json갱신 — "어떤 시나리오를 박제했는지" 기록 (커밋 대상)- 임시 작업 기록(저널)을 삭제하거나 보관함(archive)으로 이동
- 추천 커밋 메시지 제안:
test(e2e): lock {feature}/{scenario}
어떻게 쓰나요#
# 단일 시나리오 박제
/cc-e2e:lock sign_in email_login_success
# feature 전체 박제 (해당 feature의 모든 시나리오)
/cc-e2e:lock sign_in --all
# pre-lock 검증만 수행 (실제 lock 안함)
/cc-e2e:lock sign_in email_login_success --dry-run
# 저널을 archive 로 보관하며 lock
/cc-e2e:lock sign_in email_login_success --archive-journal
feature(필수): 기능 이름 (예:sign_in)scenario(필수): 시나리오 이름. 단,--all을 쓰면 생략 가능--all: 해당 기능의 모든 시나리오를 한꺼번에 박제--dry-run: 실제로 등록하지 않고 "통과하는지 검증만" 미리 해보기--archive-journal: 작업 기록을 지우지 않고 보관함으로 옮기기 (기본은 삭제)
안에서 무슨 일이 벌어지나요#
크게 검증 → 등록 → 정리 → 기록 → 보고 순서로 진행됩니다.
- 사전 점검 — 시나리오 파일이 제자리에 있는지, 빠진 부분은 없는지, 마지막 자동 실행이 합격이었는지 등을 꼼꼼히 검사합니다. 하나라도 미달이면 등록하지 않고 멈춥니다(강제 등록 금지).
- 정식 목록 등록 — 전체 테스트 묶음과 실행 스크립트에 이 시나리오를 추가합니다.
-
CI 연결 확인 — 자동 검사 설정(
.github/workflows/e2e-patrol.yml)이 잘 연결돼 있는지 확인하고 필요한 보완을 제안합니다. - 임시 기록 정리 — 작업하면서 남긴 저널을 삭제하거나 보관함으로 옮깁니다.
- 박제 기록 작성 — "무엇을 등록했는지"를
.claude/e2e-lock.json에 남깁니다. - 결과 보고 — 등록 경로, CI 실행 명령, 추천 커밋 메시지를 정리해 알려줍니다.
문제가 생기면(예: 사전 점검 실패, 마지막 실행이 불합격, 이름 중복) 그 원인을 알려주고 다음에 무엇을 해야 할지 안내합니다.
⚙️ 상세 옵션·실행 명세 (개발자 / AI 에이전트용)
Triggers#
- step-implement 완료 후 patrol_mcp
run결과가 PASS - 시나리오를 CI 회귀에 포함시키려 할 때
사용법#
# 단일 시나리오 박제
/cc-e2e:lock sign_in email_login_success
# feature 전체 박제 (해당 feature의 모든 시나리오)
/cc-e2e:lock sign_in --all
# pre-lock 검증만 수행 (실제 lock 안함)
/cc-e2e:lock sign_in email_login_success --dry-run
# 저널을 archive 로 보관하며 lock
/cc-e2e:lock sign_in email_login_success --archive-journal파라미터#
| 파라미터 | 필수 | 설명 | 기본 |
|---|---|---|---|
feature | ✅ | feature 이름 | — |
scenario | ✅* | 시나리오 슬러그 | — |
--all | ❌ | feature 내 모든 시나리오 lock | false |
--dry-run | ❌ | 검증만 수행 | false |
--archive-journal | ❌ | 저널을 .claude/e2e-journal/archive/ 로 이동 (기본은 삭제) | false |
*--all 미사용 시 필수
실행 단계#
- Pre-lock 검증 (skills/scenario-lock/SKILL.md 참조)
- 시나리오 파일 존재 + 위치
- step 함수 매핑 완전성
- semantic ref 잔존 검사
- flutter-skill import 잔존 검사
- patrol_mcp 마지막 run PASS
- (배치 소속이면) 배치 전체 PASS — 형제 시나리오에 FAIL·BLOCKED·RESET_FAILED 가 없을 것
- canonical step 규약 준수
- Bundle 등록 —
test_bundle.dart,run_all_scenarios.sh업데이트 (배치는 파일 1개 = 항목 1개) - CI 연결 점검 —
.github/workflows/e2e-patrol.yml확인 + 제안 - 저널 정리 — 삭제 또는 archive 이동
- Lock 레코드 작성 —
.claude/e2e-lock.json업데이트 (커밋 대상) - 리포트 — 등록 경로, CI 명령, 제안 커밋 메시지
출력#
test_bundle.dart수정run_all_scenarios.sh수정.claude/e2e-lock.json갱신 (커밋 대상)- 저널 삭제 or archive 이동
- 제안 커밋 메시지:
test(e2e): lock {feature}/{scenario}
실패 케이스#
| 원인 | 대응 |
|---|---|
| Pre-lock 검증 실패 | 원인 리포트 + 중단 (강제 lock 금지) |
| patrol_mcp 마지막 run FAIL | step-implement 재진입 안내 |
| semantic ref 잔존 | 해당 코드 위치 출력 + key-hardening 재실행 안내 |
시나리오명 중복 — 같은 (feature, scenario) 쌍 재-lock | 오류가 아니다. 멱등 skip 후 형제 계속 (skills/scenario-lock/SKILL.md §1.1) — 중단·충돌 리포트 금지 |
| 시나리오명 중복 — 다른 feature 의 같은 scenario 명 | 기존 lock 레코드와 충돌 리포트 |
관련#
- skills/scenario-lock/SKILL.md
- commands/draft.md — 이전 단계
- rules/selector-policy.md, rules/feature-file-conventions.md