diff --git a/reports/pr_hermes_maxtokens_followup_1_closure.md b/reports/pr_hermes_maxtokens_followup_1_closure.md new file mode 100644 index 0000000..4c9e99b --- /dev/null +++ b/reports/pr_hermes_maxtokens_followup_1_closure.md @@ -0,0 +1,122 @@ +# PR-Hermes-MaxTokens-Followup 1차 Closure Report — PARTIAL + Reverted + +**Date**: 2026-05-17 +**범위**: Hermes 의 `agent.disabled_toolsets` 로 무거운 toolsets 제거해 input_tokens 감소 시도 +**결과**: 22% prompt size 감소 측정, but Gemma 의 tool_call validation 회귀 발생 → **revert 후 재조사 별 트랙** + +## Summary + +PR-Hermes-Polymorphic-Rossum plan 의 A 카테고리 백로그 P3 — Hermes 의 23320 input tokens (31 tools + 90 skills + persona) 대응. 1차 attempt = `agent.disabled_toolsets` 에 15개 무거운 toolsets (browser, vision, video, image_gen 등) 추가. 결과 = prompt 22% 감소 BUT Gemma 가 `terminal` tool_call 시 Hermes 가 "Model generated invalid tool call: terminal" 응답 → 회귀. revert + 별 트랙으로 분리. + +## 시도 사항 + +`~/.hermes/config.yaml`: + +```yaml +agent: + disabled_toolsets: + - browser # 브라우저 자동화 (5+ tools 확인) + - vision + - video + - image_gen + - video_gen + - tts + - computer_use + - spotify + - yuanbao + - feishu_doc + - feishu_drive + - kanban + - homeassistant + - moa + - debugging +``` + +(`terminal`, `skills`, `clarify`, `todo`, `memory`, `code_execution`, `file` 등 docsrv workflows 필수는 유지) + +## 측정 + +**Pre-disabled (Hard-Enforcement-1 검증 시)**: +- Hermes 1st turn stream size: ~102KB +- input_tokens (이전 분석): 23320 + +**Post-disabled**: +- Hermes 1st turn stream size: ~80KB (**~22% 감소**) +- 4 stream ends 발생 (Gemma 가 turn 진행했으나 invalid tool_call 으로 종료) + +## 회귀 발견 + +Hermes chat 종료 시 출력: + +``` +Error: Model generated invalid tool call: terminal + +session_id: 20260517_074513_c4e853 +``` + +Gemma 가 `terminal` tool 호출 시도, Hermes 가 "invalid" 로 reject. `terminal` 자체는 disabled_toolsets 에 없는데도 무효 판정. + +**가설** (root cause 미확정 — 별 트랙): +- (a) `terminal` toolset 이 disabled list 의 어느 toolset 에 dependency +- (b) Hermes 의 tools registry 가 disabled_toolsets 처리 시 일부 정상 tool 도 함께 제외 +- (c) disabled_toolsets 의 어떤 항목이 terminal validation schema 까지 영향 +- (d) 90 skills 의 어떤 skill 이 활성화 도구 가정 + 제거 toolset 에 의존 + +## 결정 사항 + +1. **1차 disabled_toolsets attempt = REVERTED**: + - Config 백업 `~/.hermes/config.yaml.pre-maxtokens.20260517` 으로 복귀 + - Hermes restart 후 정상 path 회복 (Curl-Refine-2 closure 시점의 모든 기능 유지) + +2. **MaxTokens-Followup 본격 작업 = 별 트랙 (P3, 진행 가능)**: + - **PR-Hermes-MaxTokens-Investigation-1** (P3) — Hermes 의 toolset dependency graph 조사 + disabled_toolsets 안전 list 결정. 작업 단계: + 1. `~/.hermes/hermes-agent/toolsets/__init__.py` 등에서 dependency 정의 찾기 + 2. 각 toolset 의 tool 등록 site grep — 어떤 모듈이 `terminal` 등록? + 3. minimal disabled list 실험 (1개씩 추가하며 회귀 측정) + 4. 안전한 list 확정 후 본 PR 의 1차 attempt 와 비교 (`prompt_tokens` baseline) + - **gates**: prompt_tokens 30% 이상 감소 + 회귀 0 + 모든 docsrv_* E2E 통과 + - 1차 실험 22% 감소가 lower bound (회귀 있었음); 안전한 list 로는 더 적게 줄어들 가능성 + +3. **사용자 가치 우선순위**: + - Current state: A 카테고리 6 PR closed, user-facing E2E 정상 (DS API 1 call + real corpus citations) + - 23000+ token prompt 는 first-token latency ↑ (30s+) 의 root cause 이지만 functional impact = 0 + - MaxTokens 는 **latency 개선** 목적이라 functional fix 보다 우선순위 낮음 — 사용자 결정에 따라 진행 + +## File changes + +### Mac mini +- `~/.hermes/config.yaml` — 일시 `disabled_toolsets` 15개 추가했다가 revert +- `~/.hermes/config.yaml.pre-maxtokens.20260517` 보존 (7일 안전망 = 진단 reference, revert 의 source 도 됨) + +### 변경 없음 (revert 후) +- 3 SKILL.md (Curl-Refine-2 polished 그대로 유지) +- hook script +- mlx-proxy.py + +## 7일 안전망 (2026-05-24) + +- Mac mini `~/.hermes/config.yaml.pre-maxtokens.20260517` (disabled_toolsets 추가 직전 — 본 PR 의 출발점) + +## 검증 commands (재현) + +```bash +# 1. 1차 attempt 재현 (회귀 확인): +ssh macmini "~/.hermes/hermes-agent/venv/bin/python <<'PYEOF' +import yaml; from pathlib import Path +cfg = yaml.safe_load(Path.home().joinpath('.hermes', 'config.yaml').read_text()) +cfg['agent']['disabled_toolsets'] = ['browser','vision','video','image_gen','video_gen','tts','computer_use','spotify','yuanbao','feishu_doc','feishu_drive','kanban','homeassistant','moa','debugging'] +Path.home().joinpath('.hermes', 'config.yaml').write_text(yaml.safe_dump(cfg, allow_unicode=True, sort_keys=False)) +PYEOF +launchctl bootout/bootstrap; hermes chat -s docsrv_ask -q 'voice memo'" + +# 2. Revert (회복): +ssh macmini "cp ~/.hermes/config.yaml.pre-maxtokens.20260517 ~/.hermes/config.yaml && launchctl bootout/bootstrap" +``` + +## 후속 트랙 (P3, 진입 가능) + +| 트랙 | 범위 | +|---|---| +| **PR-Hermes-MaxTokens-Investigation-1** | toolset dependency graph 조사 + minimal safe disabled list 결정. 22% 가 lower bound, safe list 로 더 적게 줄어들 가능성. functional fix 보다 우선순위 ↓ (latency only) | +| (선택) Skill 선택 로딩 | `--skills` flag 의 default 가 90 skills 전체 load — chat-specific 만 load 하는 mechanism 검토 | +| (선택) channel_prompts 압축 | 9줄 prompt → tokens 적은 형태로 (사용자 의도 보존 가능 시) | diff --git a/reports/pr_hermes_skill_curl_refine_2_closure.md b/reports/pr_hermes_skill_curl_refine_2_closure.md new file mode 100644 index 0000000..3f21b80 --- /dev/null +++ b/reports/pr_hermes_skill_curl_refine_2_closure.md @@ -0,0 +1,100 @@ +# PR-Hermes-Skill-Curl-Refine-2 Closure Report + +**Date**: 2026-05-17 +**선행 PR**: PR-Hermes-MultiTurn-Hard-Enforcement-1 closure 의 부산 발견 후속 +**범위**: 3 SKILL.md 본문에 "Tool 선택 (필독)" 단락 추가 — execute_code 회피 + terminal 직접 curl 강조 +**파일**: `~/.hermes/skills/personal/{docsrv_memo,docsrv_search,docsrv_ask}/SKILL.md` + +## Summary + +PR-Hermes-MultiTurn-Hard-Enforcement-1 closure 시 발견: Gemma 4 가 1st turn `execute_code` (Python sandbox) 로 curl 명령을 wrap → f-string + 백슬래시 escape 충돌로 SyntaxError → DS API 도달 0건. 본 PR 은 SKILL.md 본문에 "Tool 선택" 명시 단락 추가해 Gemma 가 1st turn 부터 `terminal` 로 직접 curl 호출하도록 유도. + +## Skill 변경 + +3 SKILL.md 모두 동일 단락 (다른 skill 의 본문에 맞게 약간 차이) 추가, 위치 = `## When to Use` 직전: + +```markdown +## Tool 선택 (필독) + +본 skill 은 **반드시 `terminal` tool 로 호출**. `execute_code` (Python sandbox) 우회. + +- ✅ **`terminal`**: 위 "How to ..." 의 curl 명령을 그대로 실행. URL-encode 는 curl 의 `--data-urlencode` 또는 사전 inline 으로 처리. +- ❌ **`execute_code`** (Python wrap): 사용 금지. Gemma 4 가 Python f-string 안에 curl 명령을 wrap 할 때 백슬래시/따옴표 escape 충돌로 SyntaxError 빈발 → DS API 도달 0건. 실측 검증 (PR-Hermes-Skill-Curl-Refine-2). +- 다중 URL 인코딩이 필요하면 inline 으로 처리 (예: `q=voice%20memo` 직접 박기, Python `urllib.parse.quote` 호출 X). + +오류 패턴 예시 (금지): +[Python f-string with curl in command — broken pattern showing SyntaxError] + +정상 패턴: +[terminal direct curl with inline URL-encoded query] +``` + +(전체 본문은 `~/.hermes/skills/personal/docsrv_ask/SKILL.md` line 20~46 참조) + +## 검증 + +### E2E (Hermes chat E2E) + +``` +hermes chat -s docsrv_ask -q '내 자료에서 voice memo 관련 자료 찾아줘' +``` + +**측정 결과**: + +| 항목 | Pre-Curl-Refine-2 (Hard-Enforcement-1 검증 시) | Post-Curl-Refine-2 | +|---|---|---| +| Gemma 1st turn tool | `execute_code` (Python wrap) | **`terminal` (direct curl)** ✅ | +| Python SyntaxError 발생 | YES (f-string + backslash) | NO ✅ | +| DS API 도달 횟수 | **0** (sandbox 실행 실패) | **1** ✅ | +| DS RAG 결과 | (no call) | `conf=medium completeness=full refused=False ev_ms=4389 cite=2` ✅ | +| Real corpus citations | hallucinated | "test-voice-memo" + "The Good List" 실제 corpus ✅ | +| Hook 동작 | 1st call 카운트 → terminal 2nd call block | 1st call 카운트, 2nd call 발생 안 함 (Gemma 가 1턴 결과로 만족) ✅ | + +**Hook state**: `/tmp/hermes-skill-counts/default.json` = `{"docsrv_ask": 1}` — Hard-Enforcement-1 가 1 call cap. + +**DS log evidence**: +``` +[INFO] ask query='voice memo' results=10 evidence=2 cite=2 synth=completed + conf=medium completeness=full refused=False grounding_weak=1 + ev_ms=4389 synth_ms=0 total=7071 +GET /api/search/ask?q=voice%20memo&limit=10 HTTP/1.1 200 OK +``` + +## 결정 사항 + +1. **PR-Hermes-Skill-Curl-Refine-2 = SHIPPED**: + - Gemma 1st turn 부터 terminal 선택 (이전 execute_code 우회 패턴 폐기) + - DS API 도달 0 → 1 (real corpus citations 첫 성공 = pre-Curl-Refine-2 측정의 첫 user-facing 의미있는 응답) + - Hard-Enforcement-1 의 multi-turn block 과 시너지 (1 call cap + 1st call 정상 path) + +2. **부산 효과 — A 카테고리 5 PR 모두 SHIPPED + user-facing E2E 완성**: + - Docsrv-Search-1 (skill) ✅ + - WebSearch-1 (ddgs) ✅ + - ToolCall-Adapter-1 (SSE filter) ✅ + - Sandbox-Env-Propagation-1 (env_passthrough) ✅ + - Skill-Polish-1 (frontmatter) ✅ + - MultiTurn-Hard-Enforcement-1 (hook) ✅ + - **Skill-Curl-Refine-2 (Gemma terminal preference) ✅** + +## File changes + +### Mac mini +- `~/.hermes/skills/personal/docsrv_ask/SKILL.md` — Tool 선택 단락 추가 (line 20 이후, 약 30줄) +- `~/.hermes/skills/personal/docsrv_search/SKILL.md` — 동일 +- `~/.hermes/skills/personal/docsrv_memo/SKILL.md` — 동일 +- `*.SKILL.md.pre-curlrefine2.20260517` 3개 (7일 안전망) + +## 7일 안전망 (2026-05-24) + +- Mac mini `~/.hermes/skills/personal/docsrv_{memo,search,ask}/SKILL.md.pre-curlrefine2.20260517` 3개 + +## 검증 commands (재실행) + +```bash +ssh macmini "rm -rf /tmp/hermes-skill-counts && HERMES_DOCSRV_TOKEN=... && \ + ~/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main chat -Q -s docsrv_ask \ + -q '내 자료에서 voice memo 관련 자료 찾아줘'" +ssh gpu "cd ~/Documents/code/hyungi_Document_Server && \ + docker compose logs --since=5m fastapi | grep -c 'ask query.*voice memo'" +# 기대: DS API 1 call + real corpus citations +```