Commit graph

69 commits

Author SHA1 Message Date
Yun Chan
d80c710f3a 민감 응답 no-store 강화 + 배포 E2E stale 기대값 갱신
Some checks failed
API contract / OpenAPI type drift (push) Failing after 1m4s
/personas·/admin 응답에 Cache-Control: no-store를 강제한다. E2E에서
미인증 /personas 요청이 일시적으로 인증 응답 본문을 받은 재현 이력이
있어 중간 캐시 재사용을 원천 차단한다.

public-admin-visual 카탈로그 테스트는 운영 데이터에 따라 바뀌는 원장
모델명(claude-opus-4-8 → gpt-5.6-terra)과 엔진 옵션 수(6→9), 모델 수
문구를 고정값으로 기대했어 데이터 종속 실패였다. 계량 행·개수 정규식으로
갱신한다.
2026-09-12 06:23:47 +09:00
Yun Chan
45b84faa0d codex·agy OAuth 계정 연결 지원 (ChatGPT/Antigravity 네이티브 어댑터)
Some checks failed
API contract / OpenAPI type drift (push) Failing after 1m0s
omniroute와 동일하게 공개 클라이언트 자격증명으로 서버사이드 OAuth 교환을
제공한다. 관리자가 제공자 로그인 후 브라우저에 남는 code를 붙여넣으면
토큰·refresh token·메타데이터(account-id, Code Assist project)를 저장하고
게이트웨이에 push한다.

- codex_api 어댑터: chatgpt.com/backend-api/codex/responses (Responses SSE,
  401 시 refresh token으로 자가 갱신)
- antigravity_api 어댑터: cloudcode-pa v1internal:streamGenerateContent
  (Gemini 형식 SSE, loadCodeAssist로 프로젝트 발급, 401 자가 갱신)
- 자격증명 저장소에 refresh_token_encrypted·extra 컬럼 추가(부트스트랩
  SQL 포함), 게이트웨이 push가 구조화 자격증명을 전달
2026-09-11 19:01:35 +09:00
Yun Chan
cb4d45579d OAuth 로그인 버튼으로 provider 연결 + 제공자 연결 패널 그리드 이동
Some checks failed
API contract / OpenAPI type drift (push) Failing after 59s
claude(setup-token과 동일한 PKCE, code#state 수동 흐름)와
openrouter(헤드리스 코드 표시 모드)는 OAuth 로그인 버튼으로 연결한다.
관리자가 제공자 로그인 뒤 표시되는 인증 코드를 붙여넣으면 서버가
토큰/키로 교환해 저장·게이트웨이 push한다. state는 서버 발급·15분
단일 사용으로 CSRF를 막는다. codex·agy는 붙여넣기 방식을 유지한다.

제공자 연결 패널은 우측 사이드에서 메인 컬럼의 Provider·모델별 사용
원장 아래로 옮기고 반응형 그리드(너비에 따라 1~n열)로 배치한다.
2026-09-11 17:33:51 +09:00
Yun Chan
e3a9fc717c provider 자격증명 테이블 생성을 존재 검사 선행으로 전환
Some checks failed
API contract / OpenAPI type drift (push) Failing after 1m6s
앱 DB 계정에는 스키마 CREATE 권한이 없어 런타임 CREATE TABLE IF NOT
EXISTS가 테이블이 이미 있어도 권한 거부로 실패한다(운영 실측). to_regclass
존재 검사를 먼저 하고, 부트스트랩 SQL(05_runtime_auth.sql)에 DDL을 추가해
신규 볼륨에서도 소유자가 테이블을 만들도록 한다.
2026-09-11 16:56:02 +09:00
Yun Chan
4b45d33142 관리자 AI 제공자 연결 기능 추가 (claude·codex·agy·openrouter 토큰 붙여넣기 연결)
Some checks failed
API contract / OpenAPI type drift (push) Failing after 12m57s
관리자 /admin/ai 화면에서 provider 토큰(OAuth 액세스 토큰 또는 API 키)을
발급받아 붙여넣으면 DB에 암호화 저장되고, shared-secret으로 보호되는
게이트웨이 내부 엔드포인트로 push되어 실행 중인 엔진 컨테이너에 즉시
적용된다. NAS처럼 게이트웨이가 컨테이너로 도는 환경에서 CLI·로컬 PC
의존 없이 claude_api·openai·openrouter를 연결할 수 있다.

- 게이트웨이: openrouter 어댑터 신설(chat/completions), OAuth 토큰이면
  Anthropic Bearer 헤더, /internal/provider-credentials GET/POST와
  boot_id 기반 재동기화
- API: app.admin_provider_credential 테이블(idempotent DDL), stdlib
  HMAC-CTR+MAC 암호화 서비스(PROVIDER_CREDENTIAL_SECRET, 폴백
  SESSION_SECRET), /admin/providers CRUD·검증 라우트
- 웹: 제공자 연결 패널(저장·검증·해제, 토큰 힌트만 표시), 엔진 선택에
  OpenRouter 추가, api.gen.ts 재생성
- compose: api 서비스에 PROVIDER_CREDENTIAL_SECRET 전달(로컬·NAS)
2026-09-11 14:06:15 +09:00
Yun Chan
1306c524c1 회기 집계와 기록 복귀 및 감독 근거 링크 수정
Some checks failed
API contract / OpenAPI type drift (push) Failing after 4m46s
2026-09-09 14:41:54 +09:00
Yun Chan
a0311c5957 회기 무발화 0턴 분리, 자기예측 락 불변식 및 TDD 회귀 검증 완료
Some checks failed
API contract / OpenAPI type drift (push) Failing after 3m27s
2026-09-08 23:28:06 +09:00
Yun Chan
72353ecd82 회기 연속성과 멀티 케이스 계약을 영속화 2026-09-01 11:45:16 +09:00
Yun Chan
21bbe3f98d 구글 계정 식별 회귀를 고정 2026-08-30 00:00:04 +09:00
Yun Chan
3a7b6f7760 사람 승인 게이트를 명시화 2026-08-29 23:59:29 +09:00
Yun Chan
707dba4f8f 관리자 사용량 근거를 정교화 2026-08-29 23:59:17 +09:00
Yun Chan
ccdcfcd2f5 아바타 저장소 승격 계약을 완성 2026-08-29 23:58:33 +09:00
Yun Chan
dba9b75a38 Google 계정 데이터 별칭 복구를 추가 2026-08-29 15:34:50 +09:00
Yun Chan
471eb9621a Google 로그인을 단일 버튼으로 정리 2026-08-29 06:54:11 +09:00
Yun Chan
3b540a881f 외부 임상 검토 원장을 보강 2026-08-28 21:01:57 +09:00
Yun Chan
f63e12999b 위기 문장 문맥 판정을 보강 2026-08-28 20:20:15 +09:00
Yun Chan
aeca42475b 위기 표현 경계를 확장 2026-08-28 19:58:41 +09:00
Yun Chan
35a9d8802c 위기 신호 기술 검증을 보강 2026-08-28 19:55:04 +09:00
Yun Chan
6988280b30 C-001 임상 검토 게이트 보강 2026-08-28 19:04:17 +09:00
Yun Chan
2a39636163 개선관리 요구사항과 Google 로그인을 완료 2026-08-28 16:07:09 +09:00
Yun Chan
70d7cb34a3 feat(coach): AI 코칭 버튼 및 버블 팝업 대화형 조언 기능 구현 2026-08-18 22:15:19 +09:00
Yun Chan
bf5f7352ce 회기 종료 pinned_fact upsert를 AI evaluator 뷰로 실행
공개 /sessions/{id}/end 503(2026-08-18 실측): app.pinned_fact RLS는 learner 역할에
INSERT(소유 케이스)만 허용하고 SELECT/UPDATE는 AI 컨텍스트 또는 admin/instructor
전용이다. end_session이 learner 연결로 SELECT FOR UPDATE + INSERT ON CONFLICT
DO UPDATE 조합을 돌려 충돌 후보 행 가시성이 막히며 InsufficientPrivilegeError로
실패했고, fallback 차단이 503으로 노출됐다. 엔진이 건강해 deep 평가가 처음으로
pinned 팩트를 반환한 순간 발화한 잠복 결함이다.
- _upsert_pinned_fact_candidates_with_ai_view: 같은 learner uid 로
  acquire(ai_view='evaluator') 를 열어 INSERT/SELECT/UPDATE 정책을 모두 충족
- 검증: 공개 DB에서 롤백 재현 — learner 컨텍스트 upsert RLS 거부,
  ai_view evaluator 컨텍스트 동일 SQL 통과. app 924 passed·관련 62 passed
2026-08-18 18:36:04 +09:00
Yun Chan
7b4955c3fc 주기 실회기 검증과 G7 종료계약 보강 2026-08-09 23:37:19 +09:00
Yun Chan
7cece90e33 PII 표시 토큰 누출 보정 2026-08-09 21:04:29 +09:00
Yun Chan
5221f79e3f G7 증명과 G8 clean-head 승격 준비 2026-08-09 18:22:03 +09:00
Yun Chan
2624d49984 설치형 로컬 TTS를 MeloTTS 한국어(MIT)로 채택하고 엔드포인트로 연결
Higgs Audio v3 는 연구/비상업 라이선스라 config.py 가 environment != dev 에서
차단하고 있었다. 그 가드를 푸는 건 법적 판단이라 코드로 결정할 수 없어서,
상업 사용이 허용된 설치형을 다시 찾아 MeloTTS Korean 으로 바꿨다. 결과적으로
가드를 건드릴 필요 자체가 사라졌다 — Higgs 가드는 그대로 두고 provider 만
melotts 로 두면 운영에서도 동작한다.

검토 결과:
- MeloTTS   MIT       한국어 지원  -> 채택. CPU 실시간, 사전학습 다화자
- Kokoro-82M Apache2.0 한국어 없음  -> 탈락. 공식 VOICES.md 언어 목록에 부재
- Piper      GPL                   -> 탈락
- XTTS-v2 / Fish Speech 비상업      -> 탈락. Higgs 와 같은 문제

사전학습 다화자 모델이라 실존 인물 reference 를 쓰지 않는다. Higgs 경로가
P1 프리셋 한정이던 이유가 없으므로 모든 페르소나 프리셋에 적용된다.

구현:
- scripts/melotts-server.py  loopback HTTP 사이드카(/health, POST /tts -> WAV)
- voice_tts_provider=melotts 경로와 VIGNETTE_MELOTTS_TTS_* 설정
- scripts/start-melotts.ps1  런처(설치 순서 안내 포함)

실측:
- CPU 정상 상태 RTF 0.27~0.28(실시간 3.6배). 첫 실행 13.25 는 모델 다운로드
- POST /tts 200, WAV 350,566 bytes, 3.61s, 헤더 provider/model/license
- 빈 텍스트 422, 미지 경로 404 로 fail-closed
- 왕복 검증: MeloTTS 합성음을 로컬 faster-whisper 가 완전 일치 전사
  "그렇게 느끼셨군요. 조금 더 이야기해 주실 수 있을까요?" (word timestamp 8개)

설치 함정 3가지를 decisions/local-voice-stack.md 에 남겼다.
librosa 0.9.1 의 pkg_resources(setuptools<81), MeloTTS 가 언어와 무관하게
임포트하는 일본어 unidic 사전, Windows 한국어 g2p 의 eunjeon.

G7 게이트의 TTS 허용목록에 melotts 를 추가했다. 선언/실제 불일치 차단과
배치 STT 배제는 그대로다.

검증: API 914 passed, 사이드카 melotts 16/16 + whisper 37/37, SSOT FAIL 0, ruff clean.
2026-08-08 09:29:57 +09:00
Yun Chan
16e791e044 G0~G8 성과·동맹 측정 OS 작업 일괄 고정
8월 7일까지 워킹트리에만 남아 있던 미커밋 작업을 커밋한다. 여러 사본
폴더(worktree·clone)에 흩어져 있던 중간 스냅샷을 정리하기 전에 원본을
git 이력으로 고정하는 것이 목적이다.

- contracts/routes/services: measurement, outcome_trajectory, rupture_repair,
  deliberate_practice, calibration_transfer, supervision_research,
  multimodal_alliance, continuous_improvement 계열 신규 모듈과 테스트
- infra/db/init: 07~16 마이그레이션(측정 기반~calibration transfer 실행)
- apps/web: 세션 리뷰 카드·관리 화면·E2E 스펙 추가
- docs/ops: G0~G8 라이브 통합·배포·롤백 증거 문서와 evidence JSON/PNG
- scripts: smoke·ledger·릴리스 에이전트·NAS 프리뷰 운영 스크립트

engine.public 로그 .bak과 apps/web/test-results 산출물은 커밋에서 제외했다.
2026-08-08 01:30:53 +09:00
Yun Chan
c788343467 feat: 운영 안정성과 세션 음성 경험 개선 2026-07-31 00:13:08 +09:00
Yun Chan
4511383cd9 전수 E2E 순회·소유자 결정 6건 구현·디자인 감사 반영
- 전수 순회: IA 전 라우트 412개 기능 인벤토리를 체크리스트 백로그로 관리
  (docs/ops/e2e-full-sweep-2026-07-27.md), 신규 full-sweep 스펙 10파일 추가.
  RED→GREEN으로 결함 12건 수정: 관리자 무한 렌더 프리즈(TanStack autoReset
  루프), 복수 코호트 저장 유실, 페르소나 보관 503(SQL 컬럼 모호성), PII 과잉
  마스킹, /admin/ai watchdog 오탐 오버레이, 모바일 겹침 2건, 설정 스크롤
  스파이, 온보딩 전화번호 무검증, 리뷰 조사·난도 라벨, pending 피드백 등.
- 소유자 결정 구현: 설정 아바타 변경, 동의 철회·재동의 전체 흐름, 신규
  학습자 기초 우선 추천, 학생 분석 테이블 가상화(@tanstack/react-virtual),
  저작 모드 죽은 레일 정리, 감정 밸런스 타임라인 차트(deep turn_valence +
  결정론 파생 폴백).
- 디자인 감사(142차): 라이트 팔레트 AA 대비, 다크 토큰 별칭 통일, 미정의
  CSS 변수 정리, 한글 keep-all 전역화, 탭 타깃 24px, LCP preconnect.
- 검증: npm run e2e 병렬 432 수집 GREEN + 직렬 49/49 exit 0, 백엔드 pytest
  421, gateway 29, typecheck/build/design-ssot/dead-code/중복 게이트 통과,
  layout-visual-gate 15/15, session-layout 8/8. 상세는 SSOT 대시보드
  142~144차 노트.
2026-07-27 14:25:24 +09:00
Yun Chan
3dfddcac6f 전 저장소 리팩터링과 SSOT 정비 2026-07-15 21:31:30 +09:00
Yun Chan
d80e33da5e 텍스트 응답 음성 재생 연결 2026-07-13 16:09:34 +09:00
Yun Chan
64e06a1185 관리자 빈 화면 진단 로그 추가 2026-07-03 23:24:09 +09:00
Yun Chan
6b6241f468 한신대 피드백 개선팩 반영 2026-07-03 19:53:14 +09:00
Yun Chan
998acb44b0 OAuth 관리자 진입 경로 정규화 2026-07-03 19:46:05 +09:00
Yun Chan
778e8526d4 세션 평가·라이브코치·교수자 분석 라운드 마감 + 문서 정리 + 코드품질 리팩터
- 누적 작업트리 커밋: 회기 평가 복구·durable 저장, 라이브 코치 이력/근거, 교수자 학생분석, 음성 비언어 메타, PII 마스킹, 운영 티켓/헬스 등
- 문서: 완료 기록 docs/archive/ 냉동 보관, docs/ 단일 인덱스(docs/README.md)+통합 TODO(docs/TODO.md)로 정리
- 리팩터(행위 보존): Stage enum SSOT(taxonomy 소유·state_machine re-export), store recent/masked_turns 중복 제거, speaker_ko_label 단일 헬퍼, _list_sessions N+1 제거(state/turns 배치 + 턴평가 하이드레이션 배치)
- 검증: 백엔드 pytest 352 passed, _list_sessions E2E chromium-single-run 2 passed
2026-07-02 02:50:36 +09:00
Yun Chan
51053af536 안전 이벤트 대시보드 보강 2026-07-01 12:34:46 +09:00
Yun Chan
fe2796f05a 세션 평가와 교수자 분석 보강 2026-07-01 12:10:52 +09:00
Yun Chan
4e6b0045e3 관리자 워크스페이스 접근 확장과 소유자 결정 7건 확정 반영
- 관리자(role=admin)가 학습자·교수자·관리자 워크스페이스를 모두 접근하도록
  can_access_role/require_role와 프론트 auth 헬퍼·Sidebar 내비를 정리하고
  admin 워크스페이스 내비 E2E를 추가.
- 소유자 결정 7건 전건 확정(2026-06-30)을 SSOT 대시보드·백로그에 반영하고
  결정 필요 7→0으로 동기화. SSOT drift 게이트 기대 카운트도 갱신.
- 확정된 H1 평가설계(κ≥0.70·ICC≥0.75·환각률≤0.03·t-검정 α=0.05·무작위 배정)를
  approved-export κ 게이트(checker·dataset_export·recursive export)와
  KPI 측정계획·export manifest 문서에 반영.

검증: npm run typecheck, npm run check:api-types, 백엔드 pytest 290 passed,
admin 내비 E2E 1 passed, 레이아웃 시각게이트 9/9, session-layout 4 passed,
SSOT drift 게이트 PASS.
2026-06-30 10:57:46 +09:00
Yun Chan
1274ba9ccc 테스트 메일 수신자 제한 2026-06-29 17:13:34 +09:00
Yun Chan
3bf38c50df 메일 알림 시스템 추가 2026-06-29 17:07:01 +09:00
Yun Chan
206018b088 런타임 계약과 학습자 흐름 보강 2026-06-29 08:12:14 +09:00
Yun Chan
d18e4b6b4b Phase 3 KPI 계약 상수 분리 2026-06-29 00:01:24 +09:00
Yun Chan
30441bd93b 워크시트 검수 UI와 세션 다크톤 정리 2026-06-28 23:53:37 +09:00
Yun Chan
f7aae885b2 Phase 3 KPI 상태값 명시 2026-06-28 23:53:17 +09:00
Yun Chan
1e9f293fda 라이브코치 소스팩 새로고침 보강 2026-06-28 23:52:55 +09:00
Yun Chan
84599bbaa2 한국어 PII 인식기 경계 추가 2026-06-28 23:52:37 +09:00
Yun Chan
2bb052f624 세션 계약과 메모리 경계 보강 2026-06-28 23:52:18 +09:00
Yun Chan
391639c1de 평가 및 화면 구조 정리 2026-06-28 21:50:21 +09:00
Yun Chan
e7ebb38177 운영 지표와 지원 요청 저장소 추가 2026-06-28 20:13:06 +09:00
Yun Chan
50fa4ad432 세션 메모리와 비언어 이벤트 저장 2026-06-28 20:12:50 +09:00