회기 무발화 0턴 분리, 자기예측 락 불변식 및 TDD 회귀 검증 완료
Some checks failed
API contract / OpenAPI type drift (push) Failing after 3m27s
Some checks failed
API contract / OpenAPI type drift (push) Failing after 3m27s
This commit is contained in:
parent
a479db7a5a
commit
a0311c5957
100 changed files with 4884 additions and 11210 deletions
|
|
@ -447,6 +447,8 @@ session lifecycle을 유지하며, future Node read API는 이 read-model contra
|
|||
제외한다. `growth.training_exposure`는 종료 회기만 집계하고 4회 미만이면 `insufficient`, 4회 이상에서
|
||||
최다 페르소나 비중이 0.75 이상이면 `훈련 집중 주의`, 그 밖에는 `balanced`로 표시한다. 투명한 노출 비중이지
|
||||
공정성·임상 진단이 아니다. 성취는 공식 등급/수료가 아니라 실제 연습 milestone만 표시한다.
|
||||
- 대시보드 DTO와 builder는 `app/session_dashboard_projection.py`가 소유한다. 공통 세션 projection은
|
||||
`app/session_projection.py`가 소유하며, 라우트는 조회·권한 경계만 조합한다.
|
||||
- `GET /sessions/cases?persona_code=...` — 같은 NPC의 사례별 누적 회기·상담자에게 보인 턴·누적
|
||||
회기 시간과 진행 중 회기를 DB 전체에서 집계한다. 런타임 추정값은 반환하지 않으며 DB read가 실패하면
|
||||
503으로 닫아 UI가 이어가기를 열지 않는다. `GET /sessions/cases/{case_id}/memory`는 foldout을 연
|
||||
|
|
@ -581,8 +583,16 @@ GET {ENGINE_URL}/ready|/health — readiness/liveness
|
|||
- 영속/폴백 분기는 `app/runtime_policy.py`(`runtime_fallback_allowed` / `require_runtime_fallback_allowed`)가
|
||||
게이트. 라우트는 `session_persistence`(DB) → 실패 시 store(in-proc) 순으로 시도한다.
|
||||
- 회기 평가 저장은 `SessionEvaluationWrite`가 `status/source/scope/stage/payload/error` write packet을
|
||||
소유한다. `routes/sessions.py`와 `routes/eval.py`는 같은 named packet을 만들어 저장하고, DB SQL과
|
||||
fallback cache record는 `session_persistence.py`가 유지한다.
|
||||
소유한다. `routes/sessions.py`와 `routes/eval.py`는 같은 named packet을 만들어
|
||||
`app/session_evaluation_repository.py`의 DB SQL·cache 경계로 넘긴다. 공통 정규화·마스킹 값은
|
||||
`app/session_persistence_values.py`가 소유한다.
|
||||
- outcome 계열 저장소의 canonical hash/value/public row/created role은
|
||||
`app/services/outcome_repository_values.py`가 단일 소유한다. `practice_competency.py`는 공통 역량
|
||||
분류만 소유하고 각 저장소의 기존 예외를 바꾸지 않는다. 인증 projection·admin 일별 mapper와 voice metadata
|
||||
builder도 각 route/service 경계에 남긴다.
|
||||
- text/voice 경로가 공유하는 `TurnMemory` 조립은 `app/session_turn_memory.py`의 순수
|
||||
`build_turn_memory()`가 맡는다. recall summary·pinned facts·client-visible recent turns·KB behavior cues의
|
||||
네 필드만 조립하며, time/cache/scenario fetch와 session lifecycle은 기존 경계에 유지한다.
|
||||
|
||||
### 2.12 페르소나 카탈로그 — `app/persona_repository.py`
|
||||
|
||||
|
|
@ -735,6 +745,13 @@ React 19 + Vite. 라우팅은 `apps/web/src/App.tsx`(react-router-dom).
|
|||
- `App.tsx`는 모든 역할 페이지를 `lazy()`로 로드하고 공통 `Suspense` 부트 경계를 사용한다. 페이지별 순수 표시 계산은
|
||||
`pages/*/model.ts`, 브라우저 음성 캡처는 `pages/session/voiceCapture.ts`, 페르소나 이름·난도·아바타 팔레트는
|
||||
`lib/personaViewModel.ts`가 소유해 라우트 컴포넌트의 API/상태/렌더 책임과 분리한다.
|
||||
- `pages/Session.tsx`는 회기 lifecycle과 API/상태 전이를 유지한다. 표시 타입·파생 계산은
|
||||
`pages/session/sessionViewModel.ts`, 브라우저 캡처와 status 표시는 `pages/session/voiceCapture.ts`가
|
||||
소유한다.
|
||||
- `lib/focusTrap.ts`는 Tab 순환과 DOM 조회만 소유하며 initial focus·Escape·lifecycle은 `Session`에 남긴다.
|
||||
공통 동맹 scale은 `pages/session-review/allianceScale.ts`가 소유하고 `AllianceCheckpointPrompt`와
|
||||
`AlliancePulseCard`가 사용한다. 잠긴 자기점수 표시는 `AlliancePulseCard`의 `LockedScores`, 관리자 승인
|
||||
제출 제어는 `ContinuousImprovementCockpit`의 `ApprovalSubmitControls`가 소유한다.
|
||||
- Pages 배포 전환 중 열린 탭이 삭제된 lazy 청크를 요청하면 `lib/chunkRecovery.ts`가 Vite
|
||||
`vite:preloadError`를 받아 현재 경로에서 문서 재로드를 1회만 수행한다. 정상 라우트 렌더 뒤 재시도 표식을
|
||||
지우고, 같은 경로의 연속 실패는 무한 재로드하지 않고 `RouteErrorBoundary`의 수동 복구 액션으로 넘긴다.
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@ DB·엔진 없이도 UI/로그인/페르소나/세션 생성까지는 동작한
|
|||
|
||||
## 1. 사전 준비
|
||||
|
||||
- **Python 3.11** (운영 스크립트가 Python 3.11 기준). 가상환경 권장.
|
||||
- **Python 3.11** (운영 스크립트가 Python 3.11 기준). Windows의 기본 `python`이 다른 버전을 가리키거나 pytest가 없을 수 있으므로 `py -3.11`을 우선 쓴다. 가상환경 권장.
|
||||
- **Node.js 22 + npm** — CI와 같은 기준. newer LTS는 별도 재검증 전까지 기준선으로 쓰지 않는다.
|
||||
- (선택) **Docker Desktop** — `infra/docker-compose.yml` 전체 스택을 띄울 때만.
|
||||
- (선택) **`claude` CLI** — `claude_cli` 실행. 설치 후 로그인되어 있어야 한다.
|
||||
|
|
@ -155,7 +155,7 @@ DB·엔진 없이도 UI/로그인/페르소나/세션 생성까지는 동작한
|
|||
|
||||
```powershell
|
||||
# 저장소 루트에서
|
||||
python -m venv .venv
|
||||
py -3.11 -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1 # PowerShell 활성화
|
||||
python -m pip install -r apps\api\requirements.txt
|
||||
```
|
||||
|
|
@ -676,8 +676,8 @@ RAG 임베딩/리랭커 의존성은 기본 이미지에 설치하지 않는다.
|
|||
```powershell
|
||||
# 백엔드 (apps/api)
|
||||
cd apps\api
|
||||
python -m pytest app/ -q # 2026-08-28 전체 실행 1002 passed
|
||||
python -m pytest engine_gateway\ -q # 2026-08-28 전체 실행 68 passed
|
||||
py -3.11 -m pytest app/ -q # 2026-08-28 전체 실행 1002 passed
|
||||
py -3.11 -m pytest engine_gateway\ -q # 2026-08-28 전체 실행 68 passed
|
||||
|
||||
# 웹 (apps/web)
|
||||
cd apps\web
|
||||
|
|
|
|||
|
|
@ -15,8 +15,8 @@ Vignette 저장소의 모든 검증 수단(백엔드 단위 테스트, 웹 타
|
|||
|
||||
| 검증 | 작업 디렉터리 | 명령 | DB | API(8000) | 웹(5173) | 엔진GW(9099) | 브라우저 | 현재 통과 |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 백엔드 단위 테스트 | `apps/api` | `python -m pytest app/ -q` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | 2026-08-29 전체 실행 1074 passed / 1 skipped |
|
||||
| 엔진 게이트웨이 테스트 | `apps/api` | `python -m pytest engine_gateway/ -q` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | 2026-08-28 전체 실행 68 passed |
|
||||
| 백엔드 단위 테스트 | `apps/api` | `py -3.11 -m pytest app/ -q` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | 2026-09-07 전체 실행 1090 passed / 1 skipped / 1 warning |
|
||||
| 엔진 게이트웨이 테스트 | `apps/api` | `py -3.11 -m pytest engine_gateway/ -q` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | 2026-09-07 전체 실행 71 passed / 1 warning |
|
||||
| API 타입 생성 체크 | `apps/web` | `npm run check:api-types` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||
| 웹 타입체크 | `apps/web` | `npm run typecheck` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||
| 웹 빌드 | `apps/web` | `npm run build` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||
|
|
@ -25,10 +25,16 @@ Vignette 저장소의 모든 검증 수단(백엔드 단위 테스트, 웹 타
|
|||
핵심 원칙: **단위 테스트(pytest)와 타입체크/빌드는 외부 서비스 없이 단독 실행된다.**
|
||||
**E2E만 풀스택(DB+API+웹+브라우저)을 요구한다.** 아래 각 절에서 근거와 절차를 설명한다.
|
||||
|
||||
2026-09-07 앱 전체 실행의 1 skipped는 기존 선택형 격리 DB 테스트
|
||||
`test_admin_usage_postgres.py`가 `VIGNETTE_USAGE_TEST_DATABASE_URL` 미설정일 때 건너뛰는 경우다. 새 skip은
|
||||
아니며, warning 1건은 통과 수와 분리해 기록한다.
|
||||
|
||||
---
|
||||
|
||||
## 1. 백엔드 단위 테스트 (pytest)
|
||||
|
||||
Windows에서 기본 `python`이 Python 3.11이 아니거나 pytest를 갖지 않을 수 있다. 이 저장소의 기준은 `py -3.11`이며, 새 가상환경은 `py -3.11 -m venv .venv`로 만든 뒤 활성화한다. 특정 사용자 절대경로를 문서나 명령에 넣지 않는다.
|
||||
|
||||
### 1.1 대상과 구성
|
||||
|
||||
- 작업 디렉터리: `apps/api`
|
||||
|
|
@ -42,15 +48,15 @@ Vignette 저장소의 모든 검증 수단(백엔드 단위 테스트, 웹 타
|
|||
|
||||
```sh
|
||||
# apps/api
|
||||
python -m pytest app/ -q # 앱 단위 테스트: 2026-08-29 전체 실행 1074 passed / 1 skipped
|
||||
python -m pytest engine_gateway/ -q # 게이트웨이 단위 테스트: 2026-08-28 전체 실행 68 passed
|
||||
py -3.11 -m pytest app/ -q # 앱 단위 테스트: 2026-09-07 전체 실행 1090 passed / 1 skipped / 1 warning
|
||||
py -3.11 -m pytest engine_gateway/ -q # 게이트웨이 단위 테스트: 2026-09-07 전체 실행 71 passed / 1 warning
|
||||
```
|
||||
|
||||
수집만 빠르게 확인하려면:
|
||||
|
||||
```sh
|
||||
python -m pytest app/ --collect-only -q
|
||||
python -m pytest engine_gateway/ --collect-only -q
|
||||
py -3.11 -m pytest app/ --collect-only -q
|
||||
py -3.11 -m pytest engine_gateway/ --collect-only -q
|
||||
```
|
||||
|
||||
수집량은 위 명령의 현재 출력으로 확인한다. `--collect-only` 숫자는 통과 수가 아니므로 실행 결과와 섞어
|
||||
|
|
@ -80,7 +86,7 @@ python -m pytest engine_gateway/ --collect-only -q
|
|||
|
||||
#### 개선관리 워크북 focused 증거 (2026-08-27~28)
|
||||
|
||||
아래는 전체 API 1074 passed/1 skipped·gateway 68 passed와 별도로 해당 계약을 좁혀 실행한 확정 증거다. 같은 묶음의 테스트가 여러 요구사항
|
||||
아래는 2026-09-07 전체 API 1090 passed/1 skipped/1 warning·gateway 71 passed/1 warning와 별도로 해당 계약을 좁혀 실행한 확정 증거다. 같은 묶음의 테스트가 여러 요구사항
|
||||
경계를 함께 검증할 수 있으므로 숫자를 요구사항별 전체 합계로 더하지 않는다.
|
||||
|
||||
| 항목 | focused 명령/파일 | 확인 결과 |
|
||||
|
|
@ -305,7 +311,9 @@ VITE_API_BASE=http://127.0.0.1:8000 npm run e2e # 프록시 대신 API
|
|||
- `npx playwright test`를 직접 실행하면 로컬에서 세 프로젝트가 같은 worker pool에 섞일 수 있다.
|
||||
전체 게이트는 반드시 `npm run e2e`, focused DB/engine 게이트는 프로젝트와 worker를 명시한
|
||||
`npx playwright test --project=chromium-single-run --workers=1 --grep "..."`을 사용한다.
|
||||
- 실패 시 trace(첫 재시도)·스크린샷·비디오를 `node_modules/.tmp/`에 남긴다.
|
||||
- 기본 캡처는 `testInfo.outputPath(...)`로 `node_modules/.tmp/` 아래에 남긴다. 실패 시 trace(첫 재시도)·스크린샷·비디오도 같은 임시 결과 경로를 사용한다.
|
||||
- 날짜가 붙은 `docs/ops/evidence/` 증거는 명시적 검토·승격이 있을 때만 이 임시 산출물에서 복사한다. 자동 보존하지 않는다.
|
||||
- `E2E_EVIDENCE_DIR`를 명시하면 `self-directed-learning-loop` 캡처만 해당 디렉터리에 현재 파일명으로 export한다. 날짜·승격 의미를 자동 부여하지 않는다.
|
||||
|
||||
### 3.6 실측 테스트 개수 (현재)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue