## 목표 AI 앱의 핵심 회귀와 환경별 선택 검증을 PR 단계에서 구분해 확인할 수 있는 자동 CI를 구축합니다. ## 완료된 작업 ### Core PR CI - [x] `.github/workflows/ci.yml` 추가 - [x] `develop`, `main` 대상 Pull Request에서 자동 실행 - [x] Python 3.12와 고정 uv 버전 사용 - [x] `uv sync --frozen --extra dev`로 의존성 재현 - [x] 외부 LLM·OCR·Intent 모델을 비활성화한 결정론적 환경 구성 - [x] 로컬 `.env`를 읽지 않도록 `FOWOCO_ENV_FILE=/dev/null` 적용 - [x] core marker 제외 기준 명시 - [x] `app + tests` Ruff 오류 0건 - [x] 핵심 pytest 기준선 통과 ### Qdrant 계약 - [x] `language-retrieval` 선택 의존성 별도 설치 - [x] Qdrant 관련 테스트에 `qdrant_integration` marker 적용 - [x] Qdrant 계약 전용 Ubuntu Job 구성 - [x] 관련 계약 테스트 8개 통과 ### Windows OCR 계약 - [x] `windows_ocr` marker 등록 - [x] non-Windows에서 PowerShell 부재를 명시적으로 구분 - [x] Windows runner 전용 Job 구성 - [x] Secret 없이 로컬 기록 서버를 사용하는 계약 테스트 2개 통과 ### 품질 경계와 Workflow 운영 - [x] AI 앱 `app + tests`를 PR Ruff 기준으로 고정 - [x] 내장 `hwp-editor`와 운영 스크립트 기존 부채를 앱 판정에서 분리 - [x] PR CI와 `main` 배포 Workflow 책임 분리 - [x] 동시 갱신 시 이전 CI 실행 자동 취소 - [x] Core·Qdrant·Windows OCR Check를 각각 독립된 이름으로 표시 ## 최종 검증 ```text Core pytest 655 passed, 3 skipped, 16 deselected Qdrant contract 8 passed PowerShell OCR 2 passed Ruff app + tests passed GitHub Actions 3 checks passed ``` ## 의도적으로 분리한 범위 - BERT·A.X·LLM 실모델 검증은 Token과 모델 캐시가 필요한 Staging/수동 Smoke Test로 유지 - Required Check 강제는 현재 저장소 보호 규칙 정책에서 사용하지 않으므로 이번 코드 작업에서 제외 - `hwp-editor`·운영 스크립트의 전체 Ruff 정리는 별도 소유권 범위 ## 연결 PR - #66: 구현을 `develop`에 반영 - #67: 검증된 변경을 `main`에 반영 PR #67이 `main`에 병합되면 이 이슈를 완료 처리합니다.
목표
AI 앱의 핵심 회귀와 환경별 선택 검증을 PR 단계에서 구분해 확인할 수 있는 자동 CI를 구축합니다.
완료된 작업
Core PR CI
.github/workflows/ci.yml추가develop,main대상 Pull Request에서 자동 실행uv sync --frozen --extra dev로 의존성 재현.env를 읽지 않도록FOWOCO_ENV_FILE=/dev/null적용app + testsRuff 오류 0건Qdrant 계약
language-retrieval선택 의존성 별도 설치qdrant_integrationmarker 적용Windows OCR 계약
windows_ocrmarker 등록품질 경계와 Workflow 운영
app + tests를 PR Ruff 기준으로 고정hwp-editor와 운영 스크립트 기존 부채를 앱 판정에서 분리main배포 Workflow 책임 분리최종 검증
의도적으로 분리한 범위
hwp-editor·운영 스크립트의 전체 Ruff 정리는 별도 소유권 범위연결 PR
develop에 반영main에 반영PR #67이
main에 병합되면 이 이슈를 완료 처리합니다.