표준 로그 포맷
모든 스크립트/테스트/훅 출력은 아래 포맷을 따른다:
[HH:MM:SS] [LEVEL] [component] message
레벨: INFO, WARN, ERROR, DEBUG
예시: [14:32:01] [ERROR] [build] swiftc: 3 warnings, 1 error
플랫폼별 컨벤션
Shell 스크립트
set -euo pipefail
log() { echo "[$(date +%H:%M:%S)] [$1] [${COMPONENT:-script}] $2"; }
log INFO "starting deploy"
- 파일 상단에
set -euo pipefail추가 COMPONENT환경변수로 component 명시
Node.js 훅
stdout은 훅 프로토콜 채널 — 로그는 반드시 stderr 사용:
const log = (level, component, msg) =>
process.stderr.write(`[${new Date().toTimeString().slice(0,8)}] [${level}] [${component}] ${msg}\n`);
Swift / XCUITest
시뮬레이터 로그를 grep 가능하게 모든 테스트 액션/어서션에 prefix:
print("[ACTION] tap loginButton")
print("[ASSERT] expects errorBanner visible")
로그 저장 위치
| 컨텍스트 | 위치 |
|---|---|
| Shell task 실행 | /tmp/claude-<task>-<YYYY-MM-DD>.log |
| Node 훅 | stderr (Claude Code가 자동 캡처 — redirect 불필요) |
| 테스트 실행 | test-results/, *.junit.xml, *.log |
로그 파일 생성 패턴:
some-command 2>&1 | tee /tmp/claude-<task>-$(date +%F).log
로그 읽기 규율
아래 상황에서 exit code만 믿지 않고 로그 내용을 반드시 읽는다:
| 상황 | 확인 대상 |
|---|---|
| 테스트 실행 후 | FAIL, ERROR, error: grep 후 통과 선언 |
| 빌드 후 | warning: 라인 확인; 0이 아니면 에스컬레이션 |
| 훅 실행 후 | stderr 출력으로 훅이 올바르게 동작했는지 확인 |
| Shell 스크립트 후 | stdout/stderr 내용 있으면 읽기; $? == 0만으로 성공 추론 금지 |
이상 탐지 규칙
명령 실행 후 로그에 ERROR, FAIL, error:, WARN이 포함된 줄이 있으면:
- 멈춘다 — 다음 단계로 진행하지 않는다
- 전후 ≥5줄 context 읽기
- false positive 여부 판단 (문자열 리터럴, 테스트 픽스처 이름 등)
- 실제 이슈이면 수정 후 진행
- 로그가 깨끗하거나 이상이 명시적으로 triaged된 후에만 계속
관련
- code-quality — 파괴적 우회(
--no-verify) 금지 원칙과 연결 - claude-workflow-tiers — 티어별 빌드/테스트 파이프라인