106 lines
6.2 KiB
Markdown
106 lines
6.2 KiB
Markdown
# REQ-008 CI contract regression and lint required checks
|
|
|
|
- Status: Implemented
|
|
- Type: Testing
|
|
- Priority: High
|
|
- Owner: 렛저장인
|
|
- Source Discovery: `docs/discovery/dcy-007_20260630_mcp-response-contract-ci-contract-versioning.md`
|
|
- Batch: BAT-007
|
|
- Created At (KST): 2026-06-30 18:35 KST
|
|
- Approved At (KST): 2026-06-30 18:56 KST
|
|
- Implemented At (KST): 2026-06-30
|
|
|
|
## 1. 배경
|
|
|
|
REQ-006으로 GitHub Actions 기반 `pytest`/`AppTest`/HTTP smoke/DB safety smoke 게이트는 도입되었지만, MCP 성공 응답 shape 회귀를 자동 차단하는 contract regression gate와 lint required-check 계약은 아직 없다. 또한 branch protection required-check 목록과 synthetic-only CI 불변식이 코드 밖 운영 설정 또는 느슨한 baseline 문장에 머물러 있어, 어떤 게이트가 머지 차단 기준인지 단일 출처가 부족하다. dcy-007 confirmed Discovery에 따라 contract regression과 lint를 CI required-check 계약으로 편입하고, representative synthetic fixture 기반 회귀 검증 및 baseline 문서 정렬을 정의한다.
|
|
|
|
## 2. Intent
|
|
|
|
MCP 응답 shape 회귀와 lint 누락을 사람 리뷰에 의존하지 않고 CI required-check 계약으로 고정한다. 이 REQ의 목적은 representative contract regression과 `ruff` lint를 기존 안정 게이트 위에 추가하여, branch protection이 어떤 job 통과를 머지 조건으로 삼아야 하는지와 synthetic-only 검증 원칙을 단일 delivery 입력으로 만드는 것이다.
|
|
|
|
## 3. 범위
|
|
|
|
### In Scope
|
|
- representative MCP 성공 응답군에 대한 contract/snapshot 회귀 테스트를 도입한다.
|
|
- contract regression을 GitHub Actions required-check 후보 job으로 추가한다.
|
|
- `ruff` 기반 lint gate를 도입하고 required-check 기본안으로 고정한다.
|
|
- required-check 목록을 기존 4개 안정 job + `contract-regression` + `lint`로 문서화한다.
|
|
- synthetic-only CI 불변식과 branch protection/required-check 경계를 baseline 문서에 명시한다.
|
|
|
|
### Out of Scope
|
|
- 모든 MCP 도구 응답군 100% 전수 snapshot 커버리지.
|
|
- browser-screenshot evidence를 CI 필수 차단 게이트로 승격하는 작업.
|
|
- 실제 GitHub branch protection 토글 적용 자체.
|
|
- coverage percent gate, benchmark gate, flaky quarantine 같은 추가 품질 체계.
|
|
|
|
## 4. Requirement
|
|
|
|
### FR-1. Contract regression representative scope
|
|
- contract regression은 1차로 다음 대표 응답군을 다뤄야 한다.
|
|
- `health/status`
|
|
- `list`
|
|
- `report`
|
|
- `mutation success envelope`
|
|
- 각 그룹은 synthetic fixture 기반 고정 입력으로 결정적으로 재현 가능해야 한다.
|
|
- key 삭제, 타입 변경, 구조 변경 같은 비호환 변경이 발생하면 테스트가 실패해야 한다.
|
|
- additive field 추가는 정의된 정책에 따라 허용 가능해야 한다.
|
|
|
|
### FR-2. Synthetic-only contract fixture policy
|
|
- contract regression 테스트는 synthetic representative fixture만 사용해야 한다.
|
|
- fixture는 운영/목록/리포트/변경 결과를 모두 재현할 수 있어야 한다.
|
|
- fixture와 로그에는 운영 DB, 실계좌번호, 실잔액, `raw_payload`, 원본 파일명, 비밀번호가 포함되어서는 안 된다.
|
|
|
|
### FR-3. Lint gate
|
|
- 저장소는 `ruff`를 lint/정적분석 도구로 사용해야 한다.
|
|
- lint는 CI에서 required gate로 실행되어야 한다.
|
|
- 초기 룰셋은 보수적으로 시작하되, 명백한 스타일/정적 오류 회귀를 막을 수 있어야 한다.
|
|
|
|
### FR-4. Required-check contract
|
|
- CI required-check 기본안은 다음 6개 job이어야 한다.
|
|
- `pytest-regression`
|
|
- `dashboard-app-test`
|
|
- `dashboard-http-smoke`
|
|
- `db-safety-smoke`
|
|
- `contract-regression`
|
|
- `lint`
|
|
- 위 job 이름은 branch protection 안정성을 위해 의도 없이 변경되면 안 된다.
|
|
- 실제 GitHub branch protection 설정 적용은 운영자 실행 범위임을 문서에 명시해야 한다.
|
|
|
|
### FR-5. Baseline documentation alignment
|
|
- `docs/interface-contract.md`는 CI contract/tests-lint gap이 해소되는 방향으로 갱신되어야 한다.
|
|
- `docs/project-structure.md`는 required-check contract와 lint/contract-regression job 책임을 반영해야 한다.
|
|
- `docs/runtime-flows.md`는 PR/push → required-check → merge-blocking 흐름과 synthetic-only invariant를 반영해야 한다.
|
|
- 필요 시 runbook은 branch protection setting drift나 local reproduction 절차를 포함해야 한다.
|
|
|
|
## 5. Acceptance Criteria
|
|
|
|
- AC-1: representative MCP 응답군(`health/status`, `list`, `report`, `mutation success envelope`)에 대한 contract regression 테스트가 추가된다.
|
|
- AC-2: 비호환 응답 변경(key 삭제, 타입 변경, 구조 변경)을 주입했을 때 contract regression이 실패하는 검증 경로가 존재한다.
|
|
- AC-3: contract regression은 synthetic fixture만 사용하며 민감정보를 로그/fixture에 포함하지 않는다.
|
|
- AC-4: `ruff` 기반 lint gate가 CI에 추가되고 required gate로 동작한다.
|
|
- AC-5: CI required-check 기본안 6개 job이 문서에 명시되고, 기존 4개 안정 job 이름이 유지된다.
|
|
- AC-6: `docs/interface-contract.md`, `docs/project-structure.md`, `docs/runtime-flows.md`가 contract-regression/lint/required-check/synthetic-only 경계를 반영한다.
|
|
- AC-7: 실제 branch protection 토글 적용은 운영자 실행 범위임이 문서에 명시된다.
|
|
|
|
## 6. Impacted Area
|
|
|
|
- `.github/workflows/ci.yml`
|
|
- `tests/` 및 contract snapshot/fixture 자산
|
|
- `pyproject.toml`
|
|
- `docs/interface-contract.md`
|
|
- `docs/project-structure.md`
|
|
- `docs/runtime-flows.md`
|
|
- 필요 시 `docs/runbooks/`
|
|
|
|
## 7. Notes
|
|
|
|
- 이 REQ는 테스트/게이트/검증 계약을 다루므로 `Testing` 타입으로 관리한다.
|
|
- contract version scheme과 breaking/additive 분류 규칙 자체는 `REQ-007`에서 관리하고, 이 REQ는 그것을 회귀 게이트로 강제하는 경로를 다룬다.
|
|
- representative scope를 우선 도입하고, 전수 응답군 snapshot 확대는 후속 반복으로 남긴다.
|
|
|
|
## 8. Change Log
|
|
|
|
- 2026-06-30 18:35 KST: dcy-007 confirmed 범위를 바탕으로 Proposed 초안을 생성.
|
|
- 2026-06-30 18:56 KST: Discovery 결정사항과 승인 게이트를 재검토해 Approved로 전환.
|
|
- 2026-06-30 KST: BAT-007 implementation/verification evidence 기준으로 Implemented로 전환.
|