상태판 페르소나 읽기 모델 반영
This commit is contained in:
parent
eb77d7ec7c
commit
2afb4f45c8
1 changed files with 5 additions and 4 deletions
|
|
@ -672,14 +672,14 @@
|
|||
<div class="scard-body"><div class="kv"><b>현재</b><p>M1: voice learner turn의 audio_ref, silence_ms, speech_rate, barge_in을 리뷰 API <code>nonverbal</code> 이벤트로 파생하고, 회기 리뷰 축어록에 침묵·발화 속도·끼어듦·음성 입력 칩으로 표시한다. 2차로 <code>provider_events</code> JSONB 보존 슬롯을 추가해 control/STT provider 이벤트를 allowlist·size limit 후 저장한다. 3차에서는 저장 이벤트에 내부 taxonomy <code>event_type</code>/<code>category</code>를 추가해 sigh/cry/laugh/voice_activity/noise 등 canonical key를 남긴다. 4차에서는 인증된 회기 리뷰에 한숨·울음·웃음·호흡·운율·배경소음 계열만 한글 label/detail 칩으로 파생 노출한다. raw transcript/text payload, provider/source/raw type, 공개 공유 카드 노출은 제외했다. 실제 provider 기반 한숨·울음 감지와 live 마이크/WSS 장시간 실측은 아직 별도다. M2: <code>case_profile</code>을 learner-persona 안정 case로 upsert하고, <code>session_no</code>를 트랜잭션 안에서 원자 증가시킨다. 세션 종료 시 마스킹된 client-visible 축어록으로 fallback <code>session_summary.digest</code>와 case-level <code>case_digest</code>를 갱신하고, <code>rapport_trajectory</code>/<code>alliance_level</code>을 결정론 상태 수치에서 갱신한다. 종료 시점에는 마스킹된 client-visible 발화에서 <code>[NAME]</code>/<code>[ORG]</code> identity와 명시적 상담 약속만 <code>pinned_fact</code>로 upsert한다. 삽입 또는 값 변경 시에는 <code>pinned_fact_history</code>에 append-only 이력을 남기고, 같은 값 재확인과 <code>locked</code> fact는 이력을 늘리지 않는다. 5차에서는 명시적 상담 약속 철회/부정 문장만 기존 non-locked <code>agreement:counseling</code> fact를 <code>contradicted</code>로 격리하고 history reason <code>contradiction</code>을 남긴다. 새 contradicted fact를 임의 생성하거나 관계갈등·위기·임상 추론을 자동 모순 처리하지 않는다. 6차에서는 종료 저장 성공 뒤 background task로 마스킹된 client-visible 내담자 발화만 <code>app.turn_embedding</code>에 idempotent 색인한다. 시작/턴/voice 경로는 다음 회기 seed recall에서 <code>case_digest</code>, 직전 <code>session_summary</code>, client-visible non-contradicted <code>pinned_fact</code>, episodic recall 단편을 조립해 사용한다. M3: Google/SAML/dev-login이 <code>AUTH_EMAIL_COHORT_MAP</code>/<code>AUTH_DOMAIN_COHORT_MAP</code> 및 SAML cohort claim을 <code>cohort_ids</code>로 전달하고, DB <code>app_user.external_id</code>는 provider subject(<code>google:</code>/<code>saml:</code>/<code>dev:</code>) 기반으로 저장한다.</p></div><div class="kv k-warn"><b>권고</b><p>M1 실제 provider 기반 한숨·울음/억양 감지, 장시간 마이크/WSS 실측과 역량 지표화 정책, M2 관계/임상 fact 승격 기준·LLM digest 압축, M3 운영 SAML 서명검증·기관 claim schema/test tenant·deprovisioning audit는 후속이다.</p></div></div>
|
||||
</article>
|
||||
<article class="scard" data-status="planned" data-cat="거버넌스·아키텍처" data-owner="1">
|
||||
<button class="scard-head" aria-expanded="false"><span class="chip c-plan">TRACK X1·X2 2차·L1</span><span class="scard-mid"><span class="scard-title">재귀학습 export(X1)·API 비용 관측(X2)·스택 정합성·일정(L1)<span class="ownbadge">내 차례</span></span><span class="scard-sum">X1 dry-run export, X2 비용 관측·모델 override·evaluator semantic cache·모델별 비용 리포트 완료. L1은 Node 방향 결정, gateway 계약, schema-backed golden fixture, Node conformance runner, session read-model 분리 완료. 등재 문서 반영은 외부 gate.</span></span><span class="caret" aria-hidden="true"></span></button>
|
||||
<div class="scard-body"><div class="kv"><b>현재</b><p>X1: <code>scripts/export-recursive-dataset.py</code>와 <code>app.services.dataset_export</code>로 masked-text JSONL dry-run, PII scan, κ/ICC 계산, approved export 게이트를 구현했다. 기본은 <code>technical_dry_run</code>이고 <code>ds.*</code> write는 <code>--write-dataset</code> 명시 시에만 수행한다. X2: <code>app.turns</code>의 provider/model/tokens/cost를 최근 7일 기준으로 집계하는 <code>GET /admin/usage</code>를 추가했고, 운영 콘솔 <code>/admin</code>에 누적 비용·입출력 토큰·계량 커버리지·provider/model breakdown, 일별 <code>daily_cost</code> 추이, <code>ADMIN_USAGE_BUDGET_USD</code> 기반 예산 경고(ok/warn/exceeded)를 표시한다. <code>EVALUATOR_FAST_MODEL</code>/<code>EVALUATOR_DEEP_MODEL</code> 설정 시 fast/deep 평가 호출만 해당 모델 override로 gateway에 전달하고, 비워두면 기존 default 라우팅을 유지한다. fast/deep evaluator structured 결과는 canonical request SHA-256 키의 인메모리 semantic cache로 재사용한다. 캐시는 <code>EVALUATOR_SEMANTIC_CACHE_ENABLED</code>, <code>EVALUATOR_SEMANTIC_CACHE_TTL_SECONDS</code>, <code>EVALUATOR_SEMANTIC_CACHE_MAX_ENTRIES</code>로 제한하며, 원문 prompt·completion은 저장하지 않고 성공 파싱 결과만 캐시한다. <code>/admin/usage</code>는 evaluator cache enabled/entries/hits/misses/stores/evictions/requests/hit_rate도 함께 반환하고, 관리자 <code>AI 비용</code> 카드가 hit-rate와 일별 비용/턴 추이를 표시한다. <code>app.services.usage_report</code>와 <code>scripts/report-ai-usage.py</code>는 같은 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 우선 교체 가능성 방향을 채택했다. <code>docs/decisions/backend-node-transition.md</code>에 FastAPI 유지 사유와 strangler 전환 원칙을 기록했고, <code>app/contracts/engine_gateway.py</code>를 추가해 Python client와 현재 gateway가 같은 요청/응답/SSE 계약을 공유한다. 이어서 <code>EngineClient.stream_packets()</code>와 gateway <code>GenerateResponse</code> 반환으로 서비스 레이어의 wire-format 의존을 줄였다. <code>engine_gateway_contract.v1.json</code> golden fixture와 <code>engine_gateway_schema.v1.json</code> schema artifact로 generate request/response와 stream token/done/error packet을 고정했고, <code>scripts/check-engine-gateway-contract.mjs</code>가 같은 artifact를 Node.js에서 Python import 없이 검증한다. 이번 패스에서는 <code>app/session_read_model.py</code>를 추가해 세션 목록·대시보드·상세·리뷰·공유 payload의 DTO와 builder를 route에서 분리했고, <code>routes/sessions.py</code>는 auth/RLS DB read/persistence만 남기도록 좁혔다.</p></div><div class="kv k-warn"><b>권고</b><p>X1 approved export·골든셋 승격은 steward/legal 승인, reviewer disposition, IAA 게이트(κ≥0.6/ICC≥0.75) 이후만 진행한다. X2 후속은 자동 차단·한도 enforcement 정책이다. L1의 남은 게이트는 신청서/저작권 등재 문서에 FastAPI 유지 사유와 Node 전환 계획을 반영하는 외부 거버넌스 증거다. 다음 내부 후보는 persona DTO/mapper 분리다.</p></div></div>
|
||||
<button class="scard-head" aria-expanded="false"><span class="chip c-plan">TRACK X1·X2 2차·L1</span><span class="scard-mid"><span class="scard-title">재귀학습 export(X1)·API 비용 관측(X2)·스택 정합성·일정(L1)<span class="ownbadge">내 차례</span></span><span class="scard-sum">X1 dry-run export, X2 비용 관측·모델 override·evaluator semantic cache·모델별 비용 리포트 완료. L1은 Node 방향 결정, gateway 계약, schema-backed golden fixture, Node conformance runner, session/persona read-model 분리 완료. 등재 문서 반영은 외부 gate.</span></span><span class="caret" aria-hidden="true"></span></button>
|
||||
<div class="scard-body"><div class="kv"><b>현재</b><p>X1: <code>scripts/export-recursive-dataset.py</code>와 <code>app.services.dataset_export</code>로 masked-text JSONL dry-run, PII scan, κ/ICC 계산, approved export 게이트를 구현했다. 기본은 <code>technical_dry_run</code>이고 <code>ds.*</code> write는 <code>--write-dataset</code> 명시 시에만 수행한다. X2: <code>app.turns</code>의 provider/model/tokens/cost를 최근 7일 기준으로 집계하는 <code>GET /admin/usage</code>를 추가했고, 운영 콘솔 <code>/admin</code>에 누적 비용·입출력 토큰·계량 커버리지·provider/model breakdown, 일별 <code>daily_cost</code> 추이, <code>ADMIN_USAGE_BUDGET_USD</code> 기반 예산 경고(ok/warn/exceeded)를 표시한다. <code>EVALUATOR_FAST_MODEL</code>/<code>EVALUATOR_DEEP_MODEL</code> 설정 시 fast/deep 평가 호출만 해당 모델 override로 gateway에 전달하고, 비워두면 기존 default 라우팅을 유지한다. fast/deep evaluator structured 결과는 canonical request SHA-256 키의 인메모리 semantic cache로 재사용한다. 캐시는 <code>EVALUATOR_SEMANTIC_CACHE_ENABLED</code>, <code>EVALUATOR_SEMANTIC_CACHE_TTL_SECONDS</code>, <code>EVALUATOR_SEMANTIC_CACHE_MAX_ENTRIES</code>로 제한하며, 원문 prompt·completion은 저장하지 않고 성공 파싱 결과만 캐시한다. <code>/admin/usage</code>는 evaluator cache enabled/entries/hits/misses/stores/evictions/requests/hit_rate도 함께 반환하고, 관리자 <code>AI 비용</code> 카드가 hit-rate와 일별 비용/턴 추이를 표시한다. <code>app.services.usage_report</code>와 <code>scripts/report-ai-usage.py</code>는 같은 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 우선 교체 가능성 방향을 채택했다. <code>docs/decisions/backend-node-transition.md</code>에 FastAPI 유지 사유와 strangler 전환 원칙을 기록했고, <code>app/contracts/engine_gateway.py</code>를 추가해 Python client와 현재 gateway가 같은 요청/응답/SSE 계약을 공유한다. 이어서 <code>EngineClient.stream_packets()</code>와 gateway <code>GenerateResponse</code> 반환으로 서비스 레이어의 wire-format 의존을 줄였다. <code>engine_gateway_contract.v1.json</code> golden fixture와 <code>engine_gateway_schema.v1.json</code> schema artifact로 generate request/response와 stream token/done/error packet을 고정했고, <code>scripts/check-engine-gateway-contract.mjs</code>가 같은 artifact를 Node.js에서 Python import 없이 검증한다. <code>app/session_read_model.py</code>는 세션 목록·대시보드·상세·리뷰·공유 payload의 DTO와 builder를 route에서 분리했고, <code>app/persona_read_model.py</code>는 페르소나 catalog/review/draft/source/evidence DTO와 mapper를 route에서 분리했다. 각 route는 auth/RLS DB read/persistence/RAG/LLM side effect를 유지한다.</p></div><div class="kv k-warn"><b>권고</b><p>X1 approved export·골든셋 승격은 steward/legal 승인, reviewer disposition, IAA 게이트(κ≥0.6/ICC≥0.75) 이후만 진행한다. X2 후속은 자동 차단·한도 enforcement 정책이다. L1의 남은 게이트는 신청서/저작권 등재 문서에 FastAPI 유지 사유와 Node 전환 계획을 반영하는 외부 거버넌스 증거다. 다음 내부 후보는 H3 항목형 저작 UI다.</p></div></div>
|
||||
</article>
|
||||
</div>
|
||||
<div class="detail-blocks">
|
||||
<div class="detail-block"><h4>즉시 착수 가능(내부 코드, 외부 합의 불요)</h4><ul><li>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 고도화 영역이다.</li><li>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 의존이다.</li></ul></div>
|
||||
<div class="detail-block"><h4>즉시 착수 가능(내부 코드, 외부 합의 불요)</h4><ul><li>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 고도화 영역이다.</li><li>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 의존이다.</li></ul></div>
|
||||
<div class="detail-block"><h4>소유자 결정 / 외부(임상팀·기관) 의존</h4><ul><li>임상팀 산출물: C1 워크시트 항목·루브릭, C3 CBT 콘텐츠·체인, C2 위기 스크립트·서약 문안, H2 골든셋 코딩.</li><li>소유자 평가설계: H1 실험/통제군·3척도 문항·50분 흐름, κ/ICC·환각률 목표(doc4 미명시).</li><li>기관(한신 IT): M3 SSO IdP·test tenant·claim 스키마·인증서, 거버넌스 증거.</li><li>거버넌스: L1 Node 전환 방향은 결정됨. 남은 것은 FastAPI 유지 사유와 계약 우선 전환 계획의 저작권 등재 문서화·IP 협의.</li></ul></div>
|
||||
<div class="detail-block"><h4>판독 한계 (정직성)</h4><ul><li>핵심 축어록 2단 표는 PDF 시각 판독이 1차 근거(txt 일부 누락), OCR 잔재 존재.</li><li>doc4 κ/ICC·환각률은 신청서 본문 미명시 — 계약 확정 지표로 단정 금지.</li><li>'현재상태'는 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 외부 거버넌스는 아직 게이트다.</li></ul></div>
|
||||
<div class="detail-block"><h4>판독 한계 (정직성)</h4><ul><li>핵심 축어록 2단 표는 PDF 시각 판독이 1차 근거(txt 일부 누락), OCR 잔재 존재.</li><li>doc4 κ/ICC·환각률은 신청서 본문 미명시 — 계약 확정 지표로 단정 금지.</li><li>'현재상태'는 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 외부 거버넌스는 아직 게이트다.</li></ul></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -866,6 +866,7 @@
|
|||
<tr><td>H2 session review 2-column UX</td><td><code>npm run typecheck</code> / <code>npx playwright test e2e/session-review.spec.ts --project=chromium-desktop --workers=1</code> / <code>npx playwright test e2e/layout-visual-gate.spec.ts --project=chromium-single-run --workers=1</code></td><td>Typecheck 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.</td></tr>
|
||||
<tr><td>M2 case memory</td><td><code>python -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 -q</code></td><td>67 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 <code>app.turn_embedding</code> idempotently.</td></tr>
|
||||
<tr><td>L1 session read-model split</td><td><code>python -B -m py_compile app/session_read_model.py app/routes/sessions.py</code> / <code>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</code> / <code>npm run check:api-types</code> / <code>npm run typecheck</code></td><td>py_compile passed; focused backend 48 passed; OpenAPI generated API type check and web typecheck passed. <code>app/session_read_model.py</code> now owns session list/dashboard/detail/review/share DTOs and deterministic builders while <code>routes/sessions.py</code> keeps auth, RLS-backed reads, persistence, and route decorators.</td></tr>
|
||||
<tr><td>L1 persona read-model split</td><td><code>python -B -m py_compile app/persona_read_model.py app/routes/personas.py</code> / <code>python -B -m pytest -p no:cacheprovider app/test_persona_review.py -q</code> / <code>npm run check:api-types</code> / <code>npm run typecheck</code></td><td>py_compile passed; persona review/backend 33 passed; OpenAPI generated API type check and web typecheck passed. <code>app/persona_read_model.py</code> now owns persona catalog/review/draft/source/evidence DTOs and deterministic mappers while <code>routes/personas.py</code> keeps auth, teacher/admin gates, DB repository calls, RAG source registration, LLM draft generation, and HTTP error mapping.</td></tr>
|
||||
<tr><td>M1 provider_events preservation</td><td><code>python -B -m pytest -p no:cacheprovider app/test_voice_ws.py app/test_session_turn_persistence.py app/test_voice_service.py -q</code></td><td>45 passed; voice control/STT provider events are allowlisted, size-limited, and tagged with internal <code>event_type</code>/<code>category</code> taxonomy into <code>app.turns.provider_events</code>. 인증된 review <code>nonverbal</code>은 정규화 taxonomy 일부만 파생 칩으로 노출하며 raw transcript/text/provider/source/raw type은 응답하지 않는다.</td></tr>
|
||||
<tr><td>C1 case worksheet</td><td><code>python -m pytest app/test_session_turn_persistence.py app/test_rbac_idor.py -q</code> / <code>npm run check:api-types</code> / <code>npm run typecheck</code> / <code>npm run build</code> / local API smoke</td><td>25 passed; session review exposes transcript-grounded <code>caseWorksheet</code>, learner-edited <code>saved_by_learner</code> worksheet persists through <code>app.case_worksheet</code>, and evaluator-only turns stay hidden. Local smoke returned <code>saved_by_learner:local smoke saved worksheet</code>. Stage labels are normalized at response boundaries.</td></tr>
|
||||
<tr><td>M3 auth claim mapping</td><td><code>python -B -m pytest -p no:cacheprovider app/test_auth_providers.py -q</code></td><td>30 passed; Google/SAML cohort maps, provider external_id, provider error reason, PKCE/state, HttpOnly cookie, SAML fixture ACS covered</td></tr>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue