# task-502.1 보고서: GLM-5 컨텍스트 윈도우 초과 근본 대책

## SCQA

**S**: dev3-team의 GLM-5가 openclaw agent --agent main으로 task-501.1 실행 시 `model_context_window_exceeded` 에러로 2회 연속 실패했다. input/output 모두 0토큰으로 호출 자체가 불가했으며, 아누가 직접 수행하여 겨우 완료한 상태다.

**C**: 초기 진단에서는 "AGENTS.md(19,568자) + 도구 스키마(16,201자) = 39,967자가 컨텍스트 초과"로 보고되었으나, 실제 분석 결과 **bootstrap 파일은 컨텍스트의 8.5%에 불과**했다. 진짜 원인은 main 에이전트의 세션 파일(`fb705856...jsonl`)이 3.3MB(1,035줄, 1,124,156 chars, ~375,000-465,000 토큰)로 누적되어 GLM-5 API 한계(202,752 토큰)의 약 2배를 초과한 것이었다. 마지막 compaction이 9일 전(3월 3일)이었고, compaction이 실행될 기회 없이 API가 즉시 거부했다.

**Q**: GLM-5가 세션 누적 없이 안정적으로 작업을 수행할 수 있도록 근본 대책을 적용할 수 있는가?

**A**: GLM-WORKFLOW.md를 v3으로 업데이트하여 `--session-id {task_id}`를 추가, 각 task가 독립 세션에서 실행되도록 변경했다. 비대 세션(8.2MB)을 백업 후 삭제했으며, 적용 후 GLM-5 테스트에서 input=17,466 토큰(한계의 8.6%), 33초에 정상 완료를 확인했다.

---

## Phase 1: 현황 분석

### bootstrap 메커니즘 분석

- openclaw CLI에 `--skip-bootstrap` 플래그 없음. `openclaw.json`의 `agents.defaults.skipBootstrap: true`로만 비활성화 가능.
- 추가 설정 옵션: `bootstrapMaxChars` (기본 20,000/파일), `bootstrapTotalMaxChars` (기본 150,000/전체)
- bootstrap 주입 파일 목록 (main workspace `/home/jay/.openclaw/workspace/`):

| 파일 | rawChars | injectedChars | truncated |
|------|----------|---------------|-----------|
| AGENTS.md | 19,568 | 19,568 | No |
| SOUL.md | 2,045 | 2,045 | No |
| TOOLS.md | 850 | 850 | No |
| IDENTITY.md | 145 | 145 | No |
| USER.md | 322 | 322 | No |
| HEARTBEAT.md | 168 | 168 | No |
| BOOTSTRAP.md | 1,449 | 1,449 | No |
| MEMORY.md | 1,637 | 1,637 | No |
| **합계** | **26,184** | **26,184** | |

- 시스템 프롬프트 전체: 39,967 chars (bootstrap 26,768 + non-project 13,199)
- 도구 스키마: ~13,199 chars (non-project context)

### GLM-5 컨텍스트 윈도우

- openclaw.json 설정값: 204,800 tokens
- 실제 API 한계 (에러 로그 확인): 202,752 tokens (설정보다 2,048 낮음)
- 시스템 프롬프트 + 도구 스키마: ~17,466 tokens (한계의 8.6%) → **초과 원인 아님**

### 진짜 원인: 세션 대화 누적

- 세션 파일: `/home/jay/.openclaw/agents/main/sessions/fb705856-c69c-45f2-85b3-fff48ded759d.jsonl`
- 파일 크기: 3.3MB (3,200,000+ bytes)
- 총 줄 수: 1,035줄
- 마지막 compaction: 2026-03-03T07:59:40 (9일 전)
- compaction 이후 누적: 378개 메시지, 1,124,156 chars
- 추정 토큰: ~375,000-465,000 tokens → API 한계의 약 2배
- compaction 모드 `safeguard`는 API 호출 전 사전 체크를 하지 않아, 이미 초과된 상태에서 compaction 기회 없이 즉시 실패

---

## Phase 2: 대책 수립 및 적용

### 선택한 대책

**방안 조합: 세션 독립화(주) + 비대 세션 정리(부)**

기존 task 문서에서 제안된 4가지 방안(A~D) 검토 결과:

- **방안 A (skipBootstrap)**: 불필요. bootstrap은 8.6%만 차지하며 원인이 아님.
- **방안 B (AGENTS.md 경량화)**: 효과 미미. 19,568자 → 10,000자로 줄여도 ~2,000 토큰 절약에 불과.
- **방안 C (메시지 최소화)**: 이미 v2에서 적용됨. 추가 효과 없음.
- **방안 D (도구 스키마 축소)**: 13,199자는 문제 수준이 아님.

**실제 적용한 대책:**

1. **GLM-WORKFLOW.md v3 업데이트**: `--session-id {task_id}` 추가
   - 각 task가 독립 세션에서 실행 → 과거 대화 누적 원천 방지
   - 기존 `--agent main` 유지 (모델/워크스페이스 변경 없음)

2. **비대 세션 정리**:
   - 삭제 대상: 2개 세션 (5.0MB + 3.2MB = 8.2MB)
   - 백업 경로: `/home/jay/workspace/teams/dev1/backups/`
   - 정리 후 세션 디렉토리: 13MB → 3.9MB (70% 감소)

3. **세션 관리 가이드 추가**: 워크플로우 하단에 세션 관리 정책 문서화

---

## Phase 3: 검증

### GLM-5 실제 호출 테스트

```
openclaw agent --agent main --session-id test-502-verify -m "echo hello > /tmp/glm5-test-502.txt && echo 'GLM-5 verification successful' > /tmp/glm5-verify.txt && echo done" --json
```

결과:
- **상태**: ok (completed)
- **모델**: zai/glm-5
- **input**: 17,466 tokens (한계 202,752의 8.6%)
- **output**: 297 tokens
- **소요시간**: 33,235ms
- **파일 생성**: `/tmp/glm5-test-502.txt` (hello), `/tmp/glm5-verify.txt` (GLM-5 verification successful)

### Before/After 비교

| 지표 | Before (task-501.1) | After (task-502.1 검증) |
|------|---------------------|-------------------------|
| 상태 | model_context_window_exceeded | ok (completed) |
| input tokens | 0 (호출 불가) | 17,466 |
| output tokens | 0 | 297 |
| 소요시간 | 2,800ms (즉시 실패) | 33,235ms (정상 완료) |
| 파일 생성 | 실패 | 성공 |

---

## 발견된 이슈 (3건)

1. **openclaw.json contextWindow 설정 불일치**: 설정값 204,800 vs 실제 API 한계 202,752 (2,048 토큰 차이). openclaw의 사전 토큰 체크가 정확하지 않을 수 있음. 권장: `contextWindow`를 202,752로 수정.

2. **BOOTSTRAP.md 미삭제**: `/home/jay/.openclaw/workspace/BOOTSTRAP.md` (1,449 chars)는 초기 설정 후 삭제해야 하는 파일이지만 아직 존재. 삭제 시 ~362 토큰 절약 가능.

3. **safeguard compaction 한계**: compaction 모드가 `safeguard`이지만, 세션이 이미 한계를 초과하면 compaction이 실행될 기회 없이 API가 즉시 거부함. openclaw에 "사전 토큰 체크 → 자동 compaction" 로직이 필요하나 이는 openclaw 자체의 기능 개선 사항.

---

## 생성/수정 파일

| 파일 | 작업 |
|------|------|
| `/home/jay/workspace/teams/dev3/GLM-WORKFLOW.md` | 수정 (v2 → v3, --session-id 추가, 세션 관리 섹션 추가) |
| `/home/jay/workspace/teams/dev1/backups/8d51d9cc-*.jsonl` | 생성 (세션 백업, 5.0MB) |
| `/home/jay/workspace/teams/dev1/backups/fb705856-*.jsonl` | 생성 (세션 백업, 3.2MB) |
| `/home/jay/workspace/memory/reports/task-502.1.md` | 생성 (본 보고서) |

---

## QC 자동 검증

```json
{
  "task_id": "task-502.1",
  "verified_at": "2026-03-12T18:32:38",
  "overall": "PASS",
  "checks": {
    "file_check": "PASS",
    "data_integrity": "PASS",
    "api_health": "SKIP (--skip flag)",
    "test_runner": "SKIP (No test directory)",
    "tdd_check": "SKIP (설정/문서 작업, 코딩 없음)",
    "schema_contract": "SKIP",
    "pyright_check": "SKIP (Python 코드 변경 없음)",
    "style_check": "SKIP",
    "scope_check": "SKIP"
  },
  "summary": "2 PASS, 7 SKIP"
}
```
