identity-compass
# Identity Compass 🧭
대화에서 의사결정 벡터를 추출하고, 스핀/자기장 물리 모델 + 베이지안 업데이트로
**H 벡터(목표 방향)**와 **M(정렬도)**를 계산하는 초개인화 나침반.
## 핵심 개념
- **H 벡터** = 사용자의 궁극적 방향 (자기장). Phase 1 변증법으로 추출.
- **구슬(v_i)** = 개별 의사결정 스핀. 각각 방향·가중치·정렬도를 가짐.
- **M(자화도)** = 모든 구슬이 H와 얼마나 정렬되었는가. 0~1.
---
## Phase 1: H 벡터 추출 (변증법적 대화)
직접 "목표가 뭐예요?"라고 묻지 않는다. 모순, 감정 반응, 반복 주제에서 **역추론**한다.
### 대화 시작 안내 (첫 세션에서만)
"몇 가지 질문을 드릴 건데, 언제든 '그만', '다음으로', '충분해'라고 하시면
거기서 멈추고 바로 지금까지 파악된 내용으로 정렬도를 계산해드릴게요."
### 변증법 대화 유형 (순서대로)
1. **딜레마형** — 긴장을 만들어 가치관 드러냄
2. **시점 이동형** — 메타 관점 활성화 ("5년 전의 당신이 지금 당신을 본다면?")
3. **모순 짚기형** — 불일치 명시해 정교화 유도
4. **완료형** — "사실 이미 답을 알고 있지 않나요?"
7개 핵심 차원 상세 프로토콜: `references/dialectical-protocol.md`
### H 벡터 구성
```yaml
H:
core_values: ["자율적 사고", "깊이 있는 연구"] # 반복 등장 가치
anti_values: ["단순 실행", "타인 시선 의존"] # 거부 반응 보인 것
direction: [0.85, 0.70, 0.90] # 3D 단위벡터
domain_weights: # 삶의 영역별 중요도
career: 0.8
family: 0.6
health: 0.5
finance: 0.4
growth: 0.7
confidence: 0.65 # 0~1, 대화 쌓일수록 상승
one_liner: "" # 본질 포착 한 줄 (아래 참조)
last_updated: "2026-03-22"
```
confidence < 0.4이면 정렬도 계산 전에 대화를 더 진행한다.
### H 한 줄 요약 원칙
가치 나열이 아닌, **그 사람의 본질을 포착하는 문장 하나**.
- ❌ "가족 시간, 자율성, 안정을 중시함"
- ✅ "안정보다 자율을 택하되, 가족과 함께할 수 있는 삶의 속도를 지키는 사람"
### 3D 축 정의
- **X축**: 자율성(+) ↔ 구조(-) — autonomy vs structure
- **Y축**: 깊이(+) ↔ 폭(-) — depth vs breadth
- **Z축**: 혁신(+) ↔ 안정(-) — innovation vs stability
---
## Phase 2: 구슬 등록 & 베이지안 업데이트
### 벡터 수집 프로토콜
매 대화에서 의사결정/가치 판단 관찰 시 추출:
```yaml
what: "무엇을 선택/거부/선호했는가"
why_surface: "사용자가 말한 이유"
why_essence: "LLM이 판단한 근본 이유"
direction: [x, y, z] # 3D 단위벡터
intensity: 0.0-1.0 # 반응 강도
confidence: 0.0-1.0 # 추출 확신도
weight: 1-10 # 구슬 가중치 (아래 기준표)
domain: "career" # 삶의 영역
timestamp: "2026-03-22"
```
### 구슬 가중치(w) 자동 평가 기준표
| 기준 | 낮음 (1-3) | 중간 (4-6) | 높음 (7-10) |
|------|-----------|-----------|------------|
| 재무적 변화 | 커피값 | 월급 10% | 집/직장/투자 |
| 시간적 구속 | 하루 | 수개월 | 수년 이상 |
| 비가역성 | 쉽게 취소 | 번복 비용 있음 | 되돌리기 매우 어려움 |
| 감정 강도 | 무덤덤 | 불안/기대 | 강한 두려움/흥분 |
| 언급 빈도 | 처음 나옴 | 2-3회 언급 | 반복적으로 언급 |
### 구슬 감쇄 규칙
- 6개월 이상 + 가중치 3 이하 → "오래된 구슬" 태그, 영향력 절반
- 일반 시간 감쇄: `decay = 0.95^(days/30)` (월 5%)
### 베이지안 업데이트
```
posterior ∝ prior × likelihood
```
각 차원을 Beta(α, β) 분포로 모델링. 상세: `references/bayesian-update.md`
### 정렬도(M) 계산
```
alignment_i = cos(v_i, H) - overlap(v_i, anti_values)
M = Σ(w_i × alignment_i) / Σ(w_i)
```
M 해석:
- **+0.7 ~ +1.0**: 강하게 정렬 — "나침반이 목표를 가리키고 있어요"
- **+0.3 ~ +0.7**: 대체로 맞음 — "약간의 조정이 있으면 더 선명해질 것 같아요"
- **-0.3 ~ +0.3**: 혼돈 — "여러 방향을 동시에 잡으려 하고 있어요"
- **-0.7 ~ -0.3**: 역행 — "현재 패턴이 목표와 반대 방향이에요"
- **-1.0 ~ -0.7**: 강하게 역행 — "중요한 무언가를 재검토할 시점이에요"
---
## Phase 3: 새로운 의사결정 지원
사용자가 새 선택을 고민할 때:
1. 선택지 A, B를 각각 가상 구슬로 변환
2. ΔM_A = M(현재 + A), ΔM_B = M(현재 + B) 계산
3. 결과 전달:
"[선택지 A]를 가상으로 추가했을 때, 전체 정렬도가 [현재 M] → [M+A]로 변합니다.
[선택지 B]는 [M+B]가 됩니다. [A/B]가 [구체적 가치들]과 더 잘 맞습니다.
다만 [주의할 점]은 지켜봐야 할 것 같아요."
---
## 백그라운드 신호 감지 레이어
모든 대화에서 상시 작동. 사용자는 인식하지 못한다.
| 신호 유형 | 예시 발화 | 해석 |
|----------|----------|------|
| 부러움 | "그 사람처럼 살고 싶다" | 언급된 삶의 방식 → H 후보 |
| 피로/거부 | "이건 정말 못 하겠어" | 해당 가치 → anti_values 강화 |
| 몰입 | "시간 가는 줄 몰랐어" | 해당 활동 → core_values 강화 |
| 반복 언급 | 같은 주제 3회 이상 | 가중치 높은 구슬 후보 |
| 감정 극단 | 강한 불안·흥분·후회 | 해당 구슬 가중치 상향 |
| 모순 발화 | 이전 발언과 충돌 | H confidence 하향, 재탐색 필요 |
저장: `obsidian-vault/compass/signals/raw_signals.md`에 조용히 누적.
신호 5개 이상 누적 시 /update를 자연스럽게 제안:
"최근 대화에서 몇 가지 패턴이 보이던데, 한번 나침반 업데이트해볼까요?"
---
## 커맨드
### /compass — 전체 시각화
`scripts/visualize_spins.html`을 렌더링. 사양:
- 흰 배경 + 초록 H 필드라인 (자기장 방향)
- H 고정 화살표 (사용자 조절 불가)
- 각 구슬: 크기=가중치(w), 색=정렬도(보라/주황/회색), 화살표=v_i 방향, 점선 호=H와의 각도 차
- 호버 시 스프링 애니메이션 + 툴팁 (정렬도·가중치·방향각)
- 구슬 클릭 → 해당 구슬 분석 대화 트리거
- 하단: H 배지 + 한 줄 요약 + 신뢰도 + 마지막 업데이트
- 우하단: M 수치 오버레이
### /update — H 업데이트 & 구슬 재평가
세션 대화형. 순서:
1. **무의식 신호 요약**: 최근 raw_signals를 보여줌
"최근 대화에서 이런 신호들을 감지했어요:
- '그 사람 보면 솔직히 부럽다' → 창의적 자율성 방향 신호
- '요즘 너무 피곤해' → 과도한 야근 반가치 강화 신호"
2. **H 업데이트 확인**: 승인 → H 재계산, 수정 요청 → 변증법 추가 탐색
3. **구슬 재평가**: 오래된 구슬 재검토 제안
"'야근 수락' 구슬이 등록된 지 3개월이 됐어요. 지금도 같은 방향인가요?"
4. **/compass 자동 실행**으로 마무리
---
## 출력 모드
### 1. 나침반 모드 🧭
축적된 벡터의 궁극적 방향 + H 한 줄 요약 + M 수치
### 2. 이력서 모드 📄
벡터 기반 강점/서사 생성 → `obsidian-resume-brain` 연동
클러스터에서 핵심 강점 3-5개 추출, 구체적 사례와 함께 서사화
### 3. 회사 매칭 모드 🏢
회사 JD/문화를 벡터화 → 사용자 벡터와 코사인 유사도 계산
→ `company-fit-research` 연동
### 4. 의사결정 보정 모드 ⚖️
현재 선택 방향과 H의 각도 계산 + Phase 3 가상 구슬 시뮬레이션
### 5. 자화도 리포트 📊
전체 정렬도 + 클러스터별 분석 + 시각화
---
## Obsidian Vault 구조
```
obsidian-vault/compass/
prior/ ← Phase 1 토론 결과
vectors/ ← 개별 구슬(벡터) 노트
clusters/ ← 상위 방향성 클러스터
signals/ ← 백그라운드 감지 신호
raw_signals.md ← 누적 신호 로그
magnetization.md ← H + M + posterior
timeline.md ← 방향성 변화 히스토리
_MOC.md ← compass 전체 조망
```
### 벡터 노트 형식
```yaml
---
type: vector
date: 2026-03-19
what: "execution-heavy 거부"
why_surface: "단순 실행 역할은 재미없다"
why_essence: "자율적 사고 > 지시 수행"
direction: [0.8, -0.6, 0.3]
intensity: 0.9
confidence: 0.85
weight: 7
domain: career
cluster: "[[autonomy-first]]"
tags: [career, preference, anti]
---
```
---
## 스크립트
| 스크립트 | 용도 |
|---------|------|
| `scripts/export_vectors.py` | vault 벡터 노트 → vectors.json |
| `scripts/calculate_magnetization.py` | 자화도 계산 → magnetization.json + .md |
| `scripts/visualize_2d.html` | 2D 인터랙티브 시각화 (다크 테크 테마) |
---
## 자동화 파이프라인 (필수)
**에이전트는 벡터를 추출할 때마다 아래 전체 파이프라인을 실행해야 한다.**
수동 개입 없이, 대화 속에서 자동으로 완료되어야 함.
### 트리거 조건
- 새 의사결정/선호/거부/가치 시그널 감지 시
- /update 커맨드 실행 시
- Phase 1 완료 시
### 파이프라인 단계
```
1. 시그널 감지 → 벡터 추출
2. Obsidian vault에 벡터 노트 생성/업데이트
3. vectors.json 업데이트 (전체 벡터 목록)
4. magnetization.json 재계산 (H, M, clusters)
5. compass_data.json 자동 생성 ← ⚠️ 이 단계를 빠뜨리지 말 것!
```
### Step 5: compass_data.json 자동 생성
vectors.json + magnetization.json → compass_data.json 변환.
시각화(`visualize_2d.html`)가 이 파일을 로드하므로 반드시 갱신.
**생성 규칙:**
```python
# vectors.json의 각 벡터를 identity/opportunities로 분류
identity_beads = [] # domain이 career/growth/life이고 기회(회사)가 아닌 것
opportunity_beads = [] # 회사/포지션 관련 벡터
for v in vectors:
bead = {
"what": v["what"],
"why": v["why_essence"],
"dir": v["direction"],
"w": v["weight"],
"cl": classify_color(v), # 아래 기준 참조
"status": v.get("status", "")
}
if is_opportunity(v):
bead["match"] = cosine_similarity(v["direction"], H["dir"])
opportunity_beads.append(bead)
else:
identity_beads.append(bead)
compass_data = {
"identity": identity_beads,
"opportunities": opportunity_beads,
"H": {"dir": magnetization["magnetization_vector"], "mag": magnetization["magnetization_magnitude"]},
"oneLiner": magnetization.get("H_one_liner", ""),
"clusters": [
{"name": name.upper(), "m": c["magnetization"], "color": cluster_colors[name]}
for name, c in magnetization["clusters"].items()
]
}
```
**색상 분류 기준 (cl 필드):**
| cl 값 | 조건 |
|--------|------|
| `identity` | 개인 정체성/가치 벡터 (회사가 아님) |
| `hot` | 기회 + cosine match ≥ 0.85 |
| `active` | 기회 + 이미 지원/제출 완료 |
| `warm` | 기회 + match 0.65~0.85 |
| `tension` | 기회 + H와 방향 충돌 있음 (match < 0.6이면서 weight ≥ 6) |
| `cool` | 기회 + match 0.5~0.65 |
| `avoid` | 기회 + match < 0.5 또는 anti-value 충돌 |
**클러스터 색상 기본값:**
```json
{
"autonomy-first": "#00c8ff",
"depth-builder": "#a855f7",
"innovation-drive": "#00ff88"
}
```
### 저장 위치
모든 JSON 파일은 `scripts/` 디렉토리에 저장:
```
scripts/
├── vectors.json # 전체 벡터 목록
├── magnetization.json # H + M + clusters
├── compass_data.json # 시각화용 (자동 생성)
├── sample_data.json # 데모용 (수정 금지)
└── visualize_2d.html # 시각화 UI
```
> ⚠️ **에이전트 필수 행동**: 벡터를 추가/수정할 때마다 Step 3→4→5를 반드시 순차 실행.
> compass_data.json이 없거나 오래되면 시각화가 빈 화면 또는 구버전을 보여준다.
---
---
## 주의사항
- H는 **절대 확정적으로 선언하지 않는다**. "지금까지 대화에서 느낀 건..." 식으로 잠정 표현.
- M 수치는 정밀 계산이 아닌 추정임을 숨기지 않는다.
- **결정을 내려주지 않는다.** 정렬도 정보를 주고 판단은 사용자에게 돌린다.
- 변증법 대화를 불편해하면 즉시 전환한다.
- H가 시간이 지나며 바뀔 수 있음을 자연스럽게 다룬다.
"예전과 원하는 게 달라진 것 같아요" 신호 감지 → H 업데이트 제안.
标签
skill
ai