vignette/docs/redteam/MASTERPLAN_REVISIONS.md

29 KiB
Raw Blame History

MASTERPLAN REVISIONS — BLUE TEAM 재설계 (윤찬 원래요구 100% 충족판)

작성 2026-06-25 · BLUE TEAM(재설계자) · 대상 결함: REDTEAM_FINDINGS.md F-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 (정액 모드 기본) --bareOAuth/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 경로와 claude_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보이스 + instructions prosody 스티어링이 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~P3 DSM-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 절전/윈도우업데이트 방지(.ps1 ASCII 함정 주의 — 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+페르소나, 913주) / 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 교체)

  1. 엔진 PoC — 윤찬 PC에서 상주 claude -p 실증 (--input-format stream-json 상주 + 격리 cfg + TTFT p50/p95 실측 + 동시4회기 부하). "검증됨" 표기는 이 실증 후에만. [F-01·F-13·F-14]
  2. 한신대 공문 질의서 — SSO 프로토콜/클레임 + 추가 축어록 N건 수급(블로킹) + 미성년 원본 활용동의(AI학습 2차가공·DB축적·파생배포 별도항목) + NAS 국내처리. (IRB 항목 삭제) [F-04·F-05·F-28]
  3. docker-compose 스캐폴드 + Postgres 스키마(음성·RAG·cohort·audit 선반영) + Caddyfile(WS upgrade·flush -1) — 인프라 베이스, 람다 직접. [F-21·F-30·F-31·F-07]
  4. 0615 taxonomy v1.0 + 페르소나/평가 데이터 분리(누수차단) — 시드 1례 정직표기, 골든셋 표본목표 명시. [F-04·F-23·F-26]
  5. 마스킹 게이트 강제 어댑터 PoC — Presidio 선통과 후에만 claude -p stdin 주입(우회 봉쇄) + P1 1턴 + cost 텔레메트리 + voice PoC 1턴. [F-03·F-02]

9. 잔여 — 윤찬 결정 필요 (CONDITIONAL 사유)

아래는 람다가 단독 결정하면 월권인 항목. 결정 후 GO 전환:

  1. s2s 2차 PoC 채택 여부 (캐스케이드 1차는 확정. 2차 옵션 유지/폐기) [F-08]
  2. fast-loop 외부 API 허용 여부 (로컬 상주 분류기 기본 vs 외부 Haiku/Solar 폴백 허용 — 데이터주권 트레이드오프) [F-12]
  3. 재귀학습 fine-tuning 범위 (1차=few-shot 자동갱신만 vs 파인튜닝 포함) [F-35]
  4. 자유연습 기본값 (기본 ON + 교수토글 제안 — 승인) [F-10]
  5. 추가 축어록 수급 규모/일정 (n=1 해소의 전제, 한신대 협의 결과 의존) [F-04]
  6. 스케일업 정의 ("클라우드 VM 이전 + compose replicas"로 합의 vs K8s 2차) [F-40]

이 문서는 패치다. 원본 마스터플랜과 9개 하위 설계서의 엔진·음성전송·스키마·권한 결정은 본 문서로 통일한다. 모든 엔진 플래그는 CLI v2.1.191 직접 실행으로 검증(추측 아님).