# 9-Agent 회의: 백링크 분석 (Wiki vs My)

**일시**: 2026-02-19
**주제**: `wiki`와 `my` (Daily) 문서 분리로 인한 백링크 실패 가능성 조사
**참석자**: PM, 백엔드, 프론트엔드, 데이터, QA, UX, 보안, 법무, 기획

## 1. 배경 및 가설
**사용자 가설**: `wiki` (공개/공유) 문서와 `my` (비공개/데일리) 문서가 별개의 사일로(silo)로 취급되어, `wikiMap`이 두 가지를 모두 인덱싱하지 못하거나 `ReflectEditor`가 이들 간의 연결을 처리하지 못해 백링크가 연결되지 않는 것으로 보입니다.

**목표**:
1. `wikiMap`이 `wiki`와 `daily` 문서를 **모두** 포함하는지 확인합니다.
2. `[[link]]` 자동 완성 또는 조정 로직이 특정 유형을 필터링하는지 확인합니다.
3. "링크 깨짐(red link)" 문제가 이러한 데이터 분리 때문인지 규명합니다.

## 2. 에이전트 관점 (시뮬레이션)

### 🕵️‍♂️ 백엔드 에이전트 (데이터 페칭)
- **초점**: `useWikiMap.ts` 및 Firestore 쿼리
- **질문**: `getDocs`가 모든 문서를 가져오는가, 아니면 `where` 절로 유형을 필터링하는가?
- **조사**: `src/hooks/useWikiMap.ts` 확인

### 🎨 프론트엔드 에이전트 (에디터 로직)
- **초점**: `ReflectEditor.tsx` 및 링크 확장 기능
- **질문**: 사용자가 `[[`를 입력할 때 제안 목록에 두 유형이 모두 포함되는가? 에디터 로드 시 기존 링크 유효성을 어떻게 검사하는가?
- **조사**: 에디터에서 `wikiMap`이 어떻게 사용되는지 확인

### 📊 데이터 에이전트 (구조)
- **초점**: Firestore 데이터 모델
- **질문**: 두 문서가 같은 컬렉션(`documents`)에 있는가? `type` 필드로 구분되는가?
- **가설**: 같은 컬렉션에 있지만 클라이언트에서 필터링된다면 프론트엔드 문제이고, 서로 다른 컬렉션이라면 `useWikiMap`이 두 곳 모두 쿼리해야 합니다.

### 🧪 QA 에이전트 (테스트 시나리오)
- **시나리오 A**: `wiki` 문서 생성 -> `daily` 노트로 링크
- **시나리오 B**: `daily` 노트 생성 -> `wiki` 문서로 링크
- **현재 동작**: 링크가 빨간색(깨짐)으로 유지되는가?


## 3. 조사 일지

- [x] **1단계**: `useWikiMap.ts` 쿼리 로직 분석
    - **발견**: `collection(db, 'documents')`에 대해 `where('isDeleted', '==', false)` 조건만 사용하여 쿼리합니다.
    - **문제**: 이 쿼리는 다른 사용자의 비공개 문서를 포함한 **모든** 문서를 가져오려고 시도합니다.
- [x] **2단계**: `firestore.rules` 분석
    - **발견**: 규칙은 `isPublic()` 또는 `isAuthor()` (또는 특정 ID 패턴)인 경우에만 읽기를 허용합니다.
    - **결론**: `useWikiMap`의 포괄적인 쿼리는 보안 규칙과 일치하지 않아 실패(권한 거부)합니다. 사실상 "볼 수 없는" 데이터까지 요청하고 있기 때문입니다.
- [x] **3단계**: `ReflectEditor.tsx` 분석
    - **발견**: 로직은 정상적이나 `wikiMap`이 데이터로 채워져 있어야 작동합니다. 쿼리가 실패하면 맵이 비어 있게 됩니다.

## 4. 결론 및 조치 사항

**근본 원인**: `useWikiMap` 쿼리가 너무 광범위하여 보안 거부를 유발하고, 이로 인해 맵이 로드되지 않거나 불완전하게 로드됩니다. 데이터베이스를 하나의 공개 버킷으로 취급하고 있으나, 실제로는 분할된 보안 저장소입니다.

**"My vs Wiki" 분리 문제**:
- 사용자의 지적이 원칙적으로 맞습니다. "My" 문서(비공개/데일리)는 `isAuthor()` 규칙을 통해 접근 가능합니다.
- "Wiki" 문서(공개)는 `isPublic()` 규칙을 통해 접근 가능합니다.
- 보안 오류 없이 **둘 다** 효율적으로 가져오려면, 볼 수 있는 권한이 있는 것만 명시적으로 요청해야 합니다.

**조치 사항**:
- **[수정]** `useWikiMap.ts`를 **분할 쿼리 전략(Split Query Strategy)**으로 리팩토링:
    1.  **공개 쿼리(Public Query)**: `where('visibility', '==', 'public')`
    2.  **내 문서 쿼리(My Query)**: `where('authorId', '==', user.uid)`
    3.  **병합(Merge)**: 결과를 하나의 `wikiMap`으로 결합
- 이렇게 하면 모든 공개 위키 문서와 나의 데일리/비공개 문서가 백링크를 위해 올바르게 인덱싱됩니다.

