- apps/web(React) · apps/api(FastAPI) · infra(Docker) · docs(설계 SoT) - 마스터플랜·적대검증·메모리설계·디자인컨셉 docs 이관 - 미성년 사례데이터는 .gitignore로 제외(개인정보 보호)
29 KiB
MASTERPLAN REVISIONS — BLUE TEAM 재설계 (윤찬 원래요구 100% 충족판)
작성 2026-06-25 · BLUE TEAM(재설계자) · 대상 결함:
REDTEAM_FINDINGS.mdF-01~F-40 원본 마스터플랜은 보존. 이 문서는 변경점(패치) 전용이다. 적용 시HANSHIN_AI_PLATFORM_MASTERPLAN.md의 해당 절을 본 문서로 덮어쓴다. 재설계 원칙: 타협으로 결함을 덮지 않는다. "claude -p 못 쓰니 API로" 같은 요구 깎기는 금지. claude -p를 1급 엔진으로 실제 돌리는 아키텍처를 설계했다.
⚡ 0. 핵심 결정 역전 요약 (원본 §0 표를 이걸로 교체)
RED TEAM이 BLOCKER로 지목한 "요구 깎기"를 전부 되돌린다. 검증 근거는 실제 CLI v2.1.191 직접 실행(추측 아님, feedback_measure_before_report 준수).
| 영역 | 원본(깎인) 결정 | BLUE TEAM 복원 결정 | 검증/근거 |
|---|---|---|---|
| AI 엔진 | 기본=Messages API, claude -p=옵션 | 기본=로컬 claude -p 상주 풀(resident pool). Messages API는 가용성 폴백 전용(claude -p 다운 시에만 자동 전환) |
--input-format stream-json(="realtime streaming input") 실재 확인 → 1턴종료 모델 극복, 상주 멀티턴 가능 |
| 음성 | P1·Phase 2로 격하, Phase 1 음성 0 | Phase 1 DoD에 "1페르소나·1보이스 캐스케이드 음성 왕복 1턴" 포함. "무조건"을 일정 첫 외부시연부터 증명 | OpenAI gpt-4o-mini-tts + Deepgram, WSS 경로 1급화 |
| 음성 s2s | "1차 탈락" 단독 확정 | "캐스케이드 1차 / s2s 2차 PoC 옵션". 탈락 근거를 transcript 보존 단일 사유로 정리, 결정권은 윤찬 | OpenAI input_audio_transcription 네이티브 존재 → "transcript 없음"은 허수아비였음 |
| 자유연습 | 서버단 하드 차단 | 기본 ON + 피드백 권장 배지 + 교수자 토글. 차단은 미동의/미성년만(개인정보 사안) | feedback_risk_user_decides: 위험은 알리되 통제권은 사용자 |
| IRB | 헤더만 패치, 본문 잔존 | 본문 전수 정리. "IRB 신청/승인" 전 게이트 삭제, "교육용 파일럿"으로 통일 | 요구16 |
| fast-loop 엔진 | 외부 Haiku/Solar API 기본 | 로컬 상주 분류기(NAS) 또는 상주 Haiku claude -p 기본. 외부 API는 폴백 | 요구3 데이터주권 |
| 마스킹 게이트 | claude -p 우회 가능 | claude -p 경로도 Presidio 선통과 강제. 어댑터가 마스킹 후에만 stdin 주입 | 요구5/16 |
| 음성 전송 | 토폴로지에서 누락 | voice.chanpaca.net WSS 경로 1급 추가 |
요구7+요구4 E2E |
메타 선언: 9개 하위 설계서가 엔진·음성전송·스키마·권한모델에서 서로 모순(RED TEAM 메타결론)이었다. 본 문서가 단일 SoT 재정렬을 수행한다. 적용 후 모든 하위 설계서의 엔진 결정은 본 §1로, 권한 모델은 본 §5로, 스키마는 본 §3으로 통일한다.
1. 엔진 재설계 — claude -p 로컬 상주 풀을 1급으로 실제 구동 [F-01·F-12·F-13·F-14·F-15·F-29·F-39 해소]
1.1 핵심 돌파구: --input-format stream-json 상주 프로세스 (F-13 자기반박 해소)
RED TEAM·하위설계서 §6.3이 막혔던 지점 = "claude -p는 1턴 후 종료라 warm pool 불가 → SDK/API로 가야 함". 이 전제가 틀렸다. CLI v2.1.191 실측:
--input-format <format> "text"(default) | "stream-json" (realtime streaming input)
--replay-user-messages stream-json in+out 조합에서 user 메시지 ack 재방출
즉 단일 claude -p 프로세스를 띄워놓고 stdin으로 턴마다 JSON 메시지를 주입하는 양방향 멀티턴 모드가 네이티브로 존재한다. 콜드스타트를 회기당 1회(프로세스 기동 시)로 압축한다. 매 발화 콜드스타트(수 초)가 TTFT에 얹히는 문제 소멸.
[engine-pool 컨테이너] (FastAPI와 분리된 별도 프로세스 매니저)
┌─ claude -p #1 (resident, --input-format stream-json --output-format stream-json)
│ stdin ◄── {"type":"user","message":{...},"session_id":...} (턴마다 주입)
│ stdout ──► stream-json NDJSON (assistant delta, result, total_cost_usd)
├─ claude -p #2 (resident) ← 내담자 AI 전용 풀
├─ claude -p #3 (resident) ← deep-loop 평가 전용 풀
└─ ... (MAX_RESIDENT 만큼, 회기 수요에 따라 동적 스폰/회수)
1.2 정확한 호출 형태 (실CLI 검증 — 깨진 플래그 전부 교체) [F-14 해소]
원본 3AI §2.2 템플릿은 존재하지 않는 플래그를 썼다. 교체:
| 원본(깨짐) | 실CLI v2.1.191 | 교체 |
|---|---|---|
--max-turns 1 (없음) |
존재 안 함 | 제거. 도구 미사용 시 단일응답 종료가 기본. 폭주 통제는 --max-budget-usd(실재) |
--append-system-prompt-file (메인 help 부재) |
--append-system-prompt <prompt>(문자열)만 확인 |
전체 프롬프트 문자열 주입 또는 --settings로. file 변형은 윤찬 PC 실증 후에만 채택 |
--bare (정액 모드 기본) |
--bare는 OAuth/keychain 절대 미독(API키 강제) |
정액(모드 A)에서 --bare 제거. 재현성은 격리 CLAUDE_CONFIG_DIR+--settings(hooks off)+--strict-mcp-config로 |
모드 A (정액·기본 — 윤찬 요구3의 심장):
# 환경: claude setup-token OAuth 토큰 발급된 전용 HOME/CLAUDE_CONFIG_DIR
CLAUDE_CONFIG_DIR=/srv/sim/_cfg_client \
claude -p \
--model claude-opus-4-8 \
--append-system-prompt "$(cat ./prompts/client_persona.txt)" \
--input-format stream-json --output-format stream-json \
--include-partial-messages --verbose \
--strict-mcp-config --mcp-config ./mcp/rag.json \
--allowedTools "mcp__counseling_rag__search" \
--settings '{"hooks":{},"disableAllHooks":true}' \
--max-budget-usd 5 \
--fallback-model "claude-sonnet-4-6"
# stdin: 턴마다 {"type":"user",...} 주입 (상주)
--bare없음 → OAuth 정액 정상 작동. Max ×3 구독 한도 내 한계비용 0(종량제 위험 $1,800은 API키 경로 위험이지 정액 위험 아님 — F-01 논리오류 교정).- 격리
CLAUDE_CONFIG_DIR+--strict-mcp-config+disableAllHooks→ 글로벌 CLAUDE.md/hooks/디코MCP 오염 차단(=--bare가 주던 재현성을 정액 유지하며 확보). --max-budget-usd 5→ 회기당 비용 상한(폭주 자동 중단).--max-turns없이도 통제.--fallback-model→ overload/unavailable 시 CLI 자체가 Sonnet으로 폴백(가용성 1차 안전망).
모드 B (가용성 폴백 — 1급 아님, F-19 안전망): claude -p 프로세스 자체가 죽거나(OOM/rate-limit/토큰만료) 헬스체크 실패 시에만 어댑터가 Anthropic Messages API로 자동 전환. 평시엔 안 씀.
1.3 동시성·큐·과금통제 (F-13 부하 / F-29 비용) — 실측 게이트 신설
회기 라우터 → 회기별 직렬 큐(같은 session_id 턴 순서보장, asyncio.Lock)
→ 전역 Semaphore(MAX_RESIDENT, 초기 4~6, 부하테스트로 확정)
→ 상주 풀에서 idle 프로세스 할당 (없으면 스폰 or 백프레셔 큐)
- 상주 풀 정책: 회기 시작 시 ②내담자용 1 + ③deep용 1 프로세스 점유, 회기 종료 시 회수. ③fast는 로컬 분류기(별도 경량 풀, claude -p 아님).
- 과금통제 3중: ①정액이라 한계비용 0(평시) ②
--max-budget-usd회기 상한 ③total_cost_usd(stream-json result 이벤트)를turns.cost_usd에 실적재 → 폴백(모드 B) 비율·실비용 실시간 모니터, 임계 초과 시 디코 알림. - F-13 게이트 (Phase 1 DoD 신설): "상주 claude -p TTFT p50/p95 실측 + 동시 4회기 부하에서 열화곡선·피크 RSS·OOM 0건". 실측 전 400~900ms를 계획수치로 쓰지 않는다(
feedback_measure_before_report). 측정은 윤찬 PC에서 1회 실증 후 "검증됨" 표기.
1.4 fast-loop 데이터주권 복원 [F-12 해소]
- 매 발화 도는 fast-loop 기본 = 로컬 상주 분류기(NAS, 1B급 또는 상주 Haiku claude -p). 외부 Haiku/Solar API는 폴백.
- 어느 경로든
turns.llm_provider에 적재 → "claude/로컬 비중" 측정 가능. 외부 유지 시 윤찬 승인 + 마스킹 지연을 §6 예산표 반영.
1.5 어댑터 정규화 계약 [F-15 해소]
LLMEngine인터페이스: 정규화 이벤트 스키마(delta.text/result/cost) + 정규화 cost 규약(정액=토큰×참조단가 shadow cost, 종량제=실 total_cost_usd). 두 경로 cost 의미 통일 → 재귀학습·텔레메트리 일관성(요구5).- contract test DoD화: 동일 입력 → claude_cli 경로와 messages_api 경로가 동일 정규화 출력. Phase 0~1에 둘 다 구현.
1.6 역할별 인증/플래그 분기 [F-39 해소]
| AI | 엔진 | 인증/모드 |
|---|---|---|
| ②내담자(품질 생명) | Opus 상주 claude -p | 모드 A 정액 |
| ③deep-loop 평가(재현성) | Opus 상주 claude -p, 격리 cfg | 모드 A 정액 + --settings 고정(재현성) |
| ③fast-loop | 로컬 분류기/상주 Haiku | 로컬 |
| (전 경로 폴백) | Messages API | 모드 B (claude -p 다운 시만) |
2. 음성 재설계 — "무조건 + 멀티보이스 + 페르소나" 일정 첫날부터 증명 [F-02·F-07·F-08 해소]
2.1 Phase 1에 음성 PoC 진입 (F-02 해소)
- Phase 1 완료기준에 추가: "P1 1페르소나·1보이스(OpenAI gpt-4o-mini-tts) 캐스케이드 음성 왕복 1턴 PoC가 chanpaca.net에서 동작". 텍스트 완주와 별도 독립 트랙(소유파일 분리)으로 얇게라도 "무조건"을 일정에 박는다.
- Phase 2에서 음성을 IRB·3역할과 분리 독립 트랙으로(원본은 한 Phase에 뭉쳐 슬립 시 음성 증발 — F-27과 함께 해소).
2.2 음성 전송계층 WSS 1급화 (F-07 해소) — 토폴로지에 명시 추가
원본 §1.1 토폴로지에 음성이 통째 없었다. 추가:
[교수 브라우저] ─ getUserMedia/AudioWorklet PCM16 24kHz
├─ https://chanpaca.net (정적·일반 API) ← Cloudflare named tunnel
├─ https://stream.chanpaca.net (SSE 텍스트) ← §5에서 단일터널 통합 재검토
└─ wss://voice.chanpaca.net (음성 양방향 PCM) ← WSS 전용 경로 [신규 1급]
│
[Caddy] WS upgrade 통과 + 버퍼링 off + proxy_read_timeout 3600s
│
[voice-gw (FastAPI WebSocket)]
├─ ① Deepgram Nova streaming STT → interim/final transcript(+화자,ts)
├─ ② EOT(semantic, median<300ms, 상담튜닝 침묵임계 1.2~2.0s)
├─ ③ 입력 가드레일(한국어 위기분류, 화자=수련생 실제위기 vs 페르소나 연기 분기)
├─ ④ engine-pool(상주 claude -p) 추론 ← §1 엔진과 동일 풀 공유
├─ ⑤ 출력 가드레일
└─ ⑥ OpenAI gpt-4o-mini-tts(voice_id 추상화) → 오디오청크 WSS down
- Phase 1 트랙 C DoD화: "50분 WSS 양방향 스트림 끊김 실측"을 SSE 테스트와 함께. Cloudflare 터널이 WSS 바이너리를 못 받으면 → voice 전용 Tailscale Funnel 또는 cloudflared WS 지원 경로로 분리(전송 라우팅 표를 단일 계약으로 고정).
2.3 멀티보이스·페르소나 (요구7 완전충족)
- voice_id provider-agnostic 추상화:
voice_id → {provider, params}. OpenAI TTS 13보이스 +instructionsprosody 스티어링이 1차. 한국어 자연성 미달 보이스는 Higgs(127.0.0.1:9881)/MeloTTS 로컬 폴백(이미 vault 보유 자산). - 보이스=상태머신 함수: 매 턴
{voice, instructions, speed, stage, resistance, emotion}주입 → 단계별 음성 변조(라포기 닫힘 → 개입기 미세개방). 페르소나별 다른 목소리 = 요구7 "여러 목소리+페르소나" 충족. - 음성 paralinguistic 컬럼(F-21): 침묵길이/말속도/바지인을 수치 메타로 turn 로그 적재(§3 스키마 선반영).
2.4 s2s 결정권 복원 (F-08 해소)
- "s2s 탈락"(단독확정) → **"s2s 2차 PoC 옵션 유지"**로 표현 격상. 탈락 근거를 transcript 보존 단일 사유로 재정리(OpenAI
input_audio_transcription네이티브 존재 → "transcript 없음" 허수아비 폐기). - 윤찬 결정사항으로 명시 보고: "캐스케이드 1차 / s2s는 가상내담자 1캐릭터 몰입 2차 PoC". 람다 단독 탈락 확정 철회(월권 시정).
3. 데이터·스키마·학술 재설계 [F-03·F-04·F-05·F-06·F-21·F-22·F-23·F-24·F-25·F-26·F-31·F-35 해소]
3.1 마스킹 게이트 우회 차단 (F-03 — BLOCKER)
- 엔진 어댑터가 claude_cli 경로일 때도 프롬프트를 Presidio 선통과 후 stdin 주입. claude -p가 backend 미들웨어를 우회해 미성년 원문을 Anthropic에 직송하던 구멍 봉쇄.
- §1.1 문구 정정: "데이터는 로컬 미이탈" → "마스킹된(가명처리) 텍스트만 Anthropic 포함 외부로 전송". 공문/처리방침에 "가명처리본 해외(Anthropic) 전송" 명시. 민감구간은 Solar/HyperCLOVA 국내 라우팅 우선.
3.2 n=1 데이터 토대 정직화 + 수급을 블로킹 의존성 격상 (F-04 — BLOCKER)
- "골든셋" → **"시드 1례(seed exemplar), 신뢰도 측정 불가"**로 정직 표기. n=1 빈약함을 리스크 레지스터에 신규 등록(원본 누락).
- Phase 0 "골든셋 50발화"를 "한신대 추가 축어록 N건 수급"을 블로킹 의존성으로 격상 → §8 공문 액션에 추가(원본 누락 항목).
- train/test 누수 차단: 0615을 페르소나 시드(②용)와 평가 정답셋(③용)으로 분리. 같은 데이터 이중사용 금지(F-26 순환의존 동시 해소).
3.3 미성년·자살사례 재귀학습 동의 (F-05 — BLOCKER)
- 법정대리인 동의서에 별도 동의항목 분리: "AI 학습데이터 2차 가공 · DB 영구축적 · 파생모델 배포". 동의 전 0615
turns.text적재 금지를 Phase 0 hard gate로. - 자살사고 미성년 발화는 합성·환언된 CCD 스펙만 학습원천. 원문은 audit 보존용 격리(plain DB 미적재). → §3.3 "원본 미적재" 주장과 taxonomy §8 "원문 125턴 적재"의 자기모순 해소.
- "IRB 면제"는 수련생 실험 면제이지 미성년 사례데이터 활용 면제 아님 명문화.
3.4 평가 AI 타당도 선검증 (F-06 — BLOCKER, 오학습 순환 차단)
- 평가 AI 타당도를 수련생 노출 전 별도 검증셋(F-04 수급 전제)에서 LLM-judge κ 확보. 미달 차원은 학습자에 점수 비노출(코칭 텍스트만).
- 초기 deep-loop는 단정 채점 금지 → "관찰" 프레이밍("이 발화는 폐쇄형이었고, 개방형으로 바꾸면…"). 거짓양성률 정량 임계 설정 + 파일럿 1차 지표로 승격.
- 순환 차단 원리: 타당도 보증이 사용 시점보다 늦지 않게 — 검증 → 노출 순서 강제.
3.5 스키마 단일 SoT 통합 (F-21·F-31)
원본 §3.2 스키마에 음성·RAG 컬럼 누락 → 선반영:
-- turns 확장 (음성 메타, nullable 선반영 → Phase 2 재마이그레이션 폭탄 방지)
ALTER ... turns ADD audio_ref TEXT, silence_ms INT, speech_rate REAL, barge_in BOOL;
-- 또는 turn_paralinguistic(turn_id PK FK, ...) 1:1 확장
voice_persona_map(persona_id, voice_id, provider, params JSONB)
-- rag_chunks 하이브리드(BGE-M3 멀티벡터) 선반영
rag_chunks(id, source, index_kind, embedding vector(1024),
sparse_vec JSONB, context_prefix TEXT, colbert_vecs ... , text)
- 하이브리드 검색 SQL 계약 + 리랭커(BGE-reranker-v2-m3) 경계를 §3.6에 명시. graphify-lambda vs pgvector는 pgvector 1차 단일(graphify는 상담이론 교차개념 맵 2차).
3.6 학술 엄밀성 보강 (F-22·F-23·F-24·F-25·F-35)
- F-22 DSM-5:
ideation_stage 1~5 ↔ C-SSRS 정식축 매핑표+ P1~P3DSM-5 진단기준 ↔ 행동증거 매트릭스추가. "진단 비노출"과 "진단학적 엄밀"은 양립(내부 파라미터). - F-23 슈퍼바이저 편향: 1인·1회기 논평을 "모범 코퍼스" 일반화 철회 → few-shot/검증 참조로만. AI 피드백 앵커는 EPITOME/CTRS 루브릭. "(현장 특이)" 항목 학습신호 제외. 슈퍼바이저 다인 확보 전 1인 편향 가중치 다운.
- F-24 인용 검증: 신청서·공문 제출 전 모든 arXiv ID 실재 확인, preprint vs peer-reviewed 구분, 핵심 수치(d=0.72/ICC 0.853/77.2%) 원문 캡처. 미확인은 "preprint, 미검증" 라벨.
- F-25 재식별: 사례 메타 재식별 위험평가(motivated intruder test), 학년/나이 범주화, 호소문제 일반화. 학습원천=합성변형(F-05 연동).
- F-35 재귀학습 루프 닫기: "축적 ≠ 학습" → 명시 루프 정의:
골든셋 누적 → few-shot 풀 자동갱신 → 평가/페르소나 프롬프트 업데이트. fine-tuning 여부는 윤찬 1차 범위 결정(§잔여결정).
4. IRB 본문 전수 정리 [F-11 해소]
원본이 헤더만 패치하고 본문에 IRB 의존성 잔존. 전수 삭제/치환:
- Phase 0 작업 "IRB 프로토콜 초안" / 완료기준 "IRB 신청서 제출" → 삭제.
- Phase 3 의존성 "+IRB 승인" → 삭제. "20명 IRB 파일럿" → "20명 교육용 파일럿".
- §8 액션 #2 "IRB 프로토콜 제출 — 승인 리드타임이 Phase 3 게이트" → 삭제.
- §7 IRB 체크리스트 → 미성년 활용동의 + 개인정보 처리방침 + PIPC/생명윤리법 가명처리만 잔존, IRB 심의 항목 전부 제거.
- 단 §3.3/§9 안전 가드레일·minimal risk 설계는 윤리 설계로 유지(IRB 절차와 무관한 안전 사안).
5. 권한·보안 재설계 [F-19·F-20·F-28·F-30·F-37·F-38·F-40 해소]
5.1 visible_to[] vs RBAC×cohort 레이어 분리 통일 (F-30)
visible_to[](AI 정보비대칭)와 RBAC×cohort(인간 권한)는 다른 레이어로 명시 분리. 인간이 turn 읽을 때 두 게이트 AND를 단일 enforcement 미들웨어로 통일.- RLS "기본/2차" 모순 → RLS 기본강제로 확정(앱 게이트가 1차, RLS가 DB레벨 방어선). Phase 0 스키마에
cohort/account_linking/audit_log포함(원본 누락). - 요구8(3페이지: 관리자/학습자/교수자) 권한격리 강제 메커니즘 일관화.
5.2 SSE/WSS 무인증 노출 + 쿠키 붕괴 차단 (F-20 — IDOR 위험)
- SSE도 단일 도메인 + Cloudflare 단일 터널에서 먼저 실측(heartbeat +
no-transform+ flush -1). 끊길 때만 분리. - 분리 불가피 시 stream/voice 경로도 BFF 경유 + short-lived signed token(쿠키 아닌 header/query, 세션당 1회·단명).
__Host-쿠키가 다른 호스트에 미전송되는 구조적 붕괴 회피. - WSS(음성)·SSE(텍스트)를 같은 전송 추상화로 통합 검토(노출면 최소화).
reference_cloudflared_external_share멀티tailnet 함정 주의.
5.3 가용성 SPOF 해소 (F-19) — 요구3+요구4 양립
- (a) 엔진 PC ↔ NAS DB 다른 물리 장애도메인 분리.
- (b) 교수 테스트 예약 슬롯제 + 직전 헬스체크(PC alive · 상주풀 워밍 · 터널 up) 후 링크 발송.
- (c) watchdog(claude/cloudflared/docker 자동 재기동) + 외부 모니터 → 디코 알림.
reference_codex_node_memory_leak전례(좀비 node OOM) 대응 1GB+ 프로세스 reaping. - (d) claude -p 다운 시에만 Messages API 자동 폴백(=§1.2 모드 B, 가용성 안전망). PC 절전/윈도우업데이트 방지(
.ps1ASCII 함정 주의 —reference_ps1_ascii_only).
5.4 SSO 블로커 게이트화 (F-28)
- 공문 질의를 Phase 0 게이트 격상(IRB 면제로 SSO가 최장 리드타임 블로커). Google OIDC 단독 1차 진행 + Authlib provider 뒤 SAML SP 어댑터 스캐폴드 선반영.
- 용어 분리 명시: (사용자 로그인 OAuth 2.1) vs (엔진 Max OAuth 토큰) 혼용 금지.
5.5 잔여 보안 (F-37·F-38·F-40)
- F-37 키관리: secrets git-ignore만으론 불충분 → 키는 OS 키체인/secrets manager, 가명↔원본 매핑 테이블은 암호화 DB + 2인 승인. 운영계정류는 정해진 위치만(
feedback_obsidian_secrets_folder), 새 폴더 임의생성 금지. - F-38 위기분류 계약: 입력계약
{speaker, stage, text_masked, is_roleplay_context} → {risk_level, escalate}. "본인+1인칭 현재시제+시뮬레이션 메타밖" 결정론 룰 우선(페르소나 연기 false-positive 남발 차단). Phase 2 DoD에 false-positive 케이스. - F-40 스케일업: K8s 금지(20주 합리). "스케일업 = 클라우드 VM 이전 + compose replicas"로 윤찬 정의 합의. K8s 2차 백로그.
6. 오케스트레이션·일정 재설계 [F-16·F-17·F-18·F-27 해소] — 람다 실구현 작업분해 + 검증게이트
6.1 RACI — 소유주체 매핑 (F-16: "기존 풀스택팀 5글자" 해소)
원본은 트랙만 나누고 소유주체 0. 명시:
| 트랙 | 소유 | 람다 역할 | 디렉토리 경계 | 인터페이스 계약 동결 |
|---|---|---|---|---|
| A1 엔진풀(상주 claude -p) | spawn dev세션 #1 | 계약정의+E2E검증 | backend/engine/ |
LLMEngine 정규화 스키마(Phase 0말) |
| A2 상태머신·가드레일 | spawn dev세션 #2 | 계약정의+검증 | backend/sm/,backend/safety/ |
TurnLog/SessionState 스키마(Phase 0말) |
| B 프론트(React19·SSE·음성UI) | spawn dev세션 #3 | 검증 | apps/web/ |
SSE/WSS 이벤트 스키마(Phase 0말) |
| C 인프라(터널·Caddy·Docker·DB) | 람다 직접(인프라 영역) | 직접 | infra/,docker-compose.yml |
— |
| D 데이터(라벨링·검수·κ) | 크론+영속워크플로우 | 오케스트레이션 | ds/ |
annotation 스키마(Phase 0말) |
- 람다(메인)는 인프라·계약정의·팀간 중계·완료기준 검증에 집중(
feedback_team_lead_active_supervision). 비대 트랙 A를 A1/A2로 분할 → 람다 직접제작 회귀 차단. lambda-spawn-dev-session스킬로 PowerShell +claude --dangerously-skip-permissions+ windows-mcp 세션 부려 위임. 산발 task 금지, 본 문서가 단일 로드맵(feedback_proper_backlog_planning).
6.2 검증 프로토콜 — 모든 DoD에 "누가/어떻게" 명시 (F-17 — 완료보고 불신 원칙)
원본 DoD는 전부 결과서술("교수님이 상담→피드백 수신"). 검증 외주 금지(feedback_verify_actual_interaction). 각 DoD에 람다 직접 실동작 검증 부착:
| Phase | 결과 DoD | 람다 검증 프로토콜(신규) |
|---|---|---|
| P1 텍스트루프 | 상담→피드백 완주 | 람다가 Playwriter/windows-mcp로 실제 로그인 → P1 상담 완주 → 피드백 수신 재현, turn DB쿼리로 cost 적재 확인 |
| P1 저항엔진 | 공감↑/조언점프↓ | 공감 5턴 vs 조언 5턴 입력 → openness 곡선 DB쿼리 정량 대조 스크린샷 |
| P1 엔진풀 | 상주 claude -p 동작 | TTFT p50/p95 실측 로그 + 동시4회기 부하 RSS/OOM 0 캡처(§1.3 게이트) |
| P1 음성PoC | 음성 왕복 1턴 | 람다가 실제 마이크/오디오 왕복 1턴 + WSS 50분 끊김 실측 |
| P2 권한격리 | 타인기록 차단 | 타인 session_id 직접입력 → 403 스크린샷(IDOR 음성검증) |
| P2 안전 | 위기→교수알림 | 위기발화 주입 → 에스컬레이션+알림 end-to-end 재현 |
| 각 Phase말 | — | 통합게이트: 람다 E2E 1회 재현 후에만 윤찬 보고("완료" 보고 신뢰 금지) |
- subagent 물리적 불가 작업(50분 SSE/WSS, 실시간 음성 레이턴시, OAuth 콜백)은 백그라운드 Bash+Monitor / 실기기 / Playwriter로 배정(원본 미배정 해소).
6.3 장기·상태유지 작업 오케스트레이션 (F-18)
- 라벨링·검수·κ누적은 수일~수주 인간-루프 → DB/파일 영속 작업으로 재정의. 람다는 CronCreate + 단계 재개 워크플로우로 오케스트레이션.
ds스키마에 체크포인트 저장, 다음 세션 이어받기(stateless 한 호출로 끌고 가려던 설계 결함 해소).
6.4 일정 재분할 (F-27: 7주에 음성+3역할+페르소나+재귀 동시압축 해소)
- Phase 2 분할: 2a(3역할+OAuth BFF+페르소나, 9
13주) / 2b(음성 캐스케이드 1페르소나, 1317주). - 재귀학습 IAA·자살분류기 정밀화는 Phase 3 이연. 음성 M-단계(설계서 §8)와 Phase 주차를 단일 간트로 통합(음성 단독 20주를 7주에 욱여넣던 충돌 해소).
- "기존 풀스택팀(JS 추정)"의 FastAPI/asyncio/Presidio/pgvector/Deepgram WS 학습곡선을 일정에 반영(2b를 별도 트랙·여유 배치).
7. 결함ID → 해소방안 매핑 (전수 추적표)
| ID | 심각도 | 해소 위치 | 한 줄 해소 |
|---|---|---|---|
| F-01 | BLOCKER | §0·§1.2 | 기본엔진 claude -p 상주풀 복원, Messages API는 폴백 강등 |
| F-02 | BLOCKER | §2.1 | Phase 1 DoD에 음성 왕복 1턴 PoC 포함 |
| F-03 | BLOCKER | §3.1 | claude -p 경로도 Presidio 선통과 강제, 우회 봉쇄 |
| F-04 | BLOCKER | §3.2 | n=1 정직표기 + 축어록 수급 블로킹 의존성 격상 |
| F-05 | BLOCKER | §3.3 | 미성년 재귀학습 별도 동의항목 + 동의 전 적재 금지 hard gate |
| F-06 | BLOCKER | §3.4 | 평가 AI 타당도 수련생 노출 전 선검증, 미달 비노출 |
| F-07 | BLOCKER | §2.2 | voice.chanpaca.net WSS 경로 1급 추가 + 50분 실측 DoD |
| F-08 | MAJOR | §2.4 | s2s "탈락"→"2차 PoC 옵션", 결정권 윤찬 |
| F-09 | MAJOR | §3.4 | "판단 지속(deep-loop 백그라운드), 제시만 회기말" 분리 |
| F-10 | MAJOR | §0 | 자유연습 하드차단 제거 → 기본ON+권장배지+교수토글 |
| F-11 | MAJOR | §4 | IRB 본문 전수 삭제/치환 |
| F-12 | MAJOR | §1.4 | fast-loop 로컬 상주분류기 기본, 외부API 폴백 |
| F-13 | MAJOR | §1.1·§1.3 | --input-format stream-json 상주, TTFT/부하 실측 게이트 |
| F-14 | MAJOR | §1.2 | --max-turns/--append-system-prompt-file/--bare 깨진 플래그 교체 |
| F-15 | MAJOR | §1.5 | 정규화 이벤트/cost 규약 + contract test |
| F-16 | MAJOR | §6.1 | RACI 소유주체 매핑, 트랙 A 분할 |
| F-17 | MAJOR | §6.2 | 모든 DoD에 람다 직접 검증 프로토콜 |
| F-18 | MAJOR | §6.3 | 라벨링/검수 영속화 + 크론 재개 워크플로우 |
| F-19 | MAJOR | §5.3 | 장애도메인 분리·예약슬롯·watchdog·폴백 |
| F-20 | MAJOR | §5.2 | 단일터널 우선 실측, 분리 시 signed token, IDOR 차단 |
| F-21 | MAJOR | §3.5 | 음성 paralinguistic 컬럼 Phase 0 선반영 |
| F-22 | MAJOR | §3.6 | C-SSRS 매핑표 + DSM-5 행동증거 매트릭스 |
| F-23 | MAJOR | §3.6 | 슈퍼바이저 논평 few-shot 참조로 격하, 1인편향 다운 |
| F-24 | MAJOR | §3.6 | arXiv ID 실재확인+수치 원문캡처, 미확인 라벨 |
| F-25 | MAJOR | §3.6 | motivated intruder test + 범주화, 합성변형 학습 |
| F-26 | MAJOR | §3.2 | 0615 페르소나/평가 분리(누수차단), 재귀학습 톤다운 |
| F-27 | MAJOR | §6.4 | Phase 2 분할(2a/2b) + 단일간트, 재귀 Phase3 이연 |
| F-28 | MAJOR | §5.4 | 공문 Phase 0 게이트, SAML 스캐폴드 선반영 |
| F-29 | MAJOR | §1.3 | 폴백 회기당 비용 실측+캐싱+batch, cost 적재 |
| F-30 | MAJOR | §5.1 | visible_to/RBAC 레이어 분리 AND게이트, RLS 기본 확정 |
| F-31 | MAJOR | §3.5 | rag_chunks 하이브리드 멀티벡터 컬럼 선반영 |
| F-32~40 | MINOR | §3.6·§5.5 | κ/ICC 임계 통일, 환각측정 정의, 캐싱 히트검증, 키관리, 위기계약, 스케일업 정의 |
8. 즉시 착수 액션 Top 5 (원본 §8 교체)
- 엔진 PoC — 윤찬 PC에서 상주 claude -p 실증 (
--input-format stream-json상주 + 격리 cfg + TTFT p50/p95 실측 + 동시4회기 부하). "검증됨" 표기는 이 실증 후에만. [F-01·F-13·F-14] - 한신대 공문 질의서 — SSO 프로토콜/클레임 + 추가 축어록 N건 수급(블로킹) + 미성년 원본 활용동의(AI학습 2차가공·DB축적·파생배포 별도항목) + NAS 국내처리. (IRB 항목 삭제) [F-04·F-05·F-28]
- docker-compose 스캐폴드 + Postgres 스키마(음성·RAG·cohort·audit 선반영) + Caddyfile(WS upgrade·flush -1) — 인프라 베이스, 람다 직접. [F-21·F-30·F-31·F-07]
- 0615 taxonomy v1.0 + 페르소나/평가 데이터 분리(누수차단) — 시드 1례 정직표기, 골든셋 표본목표 명시. [F-04·F-23·F-26]
- 마스킹 게이트 강제 어댑터 PoC — Presidio 선통과 후에만 claude -p stdin 주입(우회 봉쇄) + P1 1턴 + cost 텔레메트리 + voice PoC 1턴. [F-03·F-02]
9. 잔여 — 윤찬 결정 필요 (CONDITIONAL 사유)
아래는 람다가 단독 결정하면 월권인 항목. 결정 후 GO 전환:
- s2s 2차 PoC 채택 여부 (캐스케이드 1차는 확정. 2차 옵션 유지/폐기) [F-08]
- fast-loop 외부 API 허용 여부 (로컬 상주 분류기 기본 vs 외부 Haiku/Solar 폴백 허용 — 데이터주권 트레이드오프) [F-12]
- 재귀학습 fine-tuning 범위 (1차=few-shot 자동갱신만 vs 파인튜닝 포함) [F-35]
- 자유연습 기본값 (기본 ON + 교수토글 제안 — 승인) [F-10]
- 추가 축어록 수급 규모/일정 (n=1 해소의 전제, 한신대 협의 결과 의존) [F-04]
- 스케일업 정의 ("클라우드 VM 이전 + compose replicas"로 합의 vs K8s 2차) [F-40]
이 문서는 패치다. 원본 마스터플랜과 9개 하위 설계서의 엔진·음성전송·스키마·권한 결정은 본 문서로 통일한다. 모든 엔진 플래그는 CLI v2.1.191 직접 실행으로 검증(추측 아님).