# S-CANVAS 개발 사이클 (Red → Green)

> **피드백 #6/#7/#8**: 사용자가 명시한 개발 관리 원칙. 이 문서는 그 원칙을 코드화.

## 1. 개발 사이클 — Red → Green → Push

```
[로컬]                       [원격]
       ↓
   코드 작성/수정
       ↓
   ruff check (자동 fix)  ← Red 단계: 린트 위반 0
       ↓
   pytest (회귀 + 단위)   ← Red → Green 전환: 모든 테스트 통과
       ↓
   git commit             ← pre-commit hook이 ruff 재검사
       ↓
   git push               ← Gitea Actions가 ruff + pytest 재실행
       ↓                     모두 Green 시에만 main에 머지
   [성공 → 다음 작업]
   [실패 → Red 복귀]
```

**핵심 원칙**: Red가 켜진 상태로는 push 금지. main은 항상 Green.

## 2. 새 버그 발견 시 (피드백 #7)

> "버그가 식별되면 수정 후 재발하지 않도록 하는 알고리즘도 필요"

**알고리즘**:
1. 버그 재현 코드 → `tests/test_regressions.py` 에 **먼저** 추가 (Red 상태).
2. pytest 실행 → 새 테스트 fail 확인 (재현 확인).
3. 수정 코드 작성 → pytest 통과 확인 (Green).
4. commit (테스트 + 수정 함께).
5. 이후 누군가가 같은 버그를 재도입하려 하면 → CI에서 즉시 catch.

이게 "재발 방지 알고리즘". 메모만 적는 게 아니라 **실행 가능한 가드**로.

## 3. 코드 퀄리티 장치 (피드백 #8)

| 단계 | 도구 | 무엇을 차단 |
|---|---|---|
| 작성 중 | ruff (LSP/IDE) | 실시간 린트 |
| commit 시 | pre-commit | ruff + 위생 + 비밀 누출 |
| push 시 | Gitea Actions | ruff + py_compile + pytest 매트릭스 |
| 코드 리뷰 | code-reviewer subagent | 비전 위반/구조 함정 |

## 4. 시작하기

```powershell
cd D:\2026\PROGRAM\1_S-CANVAS

# uv 환경
uv venv .venv313 --python 3.13
.\.venv313\Scripts\activate
uv pip install -e ".[py313,dev]"

# pre-commit 등록
pre-commit install
pre-commit install --hook-type pre-push   # push 직전 pytest 추가 게이트

# 테스트 한 번 돌려서 환경 확인
pytest -ra
ruff check
```

## 5. 새 기능/버그 수정 워크플로

```powershell
# 0. 기능 브랜치
git checkout -b feature/my-thing

# 1. (버그 수정인 경우만) 회귀 테스트 먼저 추가 → Red 확인
#    tests/test_regressions.py 에 새 함수 추가
pytest tests/test_regressions.py::test_new_thing  # → fail (정상)

# 2. 코드 작성/수정

# 3. ruff 자동 수정
ruff check --fix

# 4. pytest 통과 확인 (Green 도달)
pytest -ra

# 5. commit (pre-commit이 ruff 재검사)
git add -p
git commit -m "fix: <설명>"

# 6. push (pre-push hook이 pytest 재실행)
git push origin feature/my-thing

# 7. PR 만들기 → Gitea Actions가 매트릭스 검증 → main 머지
```

## 6. 자동 push (피드백 #6 — 본 라운드 미구현, 다음 라운드)

현재는 사람이 `git push` 실행. 다음 라운드 후보:

- **옵션 A (보수)**: `pre-push` 훅에서 ruff + pytest pass 시 자동 `git push` (사람 한 번 더 확인 필요).
- **옵션 B (적극)**: 로컬 `watch` 데몬 — Green 도달 직후 자동 push.
- **옵션 C (안전)**: feature 브랜치만 자동 push, main은 항상 PR.

옵션 C 권장. main 보호는 Gitea repo settings → Branch Protection 으로 강제.

## 7. 서브에이전트 활용

`.claude/agents/` 안 7개 specialized agent — Claude Code 세션에서 자동/명시 호출:
- `product-vision-keeper` — 큰 결정 전 검토
- `ux-designer` — UI 변경
- `performance-guardian` — 성능 회귀 의심
- `library-architect` — 새 구조물/플러그인
- `pyvista-renderer` — 3D 시각 품질
- `code-reviewer` — 코드 변경 후 비판
- `INSTALL_AND_USE.md` — 설치/사용 가이드

`.claude/agents/INSTALL_AND_USE.md` 참고.

## 8. 산출물 (이번 라운드 신규)

- `harness/crash_logger.py` — 크래시 로그 + faulthandler (#1)
- `scanvas_maker.py` `_TIN_EARTH_CMAP` — 파란색 없는 TIN 컬러맵 (#3)
- `pyproject.toml` + `UV_GUIDE.md` — uv 마이그레이션 (#5)
- `ARCHITECTURE_PLAN.md` — Core/Plugin 분리 설계 (#10)
- `PERFORMANCE_BASELINE.md` — 19 핫스팟 + 측정 plan (#11)
- `UI_REDESIGN_PLAN.md` — single-window 재설계 (#4)
- `tests/` + `.pre-commit-config.yaml` + `.gitea/workflows/ci.yml` + 본 문서 — 개발 사이클 인프라 (#6/#7/#8)
- `~/.claude/projects/.../memory/feedback_no_ab_pingpong.md` — A/B 무한루프 금지 영구 룰 (#9)
