회기 집계와 기록 복귀 및 감독 근거 링크 수정
Some checks failed
API contract / OpenAPI type drift (push) Failing after 4m46s
Some checks failed
API contract / OpenAPI type drift (push) Failing after 4m46s
This commit is contained in:
parent
aa951c6c4a
commit
1306c524c1
20 changed files with 4631 additions and 60 deletions
|
|
@ -6,16 +6,13 @@
|
|||
|
||||
## 현재 기준
|
||||
|
||||
2026-09-08 Forgejo master `a0311c59` (배포 문서 포함 `d9bb5b36`)를 NAS `vignette-prod` 및 Cloudflare Pages에 정식 실배포했다. 사전 DB 덤프(`/volume1/docker/vignette-prod/backups/pre-deploy-a0311c59-.dump`, 12MB) 및 `env.nas` 백업을 생성한 뒤 NAS 컨테이너(API `sha256:8b1ed23d1d24...`, Web `sha256:5c34139d8b56...`)를 교체·기동했다. Cloudflare Pages는 174개 자산을 보존하며 `https://vignette.chanpaca.net`(미리보기: `2df910db.vignette-b1q.pages.dev`)으로 배포 완료했다. 공개 health(`https://api-vignette.chanpaca.net/health` status:ok, db/engine/openai:true), `/auth/me`(401 Unauthorized fail-closed), 웹 서비스 live 폐루프를 확인했다.
|
||||
2026-09-09 최신 [개선관리 워크북](https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?pli=1&gid=1294900115#gid=1294900115)을 읽기 전용으로 재점검했다. 다운로드 원본 SHA-256 `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`의 14개 항목은 완료 13·검토 1(C-001)이며 REQ-008~011도 원본 완료다. [항목별 구현 매핑](./ops/spreadsheet-implementation-audit-2026-09-09.md)은 원본 완료 표기, 현재 로컬 검증, 배포 상태를 분리한다. 원본 워크북은 수정하지 않았다.
|
||||
|
||||
TDD 기반 회귀 방지 및 핵심 불변식을 확정했다:
|
||||
- REQ-010: 회기 무발화 0턴 분리 (`LearnerGrowthMetrics.ended_sessions` 및 대시보드 프로젝션에서 발화 없는 세션을 완료 회기 집계에서 안전하게 분리·제외)
|
||||
- REQ-011: OAS G5 자기예측 `[0.0, 1.0]` 범위 도메인 검증 및 DB 트리거 수준 락 보장/예외 전환 (`CalibrationTransferStateError`)
|
||||
- REQ-009: 웹 클라이언트 스트림 에러 시 입력문 복원(`setComposeText(text)`) 및 로딩 상태(`clientReplyPending`) 복원 보장
|
||||
REQ-010의 추가 결함은 0턴/client-only 회기가 대시보드의 첫 완료·반복·경험 배지 집계에 포함되는 것이었다. 기존 완료 집계와 같은 counselor/learner 발화 조건으로 정렬했고, 계약 RED 4건 뒤 GREEN 4건, 지정 API 20건과 API 전체 1108 passed / 1 skipped / 1 warning을 통과했다. `uc-session-conversation`과 `calibration-transfer` route fixture browser 재검증도 44 passed / 0 failed / 0 skipped로 수용했다. 이 browser 증거는 local fixture 기반이며 이번 변경은 build 미실행·새 public live 검증 미실행·미배포다.
|
||||
|
||||
단위/회귀 테스트는 API 전체 1104 passed / 1 skipped / 1 warning, gateway 전체 71 passed / 1 warning, web typecheck 및 build 전건 통과를 달성했다.
|
||||
2026-09-08 Forgejo master `a0311c59`(배포 문서 포함 `d9bb5b36`)의 NAS/Cloudflare Pages 배포, 사전 DB 덤프·컨테이너 교체·당시 public health/auth/web 폐루프와 API 1104 passed 기록은 [배포 파이프라인](./ops/deployment-pipeline.md)과 [1차 배포 증거](./ops/evidence/nas-prod-deploy-2026-09-01.json)에 보존한다. 이는 오늘의 새 live 검증이나 현재 작업트리 배포 상태가 아니다.
|
||||
|
||||
증거: [NAS 배포 파이프라인](./ops/deployment-pipeline.md), [1차 배포 증거](./ops/evidence/nas-prod-deploy-2026-09-01.json).
|
||||
실배포 CUA 128 시나리오는 카탈로그 생성만 끝났고 전체 검증은 끝나지 않았다. H09 기록 검색·필터 복귀와 T18 감독·연구 drilldown은 배포에서 RED다. H09는 local 16 passed, T18은 API 12 passed·local 교수자 15 passed로 수정 검증했지만 배포 재검증이 필요하다. 관리자와 일반 학습자 로그인에서 학습자의 `/admin`·`/teach`→`/learn` 차단과 P4 추천 일치를 확인했다. 순수 teacher, 독립 관찰자 공개 검증, OFF 계정, 교수자 쓰기와 모바일 실행은 남아 있다. 상세는 [실배포 CUA 보고](./qa/production-computer-use-report-2026-09-09.md)를 따른다.
|
||||
|
||||
## 남은 실행 항목
|
||||
|
||||
|
|
@ -24,7 +21,8 @@ TDD 기반 회귀 방지 및 핵심 불변식을 확정했다:
|
|||
3. 백업 운영화: 실패 알림, off-host 암호화 복제, 정기 restore drill을 운영 증거로 남긴다.
|
||||
4. 아바타 fail-closed 후보: 원본과 DB 참조를 보존한 채 public fallback·digest receipt·브라우저 검증을 마친 뒤에만 승격 판단한다.
|
||||
5. G7/G8 외부 게이트: G7은 동의 기반 물리 마이크와 독립 voice-gain 증거, G8은 실DB append-only 사람 게이트와 public proof가 남아 있다.
|
||||
6. 신규 제품 이슈: REQ-009, REQ-010, REQ-011은 TDD 불변식 추가 및 헤드풀 브라우저 E2E 검증, 실서버 배포를 완료했다. 외부 원본 워크북과의 최종 동기화만 남아 있다.
|
||||
6. REQ-009~011: 원본은 모두 완료다. API와 route fixture browser 로컬 재검증은 수용했지만 build·새 public live 검증·배포는 수행하지 않았다.
|
||||
7. CUA-128: 허용된 관리자 P16 회기 1개와 학습자 P4 회기 1개를 사용해 총 2/2를 종료했다. P4 회기는 2분 19초·6턴·실제 AI 3왕복으로 종료했고, 기존 승인 범위의 대화·리뷰·워크시트 권한은 유지한다. 순수 teacher·OFF 계정, 교수자 쓰기와 모바일 실행이 남아 있다.
|
||||
|
||||
세부 ID·차단 이유·완료 조건은 [`TODO.md`](./TODO.md)와 [열린 백로그](./ops/backlog-2026-06-26.md)에 있다.
|
||||
|
||||
|
|
@ -35,11 +33,11 @@ TDD 기반 회귀 방지 및 핵심 불변식을 확정했다:
|
|||
3. 외부 게이트는 증거 수집만 진행하며, 외부 입력·소유자 승인·비밀값을 추정하거나 생성하지 않는다.
|
||||
4. 코드 또는 문서 변경 뒤에는 범위에 맞는 테스트와 SSOT checker를 실행한다.
|
||||
|
||||
2026-09-09 현재 baseline은 Python 3.11 API 전체 1104 passed/1 skipped/1 warning, gateway 전체 71 passed/1 warning이며 API 타입 체크와 web build도 통과했다. API의 1 skipped는 `VIGNETTE_USAGE_TEST_DATABASE_URL` 미설정 때만 건너뛰는 기존 선택형 격리 DB `test_admin_usage_postgres.py`이고 새 skip은 없다.
|
||||
2026-09-09 REQ-010 API 재검증은 Python 3.11 API 전체 1108 passed/1 skipped/1 warning이다. API의 1 skipped는 `VIGNETTE_USAGE_TEST_DATABASE_URL` 미설정 때만 건너뛰는 기존 선택형 격리 DB `test_admin_usage_postgres.py`이고 새 skip은 없다. `uc-session-conversation`과 `calibration-transfer`의 route fixture browser 재검증은 44 passed/0 failed/0 skipped다. 이 수치는 local fixture 증거이며 build·새 public live 검증·배포를 뜻하지 않는다.
|
||||
|
||||
최종 UI 회귀는 `session-mvp`+`uc-session-coach-voice` 58 passed/0 skipped(exit 0, 2.6분), alliance+admin 39 passed/1 skipped(exit 0, 1.7분)로 합계 97 passed/1 skipped다. skip은 `uc-review-alliance-pulse` 320px 테스트의 desktop 중복 실행 제외이며 mobile은 실행·통과했다. `session-review`의 disabled AI feedback privacy 제어 focused 1 passed(exit 0, 4.4초)도 유지한다. dashboard 10은 별도 검증이다.
|
||||
|
||||
같은 날 source-only로 `test_session_turn_persistence.py`, `test_calibration_transfer_store.py`, `test_session_continuity_guard.py`는 78 passed와 `PendingDeprecationWarning` 1건, web typecheck는 통과했다. 이는 REQ-009~011의 재현·원인 해결·운영 증거가 아니다. 신규 제품 이슈의 현재 열린 상태와 다음 행동은 위 목록 및 [`TODO.md`](./TODO.md)를 따른다.
|
||||
같은 날 source-only로 `test_session_turn_persistence.py`, `test_calibration_transfer_store.py`, `test_session_continuity_guard.py`는 78 passed와 `PendingDeprecationWarning` 1건이었다. 이는 당시 증거이며 REQ-009~011의 현 browser 재검증이나 운영 증거가 아니다. 신규 제품 이슈의 현재 열린 상태와 다음 행동은 위 목록 및 [`TODO.md`](./TODO.md)를 따른다.
|
||||
|
||||
## 승인과 금지 경계
|
||||
|
||||
|
|
|
|||
|
|
@ -108,6 +108,8 @@
|
|||
| [`ops/evidence/avatar-decode-audit-2026-08-29.json`](./ops/evidence/avatar-decode-audit-2026-08-29.json) | 아바타 source union 93개·52,973 bytes·inventory SHA와 실제 decode 3 정상/90 실패, 현 DB 참조 2 정상/6 실패를 비식별 집계로 고정한 증거 |
|
||||
| [`ops/evidence/avatar-image-resilience-recovery-2026-08-29.json`](./ops/evidence/avatar-image-resilience-recovery-2026-08-29.json) | 공개 아바타 404 원인·시점 복구·인증 브라우저 DOM과 공통 이미지 fallback 후보의 privacy-safe 증거 |
|
||||
| [`ops/evidence/req008-reboot-preflight-2026-08-29.json`](./ops/evidence/req008-reboot-preflight-2026-08-29.json) | REQ-008 실제 재부팅 전 read-only task/runtime 사전점검 스냅샷 — 현재 public outage와 실제 reboot smoke가 이를 대체·완료하지 않음 |
|
||||
| [`ops/spreadsheet-implementation-audit-2026-09-09.md`](./ops/spreadsheet-implementation-audit-2026-09-09.md) | 최신 개선관리 원본 14개 항목의 완료 13·검토 1(C-001)과 로컬 재검증·미배포 경계 |
|
||||
| [`qa/production-computer-use-report-2026-09-09.md`](./qa/production-computer-use-report-2026-09-09.md) | 실제 배포 CUA 128 카탈로그·ledger, H09/T18 local 수정과 배포 재검증 경계 |
|
||||
| [`ops/evidence/professor-summary-gap-deploy-2026-08-29.json`](./ops/evidence/professor-summary-gap-deploy-2026-08-29.json) | 교수자 검토 큐·요약 카드 12px 분리의 RED→GREEN·7폭/전체 시각 게이트·clean Pages 배포·실서비스 DOM 증거 |
|
||||
| [`ops/public-db-recovery-rehearsal-2026-08-07.md`](./ops/public-db-recovery-rehearsal-2026-08-07.md) | 공개 DB 데이터 교체 사고의 RLS/volume 포렌식, 이중 dump, 격리 복구·최신 migration/API 리허설과 승인형 cutover/rollback 게이트 |
|
||||
| [`ops/server-migration-runbook-draft.md`](./ops/server-migration-runbook-draft.md) | 서버 이관 런북 초안(자택→학교 정보처) — 이식성 이슈·DB dump/restore·엔진 모드 전환·검증 (초안) |
|
||||
|
|
|
|||
15
docs/TODO.md
15
docs/TODO.md
|
|
@ -5,14 +5,14 @@
|
|||
|
||||
## 우선 접수 제품 이슈
|
||||
|
||||
> 원본: [개선관리 워크북](https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?gid=351278076#gid=351278076) `개발·기능 이슈` 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도 원본에서는 완료다. [14개 항목 매핑](./ops/spreadsheet-implementation-audit-2026-09-09.md)은 원본 상태와 로컬 재검증을 구분한다. 원본을 수정하지 않는다.
|
||||
|
||||
| ID | 로컬 상태 | 우선 행동 및 조치 결과 | 원본 상태 | 완료 조건 및 검증 증거 |
|
||||
|---|---|---|---|---|
|
||||
| REQ-009 | DONE · E2E 검증완료 | 스트림 오류 시 인라인 재시도/닫기 버튼 추가, voiceStatus 복원, 부분 턴 미적재 보호 구현 완료. | 중요 · 대기 | 단위/Playwright 통과 및 실서버 헤드풀 브라우저 검증. [headful-02](./ops/evidence/headful-02-session-multi-turn.png) |
|
||||
| REQ-011 | DONE · E2E 검증완료 | OAS G5 자기예측 시 legacy instrument ID 정규화 및 scoped block ID 일치화로 HTTP 422 해소. 1차 예측 저장 및 잠금 완료. | 일반 · 상태 공란 | 헤드풀 브라우저 리뷰 피드백 탭에서 1차 예측 저장 및 잠금 정상 동작 검증 완료. [headful-04](./ops/evidence/headful-04-review-calibration-locked.png) |
|
||||
| REQ-010 | DONE · E2E 검증완료 | hard delete 없이 0턴 무턴 세션은 완료 회기 집계에서 안전하게 제외하고, 실제 발화 진행 회기만 완료 카운트에 반영. | 중요 · 상태 공란 | 헤드풀 브라우저 2턴 완료 시 카운트 증가(+1) 및 0턴 즉시 종료 시 카운트 불변(유지) 검증. [headful-05](./ops/evidence/headful-05-learner-home-after-completed.png), [headful-06](./ops/evidence/headful-06-learner-home-zero-turn-verified.png) |
|
||||
| SRC-001 | DONE · 로컬 동기화완료 | 개선관리 워크북 replica의 수식 오류(`#REF!`) 수정 및 개발 상태 집계 범위(15행까지 포함) 보정 완료. | 원본 정합성 OPEN | 수식 수정본 엑셀 생성: `outputs/01a04217-f73b-7303-b597-401fa7f5d290/Vignette_개선관리_완료.xlsx` |
|
||||
| REQ-009 | 원본 완료 · 기존 구현 재검증 수용 | 스트림 오류의 입력 복원·부분 턴 미저장·재시도/닫기·음성 상태 복원 구현을 route fixture 기반 browser 재검증으로 수용했다. | 완료 | `uc-session-conversation`과 `calibration-transfer` browser 44 passed/0 failed/0 skipped. fixture 기반 local proof이며 이번 재검증은 build·새 public live 검증·새 배포를 수행하지 않았다. |
|
||||
| REQ-010 | 원본 완료 · 추가 수정 로컬 검증 수용 · 추가 수정 미배포 | 0턴/client-only 회기가 첫 완료·반복·경험 배지 집계에 섞이는 결함을 찾아 기존 완료 집계와 같은 counselor/learner 발화 조건으로 정렬했다. | 완료 | 계약 RED 4건 뒤 GREEN 4건, 지정 API 20건, API 전체 1108 passed/1 skipped/1 warning, browser 44 passed/0 failed/0 skipped. 이번 추가 수정은 build·새 public live 검증·배포를 수행하지 않았다. |
|
||||
| REQ-011 | 원본 완료 · 기존 구현 재검증 수용 | OAS G5 자기예측 저장·잠금의 기존 해결 증거를 route fixture 기반 browser 재검증으로 수용했다. | 완료 | `uc-session-conversation`과 `calibration-transfer` browser 44 passed/0 failed/0 skipped. fixture 기반 local proof이며 이번 재검증은 build·새 public live 검증·새 배포를 수행하지 않았다. |
|
||||
| SRC-001 | 역사 replica 수식 보정 완료 · 과거 수식 오류 미재현 | 과거 replica의 `#REF!` 및 15행 집계 범위 보정은 보존한다. 최신 원본 재점검에서는 이를 현재 원본 결함으로 주장하지 않는다. | 해당 없음 | 과거 수정본은 `outputs/01a04217-f73b-7303-b597-401fa7f5d290/Vignette_개선관리_완료.xlsx`에 보존한다. |
|
||||
|
||||
## P0 운영·외부 게이트
|
||||
|
||||
|
|
@ -52,6 +52,7 @@
|
|||
| MIGRATION-001 | idempotent DB migration runner 도입 여부를 결정한다. | init SQL과 runner의 역할 경계, 인프라 영향, 소유자 승인을 확정한다. |
|
||||
| OPS-001 | 운영 티켓 자동 분류·처리 후속을 설계한다. | 관리자 승인 뒤 이슈/PR/작업 스레드를 생성하는 범위와 audit 경계를 확정한다. |
|
||||
| E2E-001 | 전 기능 E2E 후속을 분류한다. | 이번 focused 범위에서 locator 18건을 교정하고 keyboard 1건을 해결했다. `npm run e2e` 전 기능 묶음에서 focused 범위 밖 케이스를 실행하고 실패별 재현·원인·수정 명령을 분류한다. 과거 sweep 실패를 오늘 재현 결함으로 단정하지 않으며, 실API/DB·장치 검증은 fixture 결과와 분리한다. |
|
||||
| CUA-128 | 실제 배포 Computer Use 128 시나리오를 역할·승인 경계 안에서 재개한다. | 카탈로그 생성은 완료했으나 실배포 전체 검증은 미완료다. 일반 학습자 로그인·교차 역할 차단·P4 추천과 허용된 관리자 P16 1개·학습자 P4 1개 회기 종료를 확인했지만 H09·T18은 배포 재검증이 열려 있다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증이 남아 있다. [실행 보고](./qa/production-computer-use-report-2026-09-09.md)를 따른다. |
|
||||
|
||||
## 임상 콘텐츠 후속
|
||||
|
||||
|
|
@ -67,9 +68,9 @@
|
|||
|
||||
| 범위 | 상태 | 근거 |
|
||||
|---|---|---|
|
||||
| C-002·C-003·REQ-001~007 | 완료 | 개선관리 완료본은 9 완료·2 검토를 유지한다. C-001과 REQ-008은 별도 게이트다. |
|
||||
| 원본 14개 항목 | 원본 완료 13 · 검토 1 | 2026-09-09 최신 원본에서 REQ-001~011과 C-002·C-003은 완료, C-001은 검토다. 과거 완료 9·검토 2는 당시 11개 항목 수집본의 역사 기록이다. |
|
||||
| NAS A 경로 | 2026-09-01 당시 완료 | NAS `vignette-prod` 배포, migration 20/21/22, OAuth 실계정 새 사례→턴→리뷰 E2E, 첫 일일 backup sidecar 실행. |
|
||||
| NAS 2차 실배포 & Cloudflare Pages | 2026-09-08 실배포 완료 | Forgejo/GitHub master `a0311c59`/`d9bb5b36` 배포 완료. NAS API·Web 컨테이너 교체, 사전 DB 덤프(12MB) 생성, Cloudflare Pages 174개 에셋 보존 배포. 실 health/auth/web 폐루프 검증. TDD 1104 passed (0턴 세션 분리, OAS calibration bounds & lock, composer 복원) 완료. [배포 파이프라인](./ops/deployment-pipeline.md) 참조. |
|
||||
| NAS 2차 실배포 & Cloudflare Pages | 2026-09-08 당시 배포 기록 | Forgejo/GitHub master `a0311c59`/`d9bb5b36`의 당시 NAS API·Web 컨테이너 교체, 사전 DB 덤프(12MB), Cloudflare Pages 174개 에셋과 당시 health/auth/web 폐루프·TDD 1104 passed 기록을 보존한다. 이는 2026-09-09의 새 live 검증이나 현재 작업트리 배포 상태 주장이 아니다. [배포 파이프라인](./ops/deployment-pipeline.md) 참조. |
|
||||
| G0~G6·G8 내부 구현 | 완료 증거 보존 | G7 외부 종료와 G8 실DB/public 사람 게이트는 계속 열린다. |
|
||||
| B3·B3-신규 소유자 결정 | 결정 및 기존 구현 완료 | 원문은 [정리 전 백로그 원문](./archive/project-cleanup-2026-09-07/backlog-2026-06-26-before-cleanup.md), 남은 후속만 위에 둔다. |
|
||||
| 과거 Windows Compose 패키징 gate | SUPERSEDED | 9/1 NAS docker-compose 배포로 현 production 전환 항목에서 제거했다. 새 secret 주입 과제를 만들지 않는다. |
|
||||
|
|
|
|||
|
|
@ -291,7 +291,7 @@
|
|||
<div class="brand"><span class="mark" aria-hidden="true"></span><span>Vignette 커맨드센터<small>팀장 리뷰 · dev status</small></span></div>
|
||||
<div class="head-right">
|
||||
<a class="owner-pill" href="#owner"><span class="d" aria-hidden="true"></span>내 차례 <b id="pill-owner">0</b></a>
|
||||
<span class="stamp">2026-09-01 KST</span>
|
||||
<span class="stamp">2026-09-09 KST</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
|
@ -300,9 +300,10 @@
|
|||
<section class="pulse">
|
||||
<div class="pulse-main">
|
||||
<span class="eyebrow">project pulse</span>
|
||||
<h1>지금 위치: <em>NAS <code>vignette-prod</code> 정식 배포 완료 기록(SHA <code>dce85620</code>)</em> — 2026-09-01 당시 배포·실계정 회기 검증·데이터 보존 증거를 남겼다. 신규 REQ-009~011 접수와 C-001·REQ-008 외부 게이트가 남았다.</h1>
|
||||
<h1>지금 위치: <em>개선관리 원본 14개 재점검</em> — 2026-09-09 읽기 전용 확인에서 완료 13·검토 1(C-001)이다. REQ-009~011의 로컬 재검증은 수용했고, REQ-010 추가 수정은 미배포다. 2026-09-01·09-08 배포는 당시 증거이며 오늘의 새 live 검증이 아니다.</h1>
|
||||
<p class="pulse-state"><b>실배포 CUA 128:</b> 카탈로그는 생성됐지만 전체 검증은 미완료다. 실제 배포에서는 H09(기록 검색·필터 복귀)와 T18(감독·연구 drilldown)이 RED로 남아 있다. 두 항목은 각각 local 16 passed와 API 12 passed·local 교수자 15 passed로 수정 검증했으나, 배포 재검증이 열려 있다. 관리자와 일반 학습자 로그인에서 학습자의 `/admin`·`/teach`→`/learn` 차단, P4 추천 일치와 허용된 관리자 P16 1개·학습자 P4 1개 회기 종료를 확인했다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증은 남아 있다.</p>
|
||||
<p class="pulse-state"><b>2026-08-31 배포 파이프라인 재정립(역사 기록):</b> git 관리·배포는 <code>git.chanpaca.net</code>(Forgejo) 중심으로 이관했고, <code>github.com</code>(origin)은 private 백업/미러로 유지한다. 배포 대상은 NAS Production(<code>docker-compose.nas.yml</code>, <code>vignette-prod</code>)이며 이 PC는 개발용이다. Cloudflare tunnel은 NAS ingress의 현재 경로이므로 대체 ingress 검증 전에는 제거하지 않는다. 문서 <a href="./ops/deployment-pipeline.md">deployment-pipeline.md</a>.</p>
|
||||
<p class="pulse-state"><b>최근 확인된 배포 증거(2026-09-01 당시):</b> Forgejo master <code>dce85620</code>를 NAS에서 직접 clone·빌드해 <code>vignette-prod</code> api/engine/web을 교체했고, Cloudflare Pages production도 새 빌드(<code>index-BFKGXJQi.js</code>, 이전 세대 자산 보존)로 배포했다. 사전 dump <code>cab6826b…</code>(11.0MB·TOC 1783)·env 백업·구 이미지 보존으로 롤백 경로를 고정했다. 중복 활성 회기 14쌍 30행은 최신 유지 정책으로 종료(영수증 보존·삭제 0)하고 마이그레이션 20/21/22를 온라인 적용했다. 이 과정에서 mig22의 <code>name[]=text[]</code> 캐스트 결함과 master의 게이트웨이 openai provider 누락 회귀를 발견해 즉시 교정했다(테스트 71 passed). 배포 당시 public health <code>ok·db/engine true</code>, OpenAPI 200, <code>/auth/me</code> 401, dev-login 404, 데이터 집계 전후 동일(app_user 1380/sessions 618/turns 1743)을 확인했다. 증거: <a href="./ops/evidence/nas-prod-deploy-2026-09-01.json">nas-prod-deploy-2026-09-01.json</a>. <b>headful 실계정 폐루프도 당시 완료:</b> NAS env의 OAuth secret 오류(<code>invalid_client</code>)를 교정한 뒤 소유자 실계정 로그인→기존 회기 20건 표시(데이터 보존)→새 사례 회기 생성(mig22 실증)→실턴 SSE·AI 응답→종료→리뷰 생성까지 GREEN(sessions 619·turns 1745·case_profile 566). 일일 검증형 DB 백업 sidecar 첫 덤프도 11.2MB로 성공했다. <b>다음:</b> 신규 REQ-009~011 재현, C-001 외부 임상 검수, NAS 재부팅 자동복구 smoke, 백업 실패 알림·off-host 복제.</p>
|
||||
<p class="pulse-state"><b>최근 확인된 배포 증거(2026-09-01 당시):</b> Forgejo master <code>dce85620</code>를 NAS에서 직접 clone·빌드해 <code>vignette-prod</code> api/engine/web을 교체했고, Cloudflare Pages production도 새 빌드(<code>index-BFKGXJQi.js</code>, 이전 세대 자산 보존)로 배포했다. 사전 dump <code>cab6826b…</code>(11.0MB·TOC 1783)·env 백업·구 이미지 보존으로 롤백 경로를 고정했다. 중복 활성 회기 14쌍 30행은 최신 유지 정책으로 종료(영수증 보존·삭제 0)하고 마이그레이션 20/21/22를 온라인 적용했다. 이 과정에서 mig22의 <code>name[]=text[]</code> 캐스트 결함과 master의 게이트웨이 openai provider 누락 회귀를 발견해 즉시 교정했다(테스트 71 passed). 배포 당시 public health <code>ok·db/engine true</code>, OpenAPI 200, <code>/auth/me</code> 401, dev-login 404, 데이터 집계 전후 동일(app_user 1380/sessions 618/turns 1743)을 확인했다. 증거: <a href="./ops/evidence/nas-prod-deploy-2026-09-01.json">nas-prod-deploy-2026-09-01.json</a>. <b>headful 실계정 폐루프도 당시 완료:</b> NAS env의 OAuth secret 오류(<code>invalid_client</code>)를 교정한 뒤 소유자 실계정 로그인→기존 회기 20건 표시(데이터 보존)→새 사례 회기 생성(mig22 실증)→실턴 SSE·AI 응답→종료→리뷰 생성까지 GREEN(sessions 619·turns 1745·case_profile 566). 일일 검증형 DB 백업 sidecar 첫 덤프도 11.2MB로 성공했다. <b>남은 운영·외부 게이트:</b> C-001 외부 임상 검수, NAS 재부팅 자동복구 smoke, 백업 실패 알림·off-host 복제.</p>
|
||||
<details class="pulse-details">
|
||||
<summary>운영 복구·watchdog·배포 상세 보기</summary>
|
||||
<p class="pulse-state"><b>2026-08-31 사례 연속성 후보:</b> source candidate에는 같은 NPC의 <code>완전히 새로 시작</code>(빈 새 case)과 <code>이어서 진행</code>(선택 case의 압축 기억)을 분리했고, 사례별 누적 회기·상담자 가시 턴·누적 시간을 시작 전 표시하며 기억은 lazy foldout으로 숨겼다. migration 22는 legacy case unique만 해제하고 migration 21의 단일 활성 회기 제약을 유지한다. 이는 source/test 후보 상태이며 NAS DB 적용·배포·실제 production 브라우저 GREEN은 아직 하지 않았다.</p>
|
||||
|
|
@ -327,7 +328,7 @@
|
|||
<span class="mchip">이전 OpenAPI 증거 · Public API <b>126 paths · G1~G8</b></span>
|
||||
<span class="mchip good">Direct-runtime preflight <b>APP ROLE OK</b></span>
|
||||
<span class="mchip crit">Avatar decode <b>3 valid · 90 invalid</b></span>
|
||||
<span class="mchip">Workbook <b>완료 9 · 검토 2</b></span>
|
||||
<span class="mchip">Workbook 최신 원본 <b>완료 13 · 검토 1</b></span>
|
||||
<span class="mchip good">Human gate local <b>10/10 · IAB GREEN</b></span>
|
||||
<span class="mchip">Human gate <b>실DB/public pending</b></span>
|
||||
<span class="mchip">Decision <b>P0 조건부</b></span>
|
||||
|
|
@ -342,13 +343,13 @@
|
|||
</section>
|
||||
|
||||
<section class="block source-note" aria-labelledby="product-issues-title">
|
||||
<h2 id="product-issues-title">제품 이슈 접수 현황 (2026-09-07)</h2>
|
||||
<p><b>지표 범위:</b> 이 표는 개선관리 워크북의 14개 항목을 로컬 추적용으로 분리한 것이다. 상단의 모듈 카드 <code>33 done / 2 doing</code>과 같은 지표가 아니다. 외부 원본은 <a href="https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?gid=351278076#gid=351278076">개선관리 워크북</a>이며 2026-09-07 수집 SHA-256 <code>625281e72067ae2aea402f2fe932b4f593b7905c35f8a9740cf346c7f077c812</code>다. 로컬 집계는 완료 9·기존 gate 2·신규 3이다. 원본의 기존 대기 표기와 로컬 DONE은 동기화 대기 상태이며 원본을 수정하지 않는다.</p>
|
||||
<h2 id="product-issues-title">제품 이슈 원본 재점검 (2026-09-09)</h2>
|
||||
<p><b>지표 범위:</b> 이 표는 <a href="https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?pli=1&gid=1294900115#gid=1294900115">개선관리 워크북</a> 14개 항목의 최신 원본과 로컬 재검증을 분리한다. 다운로드 원본 SHA-256은 <code>f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773</code>, 원본은 완료 13·검토 1(C-001)이며 REQ-008~011도 완료다. API 전체 1108 passed/기존 skip 1, route fixture browser 44 passed/0 failed/0 skipped를 수용했다. 이는 local proof이며 REQ-010 추가 수정은 미배포, 새 public live 검증은 하지 않았다.</p>
|
||||
<div class="dg-table-wrap"><table class="dg-table"><thead><tr><th>ID</th><th>로컬 상태</th><th>원본 상태</th><th>로컬 조치 및 검증 결과</th><th>검증 증거</th></tr></thead><tbody>
|
||||
<tr><td>REQ-009</td><td>DONE · E2E 검증완료</td><td>중요 · 대기</td><td>상담 중 엔진 스트림 끊김/오류 시 입력 복원, 부분 턴 미적재 보호, 인라인 재시도/닫기 버튼 및 음성 상태 복원 구현 완료.</td><td>단위·Playwright 통과 및 실서버 헤드풀 브라우저 검증. <a href="./ops/evidence/headful-02-session-multi-turn.png">headful-02-session-multi-turn.png</a></td></tr>
|
||||
<tr><td>REQ-010</td><td>DONE · E2E 검증완료</td><td>중요 · 상태 공란</td><td>하드 딜리트 없이 0턴 무턴 세션은 완료 회기 집계에서 안전하게 제외하고, 실제 발화가 진행된 회기만 완료 카운트에 반영되도록 집계 프로젝션 교정.</td><td>헤드풀 브라우저 2턴 완료 시 카운트 증가(+1) 및 0턴 즉시 종료 시 카운트 불변(유지) 검증. <a href="./ops/evidence/headful-05-learner-home-after-completed.png">headful-05</a>, <a href="./ops/evidence/headful-06-learner-home-zero-turn-verified.png">headful-06</a></td></tr>
|
||||
<tr><td>REQ-011</td><td>DONE · E2E 검증완료</td><td>일반 · 상태 공란</td><td>OAS G5 자기예측 시 legacy instrument ID 정규화 및 scoped block ID 일치화로 HTTP 422 위반 오류 해소. 1차 예측 기록 및 잠금 성공.</td><td>헤드풀 브라우저 리뷰 피드백 탭에서 1차 예측 저장 및 잠금 완료. <a href="./ops/evidence/headful-04-review-calibration-locked.png">headful-04-review-calibration-locked.png</a></td></tr>
|
||||
<tr><td>SRC-001</td><td>DONE · 로컬 동기화완료</td><td>원본 워크북 정합성</td><td>개선관리 워크북 replica의 수식 오류(<code>#REF!</code>) 수정 및 개발 상태 집계 범위(15행까지 포함) 보정 완료.</td><td>수식 수정본 엑셀 생성: <code>outputs/01a04217-f73b-7303-b597-401fa7f5d290/Vignette_개선관리_완료.xlsx</code></td></tr>
|
||||
<tr><td>REQ-009</td><td>원본 완료 · 기존 구현 재검증 수용</td><td>완료</td><td>입력 복원·부분 턴 미저장·재시도/닫기·음성 상태 복원을 local browser로 재검증했다.</td><td>route fixture browser 44 passed/0 failed/0 skipped. 이번 재검증은 새 public live 검증·새 배포가 아니다.</td></tr>
|
||||
<tr><td>REQ-010</td><td>원본 완료 · 추가 수정 로컬 검증 수용</td><td>완료</td><td>0턴/client-only 회기를 첫 완료·반복·경험 배지 집계에서 기존 완료 조건과 같게 제외했다.</td><td>API 1108 passed/기존 skip 1, route fixture browser 44 passed/0 failed/0 skipped. 추가 수정 미배포.</td></tr>
|
||||
<tr><td>REQ-011</td><td>원본 완료 · 기존 구현 재검증 수용</td><td>완료</td><td>자기예측 저장·잠금의 기존 해결을 local browser로 재검증했다.</td><td>route fixture browser 44 passed/0 failed/0 skipped. 이번 재검증은 새 public live 검증·새 배포가 아니다.</td></tr>
|
||||
<tr><td>SRC-001</td><td>역사 replica 수식 보정</td><td>해당 없음</td><td>과거 replica의 <code>#REF!</code>·15행 집계 범위 보정은 보존하며 최신 원본에서 그 오류는 미재현이다.</td><td>과거 수정본: <code>outputs/01a04217-f73b-7303-b597-401fa7f5d290/Vignette_개선관리_완료.xlsx</code></td></tr>
|
||||
</tbody></table></div>
|
||||
</section>
|
||||
|
||||
|
|
@ -1135,7 +1136,7 @@
|
|||
<tbody>
|
||||
<tr><td>Web typecheck</td><td><code>npm run typecheck</code></td><td>Passed</td></tr>
|
||||
<tr><td>Design SSOT / auth visual</td><td><code>npm run check:design-ssot</code> / <code>npx playwright test e2e/auth-visual.spec.ts --project=chromium-single-run --reporter=line</code> / <code>npx playwright test e2e/layout-visual-gate.spec.ts --project=chromium-single-run --reporter=line</code></td><td>SSOT checker passed; login/onboarding light-dark desktop-mobile 1 passed; 14 core screens × 7 widths visual gate 14 passed.</td></tr>
|
||||
<tr><td>Full Playwright E2E baseline</td><td><code>npm run e2e:parallel</code> / <code>npm run e2e:single-run</code> / <code>npm run e2e:list</code></td><td>2026-08-31 현재 수집은 <b>1182 tests / 66 files</b>다. 이 숫자는 수집량이며 현 작업트리 전체 GREEN과 동일하지 않다. G8 clean-head release gate는 candidate 112/112와 실제 NAS-origin 112/112를 통과했다. 이전 단일 120/120과 2026-07-15의 fixture desktop/mobile 166/166 + DB/engine/provider 직렬 49/49 = 215/215는 범위가 다른 역사 기준선으로 보존한다.</td></tr>
|
||||
<tr><td>Full Playwright E2E baseline</td><td><code>npm run e2e:parallel</code> / <code>npm run e2e:single-run</code> / <code>npm run e2e:list</code></td><td>2026-09-09 현재 수집은 <b>1188 tests / 66 files</b>다. 이 숫자는 수집량이며 현 작업트리 전체 GREEN과 동일하지 않다. G8 clean-head release gate는 candidate 112/112와 실제 NAS-origin 112/112를 통과했다. 이전 단일 120/120과 2026-07-15의 fixture desktop/mobile 166/166 + DB/engine/provider 직렬 49/49 = 215/215는 범위가 다른 역사 기준선으로 보존한다.</td></tr>
|
||||
<tr><td>Refactor governance P1~P8</td><td><code>ruff check app</code> / <code>pytest -q app</code> / <code>pytest -q engine_gateway</code> / <code>npm run typecheck</code> / <code>npm run check:api-types</code> / <code>npm run check:design-ssot</code> / <code>npm run check:dead-code</code> / <code>npm run check:duplication</code> / <code>npm run build</code> / <code>npm audit --audit-level=high</code> / full Playwright</td><td>Backend 400 passed, gateway 29 passed, web gates/build/audit passed, vulnerabilities 0, production duplication 1 clone/15 lines/0.03%, Playwright 215/215 passed. 상세 근거는 <code>archive/project-cleanup-2026-09-07/refactor-governance-2026-07-15.md</code>.</td></tr>
|
||||
<tr><td>API typegen SSOT</td><td><code>npm run check:api-types</code></td><td>Passed; FastAPI OpenAPI → <code>src/lib/api.gen.ts</code> stale check</td></tr>
|
||||
<tr><td>Outcome & Alliance OS G0</td><td><code>py -3.11 -X utf8 -m pytest -p no:cacheprovider apps/api/app/test_measurement_contract.py apps/api/app/test_runtime_schema_ssot.py -q</code> / <code>scripts/check-measurement-ledger.sql</code> / measurement·API contract checks / web typecheck / DB-backed <code>session-persistence</code> focused E2E 3종</td><td>G0 contract/schema 11 passed, 기존 backend 100 passed, auth 39 passed. Python→JSON Schema→TypeScript→PostgreSQL enum·필수필드 계약이 일치하고 8개 deterministic benchmark가 검증됐다. Live PostgreSQL에서 learner/client/evaluator 가시 행 1/1/2, 교차 누수 0, append-only guard 2를 확인했다. 학습자 턴→교수자 대시보드, 워크시트 검수, 종료 deep 평가→durable 리뷰 E2E는 각각 1 passed. G0/AOS-001~004 완료.</td></tr>
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ Vignette 저장소의 모든 검증 수단(백엔드 단위 테스트, 웹 타
|
|||
| API 타입 생성 체크 | `apps/web` | `npm run check:api-types` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||
| 웹 타입체크 | `apps/web` | `npm run typecheck` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||
| 웹 빌드 | `apps/web` | `npm run build` | 불필요 | 불필요 | 불필요 | 불필요 | 불필요 | pass |
|
||||
| Playwright E2E(전체) | `apps/web` | `npm run e2e` | **필요(+시드)** | **필요** | 자동기동 | 일부만 | **필요** | 현재 수집 1182 tests / 66 files · 현 작업트리 전체 GREEN 미검증 |
|
||||
| Playwright E2E(전체) | `apps/web` | `npm run e2e` | **필요(+시드)** | **필요** | 자동기동 | 일부만 | **필요** | 현재 수집 1188 tests / 66 files · 현 작업트리 전체 GREEN 미검증 |
|
||||
|
||||
핵심 원칙: **단위 테스트(pytest)와 타입체크/빌드는 외부 서비스 없이 단독 실행된다.**
|
||||
**E2E만 풀스택(DB+API+웹+브라우저)을 요구한다.** 아래 각 절에서 근거와 절차를 설명한다.
|
||||
|
|
@ -86,6 +86,10 @@ py -3.11 -m pytest engine_gateway/ --collect-only -q
|
|||
|
||||
#### 개선관리 워크북 focused 증거 (2026-08-27~28)
|
||||
|
||||
2026-09-09 최신 원본 워크북(다운로드 SHA-256 `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`)은 14개 항목 중 완료 13·검토 1(C-001)이며 REQ-008~011도 완료다. `py -3.11 -m pytest app/ -q`는 1108 passed/기존 skip 1/1 warning, `uc-session-conversation`·`calibration-transfer` route fixture browser는 44 passed/0 failed/0 skipped다. 이는 local proof이며 REQ-010 추가 수정은 미배포다. 이 워크북 감사 단계에서는 build·새 public live 검증을 수행하지 않았다. 상세 매핑은 [`spreadsheet-implementation-audit-2026-09-09.md`](../ops/spreadsheet-implementation-audit-2026-09-09.md)를 따른다.
|
||||
|
||||
실배포 CUA 128은 전체 완료가 아니다. H09의 `/learn/history` 검색·필터 복귀는 `uc-learner-practice-history` local 16 passed, T18의 감독·연구 canonical/legacy drilldown은 API 12 passed와 `uc-teacher-console` local 15 passed로 수정 검증했다. 두 RED는 배포 재검증 전까지 열린 상태이며 실제 배포 관찰은 [CUA 보고](../qa/production-computer-use-report-2026-09-09.md)와 ledger를 따른다.
|
||||
|
||||
아래는 2026-09-07 전체 API 1090 passed/1 skipped/1 warning·gateway 71 passed/1 warning와 별도로 해당 계약을 좁혀 실행한 확정 증거다. 같은 묶음의 테스트가 여러 요구사항
|
||||
경계를 함께 검증할 수 있으므로 숫자를 요구사항별 전체 합계로 더하지 않는다.
|
||||
|
||||
|
|
@ -317,7 +321,7 @@ VITE_API_BASE=http://127.0.0.1:8000 npm run e2e # 프록시 대신 API
|
|||
|
||||
### 3.6 실측 테스트 개수 (현재)
|
||||
|
||||
2026-08-31 `npx playwright test --list` 기준 **현재 수집 1182 tests / 66 files**다
|
||||
2026-09-09 `npx playwright test --list` 기준 **현재 수집 1188 tests / 66 files**다
|
||||
(유스케이스 16테마 `uc-*.spec.ts` 239 시나리오 포함).
|
||||
이 숫자는 수집량이지 통과량이 아니다. 현 작업트리 전체 1109개 완주는 아직 증거가 없으며,
|
||||
과거 전체 GREEN 기록과 이번 focused/release gate 결과를 구분해 적는다.
|
||||
|
|
|
|||
|
|
@ -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로 평가 저장 경계를 분리했다. 열린 백로그에 완료 이력을 다시 적지 않는다.
|
||||
|
||||
## 확인 명령
|
||||
|
||||
|
|
|
|||
38
docs/ops/spreadsheet-implementation-audit-2026-09-09.md
Normal file
38
docs/ops/spreadsheet-implementation-audit-2026-09-09.md
Normal 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의 이번 추가 수정은 미배포다.
|
||||
2175
docs/qa/production-computer-use-128-2026-09-09.json
Normal file
2175
docs/qa/production-computer-use-128-2026-09-09.json
Normal file
File diff suppressed because it is too large
Load diff
1909
docs/qa/production-computer-use-128-2026-09-09.md
Normal file
1909
docs/qa/production-computer-use-128-2026-09-09.md
Normal file
File diff suppressed because it is too large
Load diff
35
docs/qa/production-computer-use-report-2026-09-09.md
Normal file
35
docs/qa/production-computer-use-report-2026-09-09.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
# 실배포 Computer Use 128 실행 보고
|
||||
|
||||
> 기준: 2026-09-09 KST. 이 문서는 실제 배포 CUA 관찰과 local 수정 검증을 분리한다. 128개 카탈로그 생성은 완료됐지만, 128개 전체의 실제 배포 검증 완료를 뜻하지 않는다. 최신 ledger는 PASS 83, RED 2, BLOCKED 10, NOT_RUN 33이다.
|
||||
|
||||
## 참조와 현재 범위
|
||||
|
||||
- [실행 카탈로그](./production-computer-use-128-2026-09-09.md)와 [기계 판독 카탈로그](./production-computer-use-128-2026-09-09.json)는 시나리오·역할·mutation 경계를 소유한다.
|
||||
- [실행 ledger](../../outputs/production-cu-2026-09-09/ledger.json)는 실제 상태와 실행 증거를 보존한다.
|
||||
- 실제 관리자와 일반 학습자 로그인을 확인했다. 일반 학습자는 `/admin`·`/teach` 접근 때 `/learn`으로 차단됐고 P4 추천이 일치했다. 순수 teacher 계정, 독립 관찰자 공개 검증, OFF 계정, 교수자 쓰기와 모바일 실행은 아직 확인하지 않았다.
|
||||
- 허용된 관리자 P16 회기 1개와 학습자 P4 회기 1개를 사용해 총 2/2를 종료했다. P4 회기는 2분 19초 동안 6턴·실제 AI 3왕복으로 종료했다. 두 회기의 대화·리뷰·워크시트 권한은 기존 승인 범위에서 유지한다.
|
||||
|
||||
## 일반 학습자 실배포 관찰
|
||||
|
||||
- 새 회기는 문서 재로드 뒤에도 복원됐다. 리뷰 평가는 대기에서 완료로 전환됐다.
|
||||
- 자기예측은 빈 입력을 차단했고 revision 1→revision 2→명시 잠금 뒤 reload에서도 같은 잠금 상태를 유지했다.
|
||||
- 워크시트 주호소 수정은 저장 완료 뒤 reload에서 복원됐다.
|
||||
- 원장에 추가된 `익명 인물입니다` 관찰의 production 원인은 미확정이며 결함 확정이나 수정 완료로 쓰지 않는다. local guardrail의 contextless NAME 오탐 재현은 있으나 production 원인을 입증하지 않는다. 후속에는 비식별 안전 회귀 재현과 production 관찰의 독립 대조가 필요하다.
|
||||
|
||||
## 실배포 RED와 local 수정 증거
|
||||
|
||||
| ID | 실제 배포 상태 | local 수정·검증 | 배포 재검증 조건 |
|
||||
|---|---|---|---|
|
||||
| H09 | `/learn/history`의 검색·필터를 적용한 뒤 특정 기록을 열고 돌아왔을 때 목록 맥락 복귀가 RED다. | `apps/web/src/pages/LearnerHome.tsx`가 history `q`·`status`를 URL search params로 소유하도록 수정했고 `uc-learner-practice-history` local 16 passed(22.9s)다. | 관리자 사용자 경로의 회귀와 순수 learner 계정의 기존 종료 테스트 기록에서 검색·필터→기록/리뷰→브라우저 뒤로 복귀를 실제 배포에서 다시 확인한다. |
|
||||
| T18 | 감독·연구 화면의 producer drilldown이 legacy 경로를 가리켜 실제 배포에서 RED다. | `apps/api/app/services/supervision_research_producer.py`의 canonical `/teach/session/{id}/review` 경로와 `apps/web/src/pages/SupervisionResearch.tsx`의 legacy 링크 정규화를 수정했다. API 12 passed, local 교수자 15 passed(25.3s)다. | 관리자 사용자 경로의 회귀와 순수 teacher 계정에서 producer가 만든 비식별 signal의 `/teach/supervision`→drilldown→해당 리뷰 경로를 실제 배포에서 다시 확인한다. |
|
||||
|
||||
두 항목의 local 증거는 배포본 교체 또는 실제 배포 재검증 증거가 아니다. 운영 설정·실사용자·승인 원장은 변경하지 않았다.
|
||||
|
||||
## 상태 해석과 재개 조건
|
||||
|
||||
- `PASS`는 ledger에 실제 CUA 관찰이 연결된 시나리오만 뜻한다.
|
||||
- `RED`는 실제 배포에서 관찰된 결함이며 local 수정 통과만으로 닫지 않는다.
|
||||
- `BLOCKED`는 필요한 역할·등록 데이터 또는 명시적 mutation 승인 부족 때문에 실행할 수 없는 상태다.
|
||||
- `NOT_RUN`은 아직 실행하지 않은 상태이며 실패나 통과를 뜻하지 않는다.
|
||||
- 실행 재개 전에는 순수 teacher·OFF 계정, 필요한 비식별 등록·종료 회기와 허용된 mutation 범위를 준비하고 ledger의 최신 수치를 다시 읽는다. 독립 관찰자 공개 검증 R10은 여전히 `BLOCKED`다.
|
||||
- C11은 Tab→Enter로 통과했으며 ArrowDown 동작은 지원하지 않는 한계로 남긴다. S19는 과거 Ctrl+R 증거를 취소했지만, 이번 exact URL 이동 뒤 실제 문서 reload로 재확인해 `PASS`로 확정했다.
|
||||
Loading…
Add table
Add a link
Reference in a new issue