회기 집계와 기록 복귀 및 감독 근거 링크 수정
Some checks failed
API contract / OpenAPI type drift (push) Failing after 4m46s

This commit is contained in:
Yun Chan 2026-09-09 14:41:54 +09:00
parent aa951c6c4a
commit 1306c524c1
20 changed files with 4631 additions and 60 deletions

View file

@ -4,16 +4,16 @@
> 2026-09-07 이전 완료 기록과 장문 이력은 [정리 전 백로그 원문](../archive/project-cleanup-2026-09-07/backlog-2026-06-26-before-cleanup.md)에 보존했다.
> 2026-09-01 NAS 배포는 당시 [배포 증거](./evidence/nas-prod-deploy-2026-09-01.json)로 완료 기록을 남겼으며, 현재 live 상태 주장이나 후속 게이트 완료 선언이 아니다.
## 신규 제품 이슈 — 워크북 원본 보존형 접수
## 제품 이슈 — 최신 워크북 원본과 로컬 재검증
> 원본: [개선관리 워크북](https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?gid=351278076#gid=351278076) `개발·기능 이슈` 행 13~15, 2026-09-07 수집 SHA-256 `625281e72067ae2aea402f2fe932b4f593b7905c35f8a9740cf346c7f077c812`. 원본 14건은 완료 9·기존 gate 2·신규 3으로 로컬 분류한다. 외부 원본의 기존 대기와 로컬 DONE 불일치는 동기화 대기이며, 원본 문서를 이 백로그 작업으로 수정하지 않는다.
> 최신 원본: [개선관리 워크북](https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?pli=1&gid=1294900115#gid=1294900115)를 2026-09-09 읽기 전용으로 재점검했다. 다운로드 원본 SHA-256 `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`, 14개 항목은 완료 13·검토 1(C-001)이며 REQ-008~011도 완료다. [항목별 구현 매핑](./spreadsheet-implementation-audit-2026-09-09.md)에서 원본 상태와 로컬 재검증을 분리한다. 과거 9 완료·2 검토, 신규 3 대기, 원본 `#REF!` 주장은 당시 11개 항목 replica의 역사 기록이며 최신 원본 상태가 아니다. 원본은 수정하지 않는다.
| ID | 원본 사실 | 조치 및 결과 | 완료 조건 | 검증 증거 |
|---|---|---|---|---|
| REQ-009 | 중요·대기. 상담 중 “엔진 연결 - 내담자 응답을 생성하지 못했습니다. 입력 내용은 복원했습니다.” 뒤 진행 불가. | 스트림 중단 오류 시 입력 복원, 부분 턴 미저장 안전 보장, 인라인 재시도 및 닫기 버튼 추가, voiceStatus idle 복원 완료. | 입력 복원, 부분 턴 미저장, 동일 회기 재시도 성공 증명. | 단위/Playwright 통과 및 실서버 헤드풀 E2E 검증. [headful-02](./evidence/headful-02-session-multi-turn.png) |
| REQ-010 | 중요·상태 공란. 시작 직후 창닫기 회기가 완료 회기로 카운트될 우려와 잘못 생성한 미완료 회기의 삭제/재시작 요청. | 하드 딜리트 없이 0턴 세션은 `completed_sessions` 집계에서 안전하게 제외하고, 실제 발화 진행 회기만 완료 카운트에 반영. | 무턴 중단 제외, 정상 완료 반영, 기존 데이터 보존 검증. | 헤드풀 브라우저 2턴 완료 시 +1 및 0턴 즉시 종료 시 유지 검증 완료. [headful-05](./evidence/headful-05-learner-home-after-completed.png), [headful-06](./evidence/headful-06-learner-home-zero-turn-verified.png) |
| REQ-011 | 일반·상태 공란. 첫 자기예측 이유 입력 뒤 버튼 오류로 저장·리뷰 완료·다음 회기가 막힘. 워크북 M15의 [연구팀 첨부 수집본](./evidence/req011-prediction-error-2026-09-07.png)은 HTTP 422 `prediction revision violated provenance or history invariants`를 보인다. | OAS G5 자기예측 시 legacy instrument ID 정규화 및 scoped block ID 일치화로 HTTP 422 해소. 1차 예측 저장 및 잠금 완료. | 정상 저장, 중복 방지, 리뷰 진행·다음 회기 가능, 평가 공개 순서를 함께 증명. | 헤드풀 브라우저 리뷰 피드백 탭에서 1차 예측 저장 및 잠금 완료. [headful-04](./evidence/headful-04-review-calibration-locked.png) |
| SRC-001 | 원본 워크북 정합성 OPEN. `요약!B16:B19``COUNTIF(#REF!)`, 개발 상태 집계 범위 `I5:I14`가 REQ-011 행 15를 놓침. | 개선관리 워크북 replica 수식 (#REF! 제거, 범위 `$I$5:$I$15`, `$B$5:$B$15`) 보정 완료. | 요약 수식·상태 집계가 14건을 반영하고 로컬 분류와 차이를 설명. | 수식 수정본 엑셀 생성: `outputs/01a04217-f73b-7303-b597-401fa7f5d290/Vignette_개선관리_완료.xlsx` |
| REQ-009 | 원본 완료. | 스트림 오류 입력 복원·부분 턴 미저장·재시도/닫기·음성 상태 복원을 local browser 재검증으로 수용했다. | 배포 상태 분리. | `uc-session-conversation`·`calibration-transfer` route fixture browser 44 passed/0 failed/0 skipped. build·새 public live 검증·배포는 수행하지 않았다. |
| REQ-010 | 원본 완료. | 0턴/client-only 회기가 첫 완료·반복·경험 배지에 포함되던 결함을 기존 완료 집계와 같은 counselor/learner 발화 조건으로 정렬했다. | 배포 상태 분리. | 계약 RED 4건→GREEN 4건, 지정 API 20건, API 전체 1108 passed/1 skipped/1 warning, route fixture browser 44 passed/0 failed/0 skipped. build·새 public live 검증·배포는 수행하지 않았다. |
| REQ-011 | 원본 완료. | 자기예측 저장·잠금을 local browser 재검증으로 수용했다. | 배포 상태 분리. | `uc-session-conversation`·`calibration-transfer` route fixture browser 44 passed/0 failed/0 skipped. build·새 public live 검증·배포는 수행하지 않았다. |
| SRC-001 | 역사 replica 수식 보정. | 과거 replica의 `#REF!`와 15행 집계 범위 보정은 보존한다. | 최신 원본 오류로 오인하지 않는다. | 과거 수정본: `outputs/01a04217-f73b-7303-b597-401fa7f5d290/Vignette_개선관리_완료.xlsx` |
REQ-009 초기 검증 명령:
@ -24,7 +24,7 @@ cd ../web
npx playwright test e2e/uc-session-conversation.spec.ts --grep '스트림 도중 오류|done 없이' --project=chromium-desktop --workers=1
```
2026-09-07 Python 3.11 source-only 묶음은 `test_session_turn_persistence.py`, `test_calibration_transfer_store.py`, `test_session_continuity_guard.py`에서 78 passed와 `PendingDeprecationWarning` 1건이었다. 이는 REQ-009~011의 재현·원인 해결·운영 증거가 아니다.
2026-09-07 Python 3.11 source-only 묶음은 `test_session_turn_persistence.py`, `test_calibration_transfer_store.py`, `test_session_continuity_guard.py`에서 78 passed와 `PendingDeprecationWarning` 1건이었다. 이는 당시 증거이며 REQ-009~011의 현 재검증이나 운영 증거가 아니다.
## P0 운영 게이트
@ -64,10 +64,11 @@ npx playwright test e2e/uc-session-conversation.spec.ts --grep '스트림 도중
| MIGRATION-001 | idempotent DB migration runner | init SQL과 runner의 역할 경계·인프라 영향·소유자 승인 |
| OPS-001 | 운영 티켓 자동 분류 | 관리자 승인·audit 경계를 갖춘 구현 패킷 |
| E2E-001 | 전 기능 E2E 후속 분류 | focused 범위의 locator 18건 교정·keyboard 1건 해결 뒤 `npm run e2e`에서 범위 밖 케이스를 실행하고, 실패별 재현·원인·수정 명령을 분류한다. 과거 sweep 실패를 오늘 결함으로 단정하지 않으며 실API/DB·장치 검증은 fixture 결과와 분리한다. |
| CUA-128 | 실제 배포 Computer Use 재검증 | 128 시나리오 카탈로그 생성은 완료했지만 전체 실배포 검증은 미완료다. 일반 학습자 로그인·교차 역할 차단·P4 추천과 허용된 관리자 P16 1개·학습자 P4 1개 회기 종료를 확인했으나 H09·T18은 local 수정 증거 뒤 배포 재검증이 열려 있다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증이 남아 있다. |
## 완료 기록 경계
2026-09-01 A 경로의 NAS 배포, migration 20/21/22 적용, OAuth 실계정 회기 E2E와 당시 backup sidecar 첫 실행은 완료 이력이다. 2026-09-08에는 Forgejo master `a0311c59`/`d9bb5b36`의 NAS Production 컨테이너 교체와 Cloudflare Pages 배포, 사전 DB 덤프(12MB) 확보 및 0턴 세션 분리·OAS calibration bounds/lock·composer 복원 등 TDD 회귀 검증(API 1104 passed)을 완료했다. B3 및 B3-신규의 소유자 결정과 완료된 구현도 archive snapshot에 보존한다. `CLEANUP-001`은 84 regular source와 supplementary 4 files·junction 4개의 대조 뒤 `outputs/local-history/retained-sources-2026-09-07/`으로 가역 보존 이동을 마쳤고 영구 삭제는 0건이다. `RUNTIME-001`은 Windows public-runtime/watchdog scripts를 복구 경로로 보존하기로 결정했으며 이 PC의 두 Disabled Scheduled Task는 운영 서버 다운을 뜻하지 않는다. `REFACTOR-001``sessionViewModel` 분리와 `voiceCapture` 책임 유지를 수용했고, lifecycle setter bag hook은 채택하지 않았다. Space retry→pause와 empty-audio fixture를 교정했으며, `learnerFeedbackEnabled:true` 누락으로 숨던 review feedback UI는 fixture 보완 뒤 focused login→review 1 passed(exit 0)로 확인했다. 제품 feedback guard는 유지했다. `REFACTOR-002`는 repository와 persistence values로 평가 저장 경계를 분리했다. 열린 백로그에 완료 이력을 다시 적지 않는다.
2026-09-01 A 경로의 NAS 배포, migration 20/21/22 적용, OAuth 실계정 회기 E2E와 당시 backup sidecar 첫 실행은 완료 이력이다. 2026-09-08 Forgejo master `a0311c59`/`d9bb5b36`의 NAS Production 컨테이너 교체, Cloudflare Pages 배포, 사전 DB 덤프(12MB), 0턴 세션 분리·OAS calibration bounds/lock·composer 복원 TDD(API 1104 passed)는 당시 배포 증거다. 이는 2026-09-09의 새 live 검증이나 현재 작업트리의 배포 상태를 뜻하지 않는다. B3 및 B3-신규의 소유자 결정과 완료된 구현도 archive snapshot에 보존한다. `CLEANUP-001`은 84 regular source와 supplementary 4 files·junction 4개의 대조 뒤 `outputs/local-history/retained-sources-2026-09-07/`으로 가역 보존 이동을 마쳤고 영구 삭제는 0건이다. `RUNTIME-001`은 Windows public-runtime/watchdog scripts를 복구 경로로 보존하기로 결정했으며 이 PC의 두 Disabled Scheduled Task는 운영 서버 다운을 뜻하지 않는다. `REFACTOR-001``sessionViewModel` 분리와 `voiceCapture` 책임 유지를 수용했고, lifecycle setter bag hook은 채택하지 않았다. Space retry→pause와 empty-audio fixture를 교정했으며, `learnerFeedbackEnabled:true` 누락으로 숨던 review feedback UI는 fixture 보완 뒤 focused login→review 1 passed(exit 0)로 확인했다. 제품 feedback guard는 유지했다. `REFACTOR-002`는 repository와 persistence values로 평가 저장 경계를 분리했다. 열린 백로그에 완료 이력을 다시 적지 않는다.
## 확인 명령

View file

@ -0,0 +1,38 @@
# 개선관리 워크북 구현 정합성 재점검
> 범위: 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의 이번 추가 수정은 미배포다.