From 2afb4f45c86d97240f608c9ef7cbd4b323ec3cce Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Sun, 28 Jun 2026 20:14:37 +0900 Subject: [PATCH] =?UTF-8?q?=EC=83=81=ED=83=9C=ED=8C=90=20=ED=8E=98?= =?UTF-8?q?=EB=A5=B4=EC=86=8C=EB=82=98=20=EC=9D=BD=EA=B8=B0=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev_dashboard.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index 9f185ed..63809ac 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -672,14 +672,14 @@
현재

M1: voice learner turn의 audio_ref, silence_ms, speech_rate, barge_in을 리뷰 API nonverbal 이벤트로 파생하고, 회기 리뷰 축어록에 침묵·발화 속도·끼어듦·음성 입력 칩으로 표시한다. 2차로 provider_events JSONB 보존 슬롯을 추가해 control/STT provider 이벤트를 allowlist·size limit 후 저장한다. 3차에서는 저장 이벤트에 내부 taxonomy event_type/category를 추가해 sigh/cry/laugh/voice_activity/noise 등 canonical key를 남긴다. 4차에서는 인증된 회기 리뷰에 한숨·울음·웃음·호흡·운율·배경소음 계열만 한글 label/detail 칩으로 파생 노출한다. raw transcript/text payload, provider/source/raw type, 공개 공유 카드 노출은 제외했다. 실제 provider 기반 한숨·울음 감지와 live 마이크/WSS 장시간 실측은 아직 별도다. M2: case_profile을 learner-persona 안정 case로 upsert하고, session_no를 트랜잭션 안에서 원자 증가시킨다. 세션 종료 시 마스킹된 client-visible 축어록으로 fallback session_summary.digest와 case-level case_digest를 갱신하고, rapport_trajectory/alliance_level을 결정론 상태 수치에서 갱신한다. 종료 시점에는 마스킹된 client-visible 발화에서 [NAME]/[ORG] identity와 명시적 상담 약속만 pinned_fact로 upsert한다. 삽입 또는 값 변경 시에는 pinned_fact_history에 append-only 이력을 남기고, 같은 값 재확인과 locked fact는 이력을 늘리지 않는다. 5차에서는 명시적 상담 약속 철회/부정 문장만 기존 non-locked agreement:counseling fact를 contradicted로 격리하고 history reason contradiction을 남긴다. 새 contradicted fact를 임의 생성하거나 관계갈등·위기·임상 추론을 자동 모순 처리하지 않는다. 6차에서는 종료 저장 성공 뒤 background task로 마스킹된 client-visible 내담자 발화만 app.turn_embedding에 idempotent 색인한다. 시작/턴/voice 경로는 다음 회기 seed recall에서 case_digest, 직전 session_summary, client-visible non-contradicted pinned_fact, episodic recall 단편을 조립해 사용한다. M3: Google/SAML/dev-login이 AUTH_EMAIL_COHORT_MAP/AUTH_DOMAIN_COHORT_MAP 및 SAML cohort claim을 cohort_ids로 전달하고, DB app_user.external_id는 provider subject(google:/saml:/dev:) 기반으로 저장한다.

권고

M1 실제 provider 기반 한숨·울음/억양 감지, 장시간 마이크/WSS 실측과 역량 지표화 정책, M2 관계/임상 fact 승격 기준·LLM digest 압축, M3 운영 SAML 서명검증·기관 claim schema/test tenant·deprovisioning audit는 후속이다.

- -
현재

X1: scripts/export-recursive-dataset.pyapp.services.dataset_export로 masked-text JSONL dry-run, PII scan, κ/ICC 계산, approved export 게이트를 구현했다. 기본은 technical_dry_run이고 ds.* write는 --write-dataset 명시 시에만 수행한다. X2: app.turns의 provider/model/tokens/cost를 최근 7일 기준으로 집계하는 GET /admin/usage를 추가했고, 운영 콘솔 /admin에 누적 비용·입출력 토큰·계량 커버리지·provider/model breakdown, 일별 daily_cost 추이, ADMIN_USAGE_BUDGET_USD 기반 예산 경고(ok/warn/exceeded)를 표시한다. EVALUATOR_FAST_MODEL/EVALUATOR_DEEP_MODEL 설정 시 fast/deep 평가 호출만 해당 모델 override로 gateway에 전달하고, 비워두면 기존 default 라우팅을 유지한다. fast/deep evaluator structured 결과는 canonical request SHA-256 키의 인메모리 semantic cache로 재사용한다. 캐시는 EVALUATOR_SEMANTIC_CACHE_ENABLED, EVALUATOR_SEMANTIC_CACHE_TTL_SECONDS, EVALUATOR_SEMANTIC_CACHE_MAX_ENTRIES로 제한하며, 원문 prompt·completion은 저장하지 않고 성공 파싱 결과만 캐시한다. /admin/usage는 evaluator cache enabled/entries/hits/misses/stores/evictions/requests/hit_rate도 함께 반환하고, 관리자 AI 비용 카드가 hit-rate와 일별 비용/턴 추이를 표시한다. app.services.usage_reportscripts/report-ai-usage.py는 같은 usage JSON에서 provider/model별 cost share, token share, cost/turn, cost/1k tokens, budget/cache warning을 산출한다. DB 미가용 dev에서는 runtime store로 fallback하지만 prod에서는 fail-closed한다. L1: 소유자 결정으로 Node.js 우선 교체 가능성 방향을 채택했다. docs/decisions/backend-node-transition.md에 FastAPI 유지 사유와 strangler 전환 원칙을 기록했고, app/contracts/engine_gateway.py를 추가해 Python client와 현재 gateway가 같은 요청/응답/SSE 계약을 공유한다. 이어서 EngineClient.stream_packets()와 gateway GenerateResponse 반환으로 서비스 레이어의 wire-format 의존을 줄였다. engine_gateway_contract.v1.json golden fixture와 engine_gateway_schema.v1.json schema artifact로 generate request/response와 stream token/done/error packet을 고정했고, scripts/check-engine-gateway-contract.mjs가 같은 artifact를 Node.js에서 Python import 없이 검증한다. 이번 패스에서는 app/session_read_model.py를 추가해 세션 목록·대시보드·상세·리뷰·공유 payload의 DTO와 builder를 route에서 분리했고, routes/sessions.py는 auth/RLS DB read/persistence만 남기도록 좁혔다.

권고

X1 approved export·골든셋 승격은 steward/legal 승인, reviewer disposition, IAA 게이트(κ≥0.6/ICC≥0.75) 이후만 진행한다. X2 후속은 자동 차단·한도 enforcement 정책이다. L1의 남은 게이트는 신청서/저작권 등재 문서에 FastAPI 유지 사유와 Node 전환 계획을 반영하는 외부 거버넌스 증거다. 다음 내부 후보는 persona DTO/mapper 분리다.

+ +
현재

X1: scripts/export-recursive-dataset.pyapp.services.dataset_export로 masked-text JSONL dry-run, PII scan, κ/ICC 계산, approved export 게이트를 구현했다. 기본은 technical_dry_run이고 ds.* write는 --write-dataset 명시 시에만 수행한다. X2: app.turns의 provider/model/tokens/cost를 최근 7일 기준으로 집계하는 GET /admin/usage를 추가했고, 운영 콘솔 /admin에 누적 비용·입출력 토큰·계량 커버리지·provider/model breakdown, 일별 daily_cost 추이, ADMIN_USAGE_BUDGET_USD 기반 예산 경고(ok/warn/exceeded)를 표시한다. EVALUATOR_FAST_MODEL/EVALUATOR_DEEP_MODEL 설정 시 fast/deep 평가 호출만 해당 모델 override로 gateway에 전달하고, 비워두면 기존 default 라우팅을 유지한다. fast/deep evaluator structured 결과는 canonical request SHA-256 키의 인메모리 semantic cache로 재사용한다. 캐시는 EVALUATOR_SEMANTIC_CACHE_ENABLED, EVALUATOR_SEMANTIC_CACHE_TTL_SECONDS, EVALUATOR_SEMANTIC_CACHE_MAX_ENTRIES로 제한하며, 원문 prompt·completion은 저장하지 않고 성공 파싱 결과만 캐시한다. /admin/usage는 evaluator cache enabled/entries/hits/misses/stores/evictions/requests/hit_rate도 함께 반환하고, 관리자 AI 비용 카드가 hit-rate와 일별 비용/턴 추이를 표시한다. app.services.usage_reportscripts/report-ai-usage.py는 같은 usage JSON에서 provider/model별 cost share, token share, cost/turn, cost/1k tokens, budget/cache warning을 산출한다. DB 미가용 dev에서는 runtime store로 fallback하지만 prod에서는 fail-closed한다. L1: 소유자 결정으로 Node.js 우선 교체 가능성 방향을 채택했다. docs/decisions/backend-node-transition.md에 FastAPI 유지 사유와 strangler 전환 원칙을 기록했고, app/contracts/engine_gateway.py를 추가해 Python client와 현재 gateway가 같은 요청/응답/SSE 계약을 공유한다. 이어서 EngineClient.stream_packets()와 gateway GenerateResponse 반환으로 서비스 레이어의 wire-format 의존을 줄였다. engine_gateway_contract.v1.json golden fixture와 engine_gateway_schema.v1.json schema artifact로 generate request/response와 stream token/done/error packet을 고정했고, scripts/check-engine-gateway-contract.mjs가 같은 artifact를 Node.js에서 Python import 없이 검증한다. app/session_read_model.py는 세션 목록·대시보드·상세·리뷰·공유 payload의 DTO와 builder를 route에서 분리했고, app/persona_read_model.py는 페르소나 catalog/review/draft/source/evidence DTO와 mapper를 route에서 분리했다. 각 route는 auth/RLS DB read/persistence/RAG/LLM side effect를 유지한다.

권고

X1 approved export·골든셋 승격은 steward/legal 승인, reviewer disposition, IAA 게이트(κ≥0.6/ICC≥0.75) 이후만 진행한다. X2 후속은 자동 차단·한도 enforcement 정책이다. L1의 남은 게이트는 신청서/저작권 등재 문서에 FastAPI 유지 사유와 Node 전환 계획을 반영하는 외부 거버넌스 증거다. 다음 내부 후보는 H3 항목형 저작 UI다.

-

즉시 착수 가능(내부 코드, 외부 합의 불요)

  • C1은 저장형 워크시트까지 2차 완료. C2는 1차 구조 완료, C3은 이론모드 배선과 명시 선택 UI까지 2차 완료, H2는 라이브 코칭 1차와 source pack version sync 및 학습자 리뷰 2열 UI 1차, H3은 페르소나 저작 CRUD/RAG 생성/seed materializer runner/source pack sync runner/raw source hash-only isolation까지 완료. 후속은 임상 스크립트, CBT 체인, 페르소나 항목형 저작 UI처럼 데이터·정책·UI 고도화 영역이다.
  • H4(부분): 한국어 날짜/금액/주소 및 이름/기관 로컬 휴리스틱 마스킹, 합성 fixture 평가 harness, metadata-only LLM call audit 경로, 로컬 live row proof, learner 동의 수락/철회/회기 시작 하드게이트 골격은 완료. 남은 내부 후보는 실제 운영 말뭉치 기반 오탐/미탐 평가와 모델 기반 정밀 ko NER adapter 검토이고, guardian/legal 서명 동의 evidence는 외부 게이트다. X1 dry-run export 1차와 X2 비용 관측·예산 경고/evaluator 모델 override·semantic cache·hit-rate 관측·일별 비용 추이·모델별 비용 검증 리포트는 완료했고, 자동 차단·한도 enforcement는 정책 결정 전까지 보류한다. M1 provider_events 보존·taxonomy·인증 리뷰 파생 칩 4차, M2 case memory+pinned_fact 보수적 실적재·append-only history·명시적 상담약속 철회 contradiction·episodic embedding writer 6차, M3 claim 1차, L1 schema-backed engine gateway golden fixture·Node.js conformance runner·session read-model 분리는 완료. 후속 내부 후보는 persona DTO/mapper 분리와 H3 항목형 저작 UI다. 운영 SAML 서명검증은 기관 IdP 의존이다.
+

즉시 착수 가능(내부 코드, 외부 합의 불요)

  • C1은 저장형 워크시트까지 2차 완료. C2는 1차 구조 완료, C3은 이론모드 배선과 명시 선택 UI까지 2차 완료, H2는 라이브 코칭 1차와 source pack version sync 및 학습자 리뷰 2열 UI 1차, H3은 페르소나 저작 CRUD/RAG 생성/seed materializer runner/source pack sync runner/raw source hash-only isolation까지 완료. 후속은 임상 스크립트, CBT 체인, 페르소나 항목형 저작 UI처럼 데이터·정책·UI 고도화 영역이다.
  • H4(부분): 한국어 날짜/금액/주소 및 이름/기관 로컬 휴리스틱 마스킹, 합성 fixture 평가 harness, metadata-only LLM call audit 경로, 로컬 live row proof, learner 동의 수락/철회/회기 시작 하드게이트 골격은 완료. 남은 내부 후보는 실제 운영 말뭉치 기반 오탐/미탐 평가와 모델 기반 정밀 ko NER adapter 검토이고, guardian/legal 서명 동의 evidence는 외부 게이트다. X1 dry-run export 1차와 X2 비용 관측·예산 경고/evaluator 모델 override·semantic cache·hit-rate 관측·일별 비용 추이·모델별 비용 검증 리포트는 완료했고, 자동 차단·한도 enforcement는 정책 결정 전까지 보류한다. M1 provider_events 보존·taxonomy·인증 리뷰 파생 칩 4차, M2 case memory+pinned_fact 보수적 실적재·append-only history·명시적 상담약속 철회 contradiction·episodic embedding writer 6차, M3 claim 1차, L1 schema-backed engine gateway golden fixture·Node.js conformance runner·session/persona read-model 분리는 완료. 후속 내부 후보는 H3 항목형 저작 UI다. 운영 SAML 서명검증은 기관 IdP 의존이다.

소유자 결정 / 외부(임상팀·기관) 의존

  • 임상팀 산출물: C1 워크시트 항목·루브릭, C3 CBT 콘텐츠·체인, C2 위기 스크립트·서약 문안, H2 골든셋 코딩.
  • 소유자 평가설계: H1 실험/통제군·3척도 문항·50분 흐름, κ/ICC·환각률 목표(doc4 미명시).
  • 기관(한신 IT): M3 SSO IdP·test tenant·claim 스키마·인증서, 거버넌스 증거.
  • 거버넌스: L1 Node 전환 방향은 결정됨. 남은 것은 FastAPI 유지 사유와 계약 우선 전환 계획의 저작권 등재 문서화·IP 협의.
-

판독 한계 (정직성)

  • 핵심 축어록 2단 표는 PDF 시각 판독이 1차 근거(txt 일부 누락), OCR 잔재 존재.
  • doc4 κ/ICC·환각률은 신청서 본문 미명시 — 계약 확정 지표로 단정 금지.
  • '현재상태'는 grep/코드 사실 기반에서 시작했으나 C1·C2·C3 2차 UI·H1~H4·M1 provider_events 보존/taxonomy/인증 리뷰 파생 노출·M2 case memory/pinned_fact/history/명시철회 contradiction/episodic embedding writer·M3·X1·X2·L1 Node conformance와 session read-model 분리는 구현 후 재검증 완료 기준이다. H3 원문 격리는 hash-only artifact와 RAG index 차단까지이며, 암호화 blob/vault 원문 실저장은 아직 후속이다. 실제 provider 기반 한숨·울음 감지, H4 legal/guardian evidence, M3 운영 IdP, L1 외부 거버넌스는 아직 게이트다.
+

판독 한계 (정직성)

  • 핵심 축어록 2단 표는 PDF 시각 판독이 1차 근거(txt 일부 누락), OCR 잔재 존재.
  • doc4 κ/ICC·환각률은 신청서 본문 미명시 — 계약 확정 지표로 단정 금지.
  • '현재상태'는 grep/코드 사실 기반에서 시작했으나 C1·C2·C3 2차 UI·H1~H4·M1 provider_events 보존/taxonomy/인증 리뷰 파생 노출·M2 case memory/pinned_fact/history/명시철회 contradiction/episodic embedding writer·M3·X1·X2·L1 Node conformance와 session/persona read-model 분리는 구현 후 재검증 완료 기준이다. H3 원문 격리는 hash-only artifact와 RAG index 차단까지이며, 암호화 blob/vault 원문 실저장은 아직 후속이다. 실제 provider 기반 한숨·울음 감지, H4 legal/guardian evidence, M3 운영 IdP, L1 외부 거버넌스는 아직 게이트다.
@@ -866,6 +866,7 @@ H2 session review 2-column UXnpm run typecheck / npx playwright test e2e/session-review.spec.ts --project=chromium-desktop --workers=1 / npx playwright test e2e/layout-visual-gate.spec.ts --project=chromium-single-run --workers=1Typecheck passed; 3 focused E2E passed; 9 visual gates passed. Filled learner review uses a left transcript rail and right work column at desktop widths while teacher/mobile layouts remain on existing rules. M2 case memorypython -B -m pytest -p no:cacheprovider app/test_session_memory.py app/test_session_turn_persistence.py app/test_orchestrator_masking.py app/test_runtime_policy.py -q67 passed; session end writes masked fallback digest, case_digest, rapport trajectory, alliance EWMA, conservative identity/agreement pinned_fact upserts, append-only pinned_fact_history on insert/change, explicit counseling-agreement withdrawal marks the existing non-locked fact as contradicted, and episodic writer stores only masked client-visible client turns into app.turn_embedding idempotently. L1 session read-model splitpython -B -m py_compile app/session_read_model.py app/routes/sessions.py / python -B -m pytest -p no:cacheprovider app/test_session_turn_persistence.py app/test_evaluation_persistence.py app/test_session_share.py app/test_learner_dashboard.py app/test_rbac_idor.py app/test_teacher_dashboard.py -q / npm run check:api-types / npm run typecheckpy_compile passed; focused backend 48 passed; OpenAPI generated API type check and web typecheck passed. app/session_read_model.py now owns session list/dashboard/detail/review/share DTOs and deterministic builders while routes/sessions.py keeps auth, RLS-backed reads, persistence, and route decorators. + L1 persona read-model splitpython -B -m py_compile app/persona_read_model.py app/routes/personas.py / python -B -m pytest -p no:cacheprovider app/test_persona_review.py -q / npm run check:api-types / npm run typecheckpy_compile passed; persona review/backend 33 passed; OpenAPI generated API type check and web typecheck passed. app/persona_read_model.py now owns persona catalog/review/draft/source/evidence DTOs and deterministic mappers while routes/personas.py keeps auth, teacher/admin gates, DB repository calls, RAG source registration, LLM draft generation, and HTTP error mapping. M1 provider_events preservationpython -B -m pytest -p no:cacheprovider app/test_voice_ws.py app/test_session_turn_persistence.py app/test_voice_service.py -q45 passed; voice control/STT provider events are allowlisted, size-limited, and tagged with internal event_type/category taxonomy into app.turns.provider_events. 인증된 review nonverbal은 정규화 taxonomy 일부만 파생 칩으로 노출하며 raw transcript/text/provider/source/raw type은 응답하지 않는다. C1 case worksheetpython -m pytest app/test_session_turn_persistence.py app/test_rbac_idor.py -q / npm run check:api-types / npm run typecheck / npm run build / local API smoke25 passed; session review exposes transcript-grounded caseWorksheet, learner-edited saved_by_learner worksheet persists through app.case_worksheet, and evaluator-only turns stay hidden. Local smoke returned saved_by_learner:local smoke saved worksheet. Stage labels are normalized at response boundaries. M3 auth claim mappingpython -B -m pytest -p no:cacheprovider app/test_auth_providers.py -q30 passed; Google/SAML cohort maps, provider external_id, provider error reason, PKCE/state, HttpOnly cookie, SAML fixture ACS covered