vignette/docs/ops/spreadsheet-implementation-audit-2026-09-09.md
Yun Chan 1306c524c1
Some checks failed
API contract / OpenAPI type drift (push) Failing after 4m46s
회기 집계와 기록 복귀 및 감독 근거 링크 수정
2026-09-09 14:41:54 +09:00

38 lines
5.7 KiB
Markdown

# 개선관리 워크북 구현 정합성 재점검
> 범위: 2026-09-09 KST에 원본 워크북을 읽기 전용으로 다시 확인하고, 원본의 완료 표기와 현재 작업트리의 검증 상태를 분리해 기록한다. 원본 워크북은 수정하지 않았다.
## 원본 기준
- 원본: [개선관리 워크북](https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?pli=1&gid=1294900115#gid=1294900115)
- 다운로드 원본 SHA-256: `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`
- 확인 범위: `개발·기능 이슈` A5:M15, `임상·교육 이슈` A5:M7, `요약` D7 및 14개 요구 항목
- 원본 집계: 완료 13개, 검토 1개(C-001). REQ-001~011과 C-002·C-003은 완료이며 C-001만 검토다.
- 최신 원본에서 `#REF!` 수식 오류를 확인하지 못했다. 과거 11개 항목 replica의 `#REF!`/행 범위 보정 기록은 역사 증거로만 유지한다.
## 요구사항 매핑
| 원본 ID | 원본 상태 | 코드 근거 | 구현·검증 판정 |
|---|---|---|---|
| REQ-001 | 완료 | `apps/api/app/routes/auth.py` | Google 로그인 제한 해제와 계정 복구의 기존 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| REQ-002 | 완료 | `apps/api/app/routes/protocols.py` | 프로토콜 관리의 기존 focused·DB 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| REQ-003 | 완료 | `apps/api/app/persona_read_model.py` | 페르소나 주호소 표시의 기존 DB/browser 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| REQ-004 | 완료 | `apps/api/app/services/feedback_policy.py` | 계정별 AI 피드백 제어의 기존 정책·browser 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| REQ-005 | 완료 | `apps/api/app/routes/sessions.py`, `apps/api/app/session_persistence.py` | 신규 페르소나 pin과 회기 생성의 기존 DB lifecycle 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| REQ-006 | 완료 | `apps/api/app/session_evaluation_input.py` | 피드백 개인정보 비식별화의 기존 focused 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| REQ-007 | 완료 | `apps/api/app/routes/sessions.py` | 종료 뒤 평가 생성·다음 회기 진행의 기존 persistence 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| REQ-008 | 완료 | `apps/api/app/test_engine_health_contract.py` | 원본 기능 완료와 NAS 실제 재부팅 자동복구 smoke는 별개다. 후자는 여전히 소유자 승인 뒤 수행할 운영 게이트이며 이 원본 완료 표기로 닫지 않는다. |
| REQ-009 | 완료 | `apps/web/src/pages/Session.tsx` | 스트림 오류 입력 복원·재시도·부분 턴 미저장을 route fixture browser 44 passed로 재검증했다. 이번 재검증은 build·새 public live 검증·새 배포를 수행하지 않았다. |
| REQ-010 | 완료 | `apps/api/app/session_dashboard_projection.py` | 0턴/client-only 회기가 첫 완료·반복·경험 배지 집계에 포함되던 결함을 기존 완료 집계와 같은 counselor/learner 발화 조건으로 정렬했다. 계약 RED 4건 뒤 GREEN 4건, 지정 API 20건과 API 전체 1108 passed/1 skipped/1 warning, route fixture browser 44 passed를 통과했다. 이번 추가 수정은 build·새 public live 검증·배포를 수행하지 않았다. |
| REQ-011 | 완료 | `apps/api/app/services/calibration_transfer_store.py` | 자기예측 저장·잠금을 route fixture browser 44 passed로 재검증했다. 이번 재검증은 build·새 public live 검증·새 배포를 수행하지 않았다. |
| C-001 | 검토 | `apps/api/app/services/orchestrator.py` | 기술 사전검증과 외부 임상 승인은 다르다. 사례별 검수·청소년 답변·검토자 자격을 포함한 승인·서명 증거가 채워져 `review_complete=true`가 되기 전에는 검토 상태를 유지한다. |
| C-002 | 완료 | `apps/api/app/session_read_model.py` | 첫 회기 라포·개방 질문 점검의 기존 focused 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
| C-003 | 완료 | `apps/api/app/session_dashboard_projection.py` | 훈련 편향 지표의 기존 focused 증거를 보존한다. 이번 재점검에서 새 live 검증은 수행하지 않았다. |
## 현재 로컬 검증과 남은 범위
REQ-010의 API 전체 재검증은 `py -3.11 -m pytest app/ -q`에서 1108 passed, 1 skipped, 1 warning으로 끝났다. 이 전체 범위에는 위 REQ-001~008과 C-001~003의 기존 백엔드 계약도 포함되며, 항목별 과거 focused/live 증거를 현재 live proof로 바꾸지는 않는다. skip은 기존 선택형 격리 DB 테스트이며 새 skip이 아니다. 로그는 `outputs/req-sheet-audit-2026-09-09/api-full-after.stdout.log`에 보존한다.
browser 전체 재검증은 `npx playwright test e2e/uc-session-conversation.spec.ts e2e/calibration-transfer.spec.ts --workers=2`에서 44 passed, 0 failed, 0 skipped로 끝났다. 초기에 12건은 `session_id` query가 없는 exact fixture가 `me?session_id=...` 요청을 받지 못한 것이었고, 2건은 역할이 정해지지 않은 익명 인물의 기대값 drift였다. 제품 privacy guard나 마스킹 코드는 완화하지 않고 query route fixture 6건과 NAME 기대값만 바로잡았다. 이 증거는 route fixture 기반 local proof이며 build·새 public live 검증·배포를 뜻하지 않는다.
2026-09-08 NAS/Pages 배포 증거는 당시 기록으로 보존한다. 이번 문서는 그 기록을 현재 live 검증으로 재사용하지 않으며, REQ-010의 이번 추가 수정은 미배포다.