chore(harness): Claude Code 하네스 구성 — 안전 가드·규칙 검사·배포 스킬

- .claude/settings.json (공유) 신설, hooks 를 settings.local.json 에서 이동
- bash_guard (PreToolUse): 로컬 스택 기동·운영 DB alembic·_test 아닌 pytest·main 강제 push·위험 rm 차단,
  main push/deploy.sh 는 장중 경고와 함께 확인 요청, backend 커밋 전 유닛 스위트 게이트
- rules_check (PostToolUse): py_compile + CLAUDE.md 규칙(json.dumps, except 후 logger.debug,
  except-pass, 실시간 계층 DB I/O) — diff 추가 라인만
- session_context (SessionStart): 브랜치·미커밋·장 상태·alembic head 주입
- stop_check (Stop): frontend 변경 시 tsc
- auto-orchestrate: 서브에이전트 보고·시스템 알림·질문형 프롬프트 오발동 제거
- /deploy 스킬 + deploy.sh / prod_smoke.sh: 테스트→dev push→main 병합→재기동 감시→공개 API 스모크
- 팀 에이전트·orchestrate 스킬 추적 시작, settings.local.json 추적 해제(.gitignore)
- CLAUDE.md §9 하네스
- 훅 테스트 69 passed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 09:05:35 +09:00
parent 45677c8fbb
commit ea644a37f3
28 changed files with 2782 additions and 204 deletions

View File

@@ -366,6 +366,23 @@ DX(0~100)에 합산형 평활을 적용한 버그. 측정: `up 1361 vs 97 / flat
25. **하드코딩 3건이 남아 있다** — `market_analyzer._NAVER_ML_CHART_DAYS=200`, `_NAVER_LEGACY_DAYS=80`, `_ML_SKIP_LOG_EVERY=50`. config 화가 필요하면 `ML_CHART_DAYS`/`ML_SKIP_LOG_EVERY` 로 편입. `RECOMMENDED_BARS_FOR_PREDICT=120` 은 현재 **강제하지 않는다**(최소 80만 강제) — RSI(Wilder)·EMA 가 재귀라 80~120봉 구간의 학습-추론 정합성은 재학습 후 A-B 로 확인할 것.
26. 종가 0/결측이 중간에 섞인 차트는 피처가 유한해 **여전히 점수가 산출된다**(NaN 문제가 아니라 데이터 품질 문제). 연속 0봉 비율 등 품질 검증은 별도 작업.
## 9. 하네스 (`.claude/`) — 규칙을 훅·스크립트가 강제한다
설정은 `.claude/settings.json`(팀 공유, 커밋 대상). 개인 설정 `.claude/settings.local.json` 은 git 추적 제외 대상이다. 훅은 Python3 표준 라이브러리만 쓰고, 입력 파싱 실패 시 조용히 통과한다.
| 훅 | 시점 | 강제 내용 |
|----|------|----------|
| `bash_guard.py` | PreToolUse(Bash) | **deny**: 로컬 백엔드/`docker compose up` 기동(NAS 와 KIS 앱키 공유 → 토큰 무효화), 운영 DB URL 대상 로컬 alembic, `_test` 아닌 DB 로 pytest, `--allow-network`, main 강제 푸시, 레포루트·backend·.git `rm -rf`, backend 스테이징 시 유닛 스위트 실패한 `git commit`(120초). **ask**: main 갱신 푸시·`deploy.sh` 실행(KST 시각, 장중이면 경고). |
| `rules_check.py` | PostToolUse(Edit/Write) | `backend/**/*.py` 의 py_compile, 그리고 **추가된 라인만** 대상으로 `json.dumps`(§4), `except` 직후 `logger.debug`(§4·§8.1-10), `except Exception: pass`, 실시간 계층의 `AsyncSessionLocal(`/`.commit(`(§3.1; SELECT 전용 예외는 `# DB-READ-EXCEPTION` 마커 또는 §3.2 ③ 함수). 위반은 exit 2 로 Claude 에게 되돌린다. 라우터 `require_api_key` 누락은 경고만. |
| `session_context.py` | SessionStart | 브랜치·미커밋·origin/main 대비·KST 장 상태·alembic head·금지/배포/테스트 3줄 요약 주입. |
| `stop_check.py` | Stop | frontend/src 변경 시 `npx tsc --noEmit`(90초). 실패 시 exit 2. |
| `auto-orchestrate.py` | UserPromptSubmit | 작업성 프롬프트에 오케스트레이션 주입. 서브에이전트 보고·시스템 알림·질문형 프롬프트는 제외, `#직접` 으로 우회. |
- **배포**: `/deploy` 스킬 → `.claude/scripts/deploy.sh`(worktree 테스트 → push dev → 임시 worktree 에서 `--no-ff` 병합·push main → 재기동 감시 → 스모크). `--watch-only`, `--dry-run`, `--no-test`(경고). 스모크 단독: `.claude/scripts/prod_smoke.sh`.
- **우회**: 훅이 막은 것을 에이전트가 환경변수·명령 변형으로 피하지 말 것. 정당한 예외는 **사용자가 직접** 훅을 끄거나 명령을 실행한다(`ask` 는 사용자 승인 프롬프트). 규칙 자체가 틀렸으면 훅과 이 절을 함께 고친다.
- **훅 테스트**: `.venv/bin/python -m pytest .claude/hooks/tests -q` (backend 테스트와 분리, DB 불필요).
- 한계: 공휴일은 장 상태 판정에 반영되지 않는다(`market_schedule` 과 동일).
*마지막 업데이트: 2026-09-27 — 죽은 코드 2,695줄 제거 / 지표·사이징 단일화(수치 무변경 증명) / 파라미터 3중 소스 정합 + alembic 0012 / 섹터 매핑 44→747종목 / 백테스트를 실전 로직에 정합(ADX 14배 발산·RSI SMA↔Wilder·1봉 지연) / 미국 상수 13개 config 편입 / 테스트 실 KIS 호출 차단(conftest 신설) / 유닛 스위트 559 passed·0 failed*
*2026-09-28 — 운영 파라미터 alembic 0012 배포 완료(RSI 30→46, 손절 -6%→-7%) / ML 앙상블 전면 미작동 수정(시계열 역방향·시퀀스 워밍업 NaN·`except Exception: pass`) + 회귀 테스트 20건 / 유닛 스위트 579 passed·0 failed. **ML 은 재학습 전까지 신뢰 금지(§8.5-20).***