PRD.md §3.1 P0 "자율성 설정(L0~L2) | 전역 기본값 + 상대별 예외 설정" / §4 엣지케이스 대비 미구현 갭 해소. 관계별 페르소나(2.7-B)의 RelationshipTier 오버라이드 패턴을 그대로 미러링: - core-backend/models.go: Contact.AutonomyLevel *AutonomyLevel 추가(nil = 전역 기본값), validAutonomyLevel() 검증 헬퍼 추가(twin-settings PATCH의 인라인 검증도 이 헬퍼로 통일) - core-backend/autonomy_resolve.go: resolveAutonomyLevel() 신규 — 연락처 오버라이드 (1:1 전용) → 전역 TwinSettings 기본값 → L0 순으로 해석. L1/L2가 아니라 L0으로 폴백하는 이유는 이 코드베이스 전반의 안전 우선 기본값과 동일(불확실하면 항상 초안만 생성, 사람이 직접 발송). 그룹 대화는 RelationshipTier와 동일하게 항상 전역 기본값만 사용 — main.go의 그룹 대화 무조건 차단과 이중으로 안전 - core-backend/main.go: POST /conversations/:id/messages의 자율성 게이트가 TwinSettings 전역값만 읽던 걸 resolveAutonomyLevel() 호출로 교체. peer-veto→그룹 차단→도배 감지→에스컬레이션 순서와 각 하드게이트는 그대로 유지, "level" 계산 방식만 바뀜 - core-backend/a1_a2_routes.go: createContactRequest/updateContactRequest에 AutonomyLevel 필드 추가, contactJSON()에 포함, 생성/수정 핸들러가 RelationshipTier와 동일한 전체 교체(full-replace) 시맨틱으로 처리(PATCH에서 필드 생략 시 nil로 리셋) - core-backend/autonomy_resolve_test.go: 연락처 오버라이드 우선순위, 전역 기본값 폴백, 그룹 대화는 오버라이드 무시, 잘못된 값 검증 거부, PATCH 전체 교체 리셋 커버 - mobile: models.dart에 Contact.autonomyLevel(nullable) 추가, api_client.dart createContact/updateContact에 선택적 autonomyLevel 파라미터 스레딩, contacts_screen.dart에 _AutonomyLevelPicker(_RelationshipTierPicker와 동일 구조) 추가해 추가/수정 다이얼로그에 배치 + 연락처 목록 서브타이틀에 표시 ai-service는 변경 없음 — 자율성 레벨은 발송 게이트 로직일 뿐 초안 톤에 영향을 주지 않아 ai-service 프롬프트까지 전달될 필요가 없음. 테스트: go test ./... 61개 전부 PASS, flutter analyze/test 클린(기존 무관 info 린트 1건 제외). docs/roadmap.md §2.7-D, docs/deploy-checklist.md N4-C4a/b/c를 done으로 갱신하고 NOW/바로 다음 5개 요약도 동기화. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014YSB5PqF38raTxP5ABgr9m |
||
|---|---|---|
| ai-service | ||
| backend | ||
| core-backend | ||
| deploy | ||
| docs | ||
| mobile | ||
| poc/tone-corpus | ||
| scripts | ||
| secrets | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| README.md | ||
| docker-compose.yml | ||
README.md
hikikomori / 와카뷰 (가칭)
카카오톡 대안 메신저 — "나를 대신해 남과 대화하는 AI 와카뷰".
구조
| 경로 | 역할 |
|---|---|
docs/ |
기획·PRD·기술설계·로드맵·PoC 계획 |
core-backend/ |
Go 코어 (가입·메시지·WebSocket·자율성·안전장치) |
ai-service/ |
Python AI 내부 API (/draft, /escalate/check) |
backend/ |
초기 Python 프로토타입 (참고용) |
poc/tone-corpus/ |
PoC 실험 스크립트 |
mobile/ |
Flutter 클라이언트 (Android 우선) |
문서
- 기획:
docs/PLANNING.md· 결정:docs/decision-log.md(Q1~Q7 확정) - Vision / PRD / 기술설계:
docs/vision.md·docs/PRD.md·docs/tech-design.md - 로드맵 (작업 체크리스트):
docs/roadmap.md - 배포·잔여 실행 트랙:
docs/deploy-checklist.md(N1 스모크 → N2 Docker → … → N5 사람 PoC) - 베타 직전(C):
docs/invite-ops.md·docs/android-release.md·docs/prototype.md - PoC 계획/준비물:
docs/poc-plan.md·docs/poc-materials.md
AI 에이전트 규칙
AGENTS.md·CLAUDE.md- 브랜치: 작업·머지는 항상
main - 리모트: GitHub
origin+ Giteagitea(iykyka) —main갱신 후./scripts/push-both.sh
현재 단계
- Phase 1 A~C + N2 컷오버 + N3 안정화 완료 — 라이브:
https://msn.iykyka.com - 테스터 안내:
docs/tester-guide.md· 데모 코드DEMO-YKAVU - 다음 (선택): N4 FCM·Android QA
- 맨 마지막: N5 / D — 사람 PoC (
docs/roadmap.md§3). §3 기본값 추측 금지 - 프로토타입 공유 URL은
docs/prototype.md의SHARE_URL에 Master가 기입
로컬 실행 (요약)
# 터미널 1 — AI 서비스
cd ai-service && pip install -r requirements.txt
export GEMINI_API_KEY=... # or repo-root .env
uvicorn app.main:app --port 8001
# 터미널 2 — 코어 백엔드
cd core-backend
export ADMIN_API_TOKEN=dev-admin-token
go run . migrate && go run .
# 초대 코드 발급 예:
# curl -X POST http://localhost:8080/invites -H "Authorization: Bearer $ADMIN_API_TOKEN"
# 터미널 3 — Flutter (Android)
cd mobile && flutter run --dart-define=CORE_API_BASE=http://10.0.2.2:8080
Docker (N2-B / msn.iykyka.com)
- 구성:
docs/deploy-docker.md - Portainer·컷오버:
docs/deploy-portainer.md - 서버 기동:
./scripts/server-up.sh(호스트에서.env채운 뒤)
cp .env.example .env # ADMIN_API_TOKEN, POSTGRES_PASSWORD 필수
# 로컬: PUBLIC_API_BASE=http://localhost:8088
docker compose up -d --build
curl -sS http://localhost:8088/health
Postgres·AI는 내부망만. 엣지 프록시는 web:80(또는 WEB_HOST_PORT)만 공개.