# task-2414 보고서 — 3문서 context-notes/checklist blank fix

**팀**: dev7-team (이참나)
**레벨**: Lv.2 (회장 직접 사용 = 즉시 fix)
**소요**: 약 14분 (진단 4분 + 위임/구현 6분 + L1 검증 4분)

---

## SCQA 요약

### Situation
- 회장님 명시 (2026-05-03): "3문서 - 3개 탭이 있는데, 실제로 내용은 plan만 보이고, context-notes, checklist는 blank임"
- task-2410 (`af9ddd9b` + `f46e6d07`)의 후속 — 3문서 조회 기능을 회장이 처음 사용 시 발견한 silent blank 결함

### Complication
- 백엔드(routes_get.py)의 3 doc 엔드포인트는 정상이라고 task-2410 보고서에 기록됨 (curl 200 응답 확인)
- 추측 금지 원칙: silent fix가 아닌 root cause 진단 필수

### Question
- 백엔드 결함인가, 프론트 결함인가? 어떤 시나리오가 회장 화면을 blank로 만드는가?

### Answer
- **Root cause = 프론트엔드 silent blank 패턴** + **단독 .md 파일 케이스(시스템 탭 131건) 미고려**
- ArchiveView.js의 `r.ok ? r.json() : null` 구조가 백엔드 404를 silent blank로 변환
- 시스템 탭의 131개 단독 .md 파일은 has_context_notes/has_checklist=false이므로 클릭 시 404 → silent blank
- Fix: r.json() 항상 호출 + status별 분기 메시지 + has_X=false 탭 disabled

---

## 진단 절차 (있는 그대로 체크)

### 1. 백엔드 직접 curl (HTTP 200 모두 정상)
```
curl http://localhost:8000/api/three-docs/task/task-2405/plan         → 200 + content
curl http://localhost:8000/api/three-docs/task/task-2405/context-notes → 200 + content
curl http://localhost:8000/api/three-docs/task/task-2405/checklist    → 200 + content
```
→ 백엔드 정상. 결함은 프론트 또는 특수 케이스.

### 2. Playwright 실 브라우저 (정상 task에서 3 탭 모두 정상)
- task-2417, task-2405에서 3 탭 모두 콘텐츠 표시 확인 (htmlLength 4000~5000)
- 회장이 본 buggy 케이스는 task가 아닌 다른 곳에 있다.

### 3. 코드 정밀 분석 (silent blank 패턴 발견)
ArchiveView.js line 97-99 (수정 전):
```js
fetch(...)
  .then(r => r.ok ? r.json() : null)                                       // ★ 404 → null
  .then(data => setDocContent(data?.content || (data?.error ? `*${data.error}*` : '')))
  // null이면 data?.content와 data?.error 모두 undefined → setDocContent('') → blank
```

### 4. 시스템 탭 카드 통계 측정
- Playwright 실측: **131개 단독 .md 파일**이 시스템 탭에 존재 (모두 has_plan=true, 나머지 false)
- 회장이 시스템 탭에서 첫 카드 클릭 → plan 정상 → context-notes 클릭 → 백엔드 404 → 프론트 silent blank

→ **회장이 본 정확한 시나리오 재현 완료**

---

## 변경 내역

### 수정 파일
1. `dashboard/components/ArchiveView.js` (+36 / -14 줄, 순증 +21)
   - **MT-1** (line 94-115): fetch 응답 처리 강화 — `r.json()` 항상 호출 + status별 분기
     - 404 → `*문서 없음 — 경로: {expected_path}*`
     - 400 → `*{error}*`
     - 그 외 실패 → `*불러오기 실패 (HTTP {status})*`
     - 빈 content → `*(문서가 비어 있습니다)*`
   - **MT-2** (line 336-358): has_X=false 탭 disabled
     - hasMap 매핑 + `disabled={!exists}` + opacity-50 + cursor-not-allowed + title="이 문서는 존재하지 않습니다"
   - **MT-3** (line 300-303): 카드 펼침 시 활성 탭 자동 결정
     - has_plan이면 'plan', 아니면 has_context_notes ? 'context-notes' : 'checklist'

2. `tests/dev7/test_three_docs_api.py` (+103줄)
   - **신규 4개 시나리오** (기존 11개 보존):
     - `test_404_response_includes_expected_path_for_missing_context_notes`
     - `test_404_response_includes_expected_path_for_missing_checklist`
     - `test_system_single_md_returns_404_for_non_plan_docs`
     - `test_400_response_has_error_key_for_invalid_doc_name`
   - 임시 디렉토리 + monkeypatch로 격리 검증 (실제 파일시스템 무영향)

### 신규 파일
3. `memory/plans/tasks/task-2414/plan.md` — status: in-progress
4. `memory/plans/tasks/task-2414/context-notes.md` — root cause + 3 Step Why A-B-C 일관성 검증 완료
5. `memory/plans/tasks/task-2414/checklist.md` — 진단/구현/테스트/L1 단계별 체크
6. `memory/screenshots/task-2414-system-disabled-tabs.png` — 단독 .md 파일 disabled 탭 스크린샷
7. `memory/screenshots/task-2414-task-all-tabs-ok.png` — 정상 task 3 탭 활성 스크린샷

### 변경 안 함 (의도적)
- `dashboard/routes_get.py` — 백엔드는 이미 정확. 수정 불필요.
- `dashboard/server.py`, `dashboard/data_loader.py` — task 명시 forbidden
- 다른 컴포넌트 파일 — task 명시 forbidden
- 기존 11개 pytest 시나리오 — 회귀 보호 위해 보존

---

## 검증 결과

### 빌드 검증
```
$ python3 -c "import dashboard.server"
import OK
```

### pytest (기존 + 신규 = 15/15 PASS)
```
tests/dev7/test_three_docs_api.py::test_list_system_returns_array PASSED
... (기존 11개 모두 PASS)
tests/dev7/test_three_docs_api.py::test_404_response_includes_expected_path_for_missing_context_notes PASSED
tests/dev7/test_three_docs_api.py::test_404_response_includes_expected_path_for_missing_checklist PASSED
tests/dev7/test_three_docs_api.py::test_system_single_md_returns_404_for_non_plan_docs PASSED
tests/dev7/test_three_docs_api.py::test_400_response_has_error_key_for_invalid_doc_name PASSED
========== 15 passed in 0.16s ==========
```

### L1 스모크테스트 (필수 기록)
- **서버 재시작**: 성공 (`systemctl --user restart dashboard.service` → active)
- **API 응답 확인**: HTTP 200 + 정상 content (재시작 후 즉시 검증)
- **스크린샷**:
  - `memory/screenshots/task-2414-system-disabled-tabs.png` — "신호등 체계 스펙" (단독 .md): plan 활성, context-notes/checklist disabled (회색, opacity-50, cursor-not-allowed)
  - `memory/screenshots/task-2414-task-all-tabs-ok.png` — task-2405: 3 탭 모두 활성, checklist 콘텐츠 정상 표시

### Playwright 측정값 (회장 시나리오 재현)
- **단독 .md 파일** ("신호등 체계 스펙"):
  - plan 탭: disabled=false, contentLength=12300
  - context-notes 탭: disabled=true, title="이 문서는 존재하지 않습니다"
  - checklist 탭: disabled=true, title="이 문서는 존재하지 않습니다"
- **task-2405** (정상 케이스, 회귀 검증):
  - 3 탭 모두 disabled=false
  - 콘텐츠 길이: plan 4449, context-notes 5476, checklist 4164 (모두 정상)

### 회귀 검증
- task-2410 plan 탭 정상 보존 ✅
- 기존 pytest 11/11 PASS 유지 ✅
- 다른 필터 (전체/보고서/리서치/미팅) 무영향 (코드 변경은 useEffect 내부 + 탭 렌더링만)

---

## 발견 이슈 및 해결

### 이슈 1: 회장 시나리오 즉시 재현 실패
- 첫 시도(task-2417, task-2405)에서 buggy 동작 재현 안 됨
- 해결: 코드 정밀 분석 → silent blank 패턴 식별 → 시스템 탭 단독 .md 파일 케이스 가설 → Playwright로 131건 측정 → 회장 시나리오 정확히 재현

### 이슈 2: pyright 경고 (false positive)
- `ArchiveView.js`: 'ArchiveView' declared but never read
- `test_three_docs_api.py`: Import "dashboard.routes_get" could not be resolved
- 판단: 모두 기존 패턴 (script 태그 글로벌 + sys.path.insert). 실제 동작/pytest 정상. 수정 불요.

---

## 모델 사용 기록
- 이참나(팀장, Opus): 진단 + 위임 + L1 검증 + 보고서
- 이쉬첼(프론트, Sonnet): MT-1/2/3 ArchiveView.js 구현 (~37k tokens)
- 카마소츠(테스터, Sonnet): pytest 4 시나리오 추가 (~78k tokens)
- 디자인 작업 없음 — 디자인팀 호출 불필요

---

## 머지 판단
- **머지 필요**: Yes
- **브랜치**: main 직접 (시스템 코드 + Lv.2)
- **워크트리 경로**: 사용 안 함 (project_id 없는 시스템 작업)
- **머지 의견**: 
  - 빌드 PASS + pytest 15/15 + L1 스크린샷 2장 모두 PASS
  - 회장 시나리오 정확히 재현 + fix 동작 시각적 확인
  - 회귀 0 (task-2410 plan 탭 정상)
  - 즉시 머지 가능

---

## 다음 단계 (회장 confirm 권장)
회장님께 보고:
- "task-2414 — 3문서 context-notes/checklist blank fix 완료"
- "Root cause: ArchiveView.js silent blank 패턴 + 단독 .md 파일 (시스템 탭 131건) 케이스"
- "확인 부탁: http://100.76.130.39:8000/dashboard/ → 기록 → 3문서 → 시스템 → 임의 카드 클릭 → context/checklist 탭이 disabled로 명확히 표시"
- "task → 임의 카드 → 3 탭 모두 정상 콘텐츠 표시"

## 참조
- 회장 명시 2026-05-03 "context-notes, checklist는 blank임"
- task-2410 commit: `af9ddd9b`, `f46e6d07`
- ArchiveView.js diff: dashboard/components/ArchiveView.js line 94-115, 300-303, 336-358
- pytest: tests/dev7/test_three_docs_api.py (15 PASS)
- 스크린샷: memory/screenshots/task-2414-*.png

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

