cluxion-Agentplugin-AutoClearMemory 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cluxion_agentplugin_autoclearmemory-0.2.0/.gitignore +10 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/Docs/README.md +52 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/Docs/agent-surfaces.md +46 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/Docs/architecture.md +53 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/Docs/design.md +73 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/Docs/installation.md +49 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/Docs/rust-architecture.md +34 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/PKG-INFO +145 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/README.md +117 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/adapters/claude/.claude-plugin/plugin.json +6 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/adapters/claude/skills/forgetforge/SKILL.md +41 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/adapters/codex/mcp-snippet.toml +9 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/adapters/cron/forgetforge-prune.cron +3 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/adapters/hermes/README.md +22 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/adapters/systemd/forgetforge-pruner.service +12 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/config.yaml.example +9 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/pyproject.toml +85 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/rust/forgetforge_engine/Cargo.lock +128 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/rust/forgetforge_engine/Cargo.toml +18 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/rust/forgetforge_engine/src/lib.rs +5 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/rust/forgetforge_engine/src/main.rs +48 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/rust/forgetforge_engine/src/scoring.rs +58 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/rust/forgetforge_engine/src/tier.rs +90 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/__init__.py +5 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/adapters/__init__.py +3 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/adapters/hermes.py +180 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/archive.py +47 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/cli.py +236 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/config.py +49 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/contradiction.py +78 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/db.py +321 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/hot_inject.py +31 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/import_brief.py +45 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/pruner.py +76 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/recall.py +131 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/rust_bridge.py +137 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/schemas.py +79 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/src/forgetforge/store.py +89 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_contradiction.py +22 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_db_recall.py +28 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_fts.py +12 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_hot_inject.py +27 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_import_brief.py +17 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_recall_stats.py +15 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_scoring.py +37 -0
- cluxion_agentplugin_autoclearmemory-0.2.0/tests/test_store.py +32 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# ForgetForge Documentation
|
|
2
|
+
|
|
3
|
+
## 처음 읽는 분
|
|
4
|
+
|
|
5
|
+
**ForgetForge**는 에이전트 세션의 메모리가 무한히 쌓이는 문제를 막는 **망각·기억 강화 플러그인**입니다.
|
|
6
|
+
|
|
7
|
+
| 질문 | 답 |
|
|
8
|
+
|------|-----|
|
|
9
|
+
| **무엇을 하나요?** | 기억을 tier(Hot/Warm/Cold)로 나누고, **실제로 회상한 횟수**로 강도를 계산해 오래된 기억을 archive합니다. |
|
|
10
|
+
| **누가 실행하나요?** | **연결된 AI**(Hermes·Claude·Codex·Grok의 모델)가 skill/도구 지시에 따라 `forgetforge_*` 도구나 CLI를 호출합니다. |
|
|
11
|
+
| **플러그인이 모델을 부르나요?** | **아니요.** 점수·tier·DB만 관리합니다. 요약·반영·세션 정리는 **연결된 AI**가 수행합니다. |
|
|
12
|
+
| **왜 Rust인가요?** | retention 계산·tier 판정 hot path를 Rust로 두고, Python은 DB·adapter·CLI만 담당합니다. |
|
|
13
|
+
|
|
14
|
+
### 연결된 AI 사용 흐름
|
|
15
|
+
|
|
16
|
+
1. 세션 시작 또는 맥락이 커질 때 → `forgetforge status`로 건강 상태 확인
|
|
17
|
+
2. 과거 사실이 필요할 때 → `forgetforge recall <topic>` (explicit layer)
|
|
18
|
+
3. 응답에 기억을 실제로 썼다면 → `forgetforge_recall` with `layer: implicit`
|
|
19
|
+
4. 세션 마무리 시 사용한 기억을 점검했다면 → `forgetforge_recall` with `layer: reflection`
|
|
20
|
+
5. 사용자 `#keep_forever` / `#forget_this` → `forgetforge keep` / `forgetforge forget`
|
|
21
|
+
6. preprocessing/supercoder brief → `forgetforge import-brief` (또는 Hermes `forgetforge_import_brief`)
|
|
22
|
+
7. store 시 `contradiction_warnings`가 있으면 사용자에게 reconcile 제안
|
|
23
|
+
|
|
24
|
+
**v0.2 추가:** FTS5 recall, brief handoff, hot inject hook, contradiction hints, Parquet cold archive.
|
|
25
|
+
|
|
26
|
+
Skill 지시문: [`adapters/claude/skills/forgetforge/SKILL.md`](../adapters/claude/skills/forgetforge/SKILL.md)
|
|
27
|
+
|
|
28
|
+
### 사람(개발자)이 할 일
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install cluxion-Agentplugin-AutoClearMemory
|
|
32
|
+
forgetforge init --agents=all
|
|
33
|
+
hermes plugins enable forgetforge # Hermes 예시
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 목차
|
|
37
|
+
|
|
38
|
+
| 문서 | 내용 |
|
|
39
|
+
|------|------|
|
|
40
|
+
| [architecture.md](architecture.md) | Recall-centric tiers, 데이터 흐름 |
|
|
41
|
+
| [design.md](design.md) | Retention 공식, retrieval layer, pruner |
|
|
42
|
+
| [installation.md](installation.md) | pip 설치, Rust 빌드, adapter |
|
|
43
|
+
| [agent-surfaces.md](agent-surfaces.md) | Hermes / Claude / Codex 연동 |
|
|
44
|
+
| [rust-architecture.md](rust-architecture.md) | Rust 메인 · Python bridge |
|
|
45
|
+
|
|
46
|
+
## 이 레포에서 다루지 않는 것
|
|
47
|
+
|
|
48
|
+
- API 키·OAuth (호스트 에이전트 소유)
|
|
49
|
+
- 플러그인 내부의 별도 LLM 호출
|
|
50
|
+
- 비공개 운영·배포 비밀
|
|
51
|
+
|
|
52
|
+
이슈는 GitHub Issues를 이용해 주세요.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Agent Surfaces
|
|
2
|
+
|
|
3
|
+
ForgetForge는 **하나의 pip 패키지**로 Hermes · Claude Code · Codex · Grok Build를 커버합니다.
|
|
4
|
+
에이전트별 차이는 adapter·skill뿐이고, **core(Rust + SQLite)는 공유**합니다.
|
|
5
|
+
|
|
6
|
+
**공통 원칙:** 연결된 AI가 skill/도구 지시에 따라 recall·status·keep·forget을 호출합니다. 플러그인은 LLM을 호출하지 않습니다.
|
|
7
|
+
|
|
8
|
+
## Hermes
|
|
9
|
+
|
|
10
|
+
- Entry: `[project.entry-points."hermes_agent.plugins"]`
|
|
11
|
+
- 활성화: `hermes plugins enable forgetforge`
|
|
12
|
+
- Tools: `forgetforge_store`, `forgetforge_recall`, `forgetforge_status`, `forgetforge_keep`, `forgetforge_forget`, `forgetforge_import_brief`, `forgetforge_hot_context`
|
|
13
|
+
- `forgetforge_recall`의 `layer`: `explicit` | `implicit` | `reflection`
|
|
14
|
+
- `pre_llm_call` hook: hot tier 자동 inject
|
|
15
|
+
|
|
16
|
+
## Claude Code
|
|
17
|
+
|
|
18
|
+
- Skill: `adapters/claude/skills/forgetforge/SKILL.md`
|
|
19
|
+
- 연결된 AI는 skill 규칙에 따라 CLI 또는 동일 semantics의 도구 호출
|
|
20
|
+
- 세션 마무리 reflection도 **Claude 모델**이 skill 지시에 따라 `layer: reflection` recall 기록
|
|
21
|
+
|
|
22
|
+
## Codex
|
|
23
|
+
|
|
24
|
+
- 가이드: `adapters/codex/mcp-snippet.toml`
|
|
25
|
+
- 연결된 AI는 터미널에서 `forgetforge` CLI를 호출 (recall/status/keep/forget)
|
|
26
|
+
- 규칙은 Claude skill과 동일
|
|
27
|
+
|
|
28
|
+
## Grok Build
|
|
29
|
+
|
|
30
|
+
- `forgetforge` CLI + 동일 recall 규칙
|
|
31
|
+
- 프로젝트 skill에 `adapters/claude/skills/forgetforge/SKILL.md` 내용을 참고해 연동
|
|
32
|
+
|
|
33
|
+
## 공통 명령
|
|
34
|
+
|
|
35
|
+
| Command | Description |
|
|
36
|
+
|---------|-------------|
|
|
37
|
+
| `forgetforge init --agents=all` | DB + config 생성 |
|
|
38
|
+
| `forgetforge recall <query>` | Explicit retrieval |
|
|
39
|
+
| `forgetforge keep <id>` | `#keep_forever` |
|
|
40
|
+
| `forgetforge forget <id>` | `#forget_this` |
|
|
41
|
+
| `forgetforge status` | Memory health |
|
|
42
|
+
| `forgetforge store <id> --content "..."` | Store/update memory |
|
|
43
|
+
| `forgetforge import-brief` | Brief handoff |
|
|
44
|
+
| `forgetforge hot-context` | Hot tier block |
|
|
45
|
+
| `forgetforge prune` | Pruner 1회 |
|
|
46
|
+
| `forgetforge pruner-daemon` | Background pruner |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## 목표
|
|
4
|
+
|
|
5
|
+
에이전트 **영구 메모리 bloat**를 **회상(Recall) 중심**으로 해결합니다.
|
|
6
|
+
저장 횟수가 아니라 **실제 회상 횟수**가 기억 강도를 결정합니다.
|
|
7
|
+
|
|
8
|
+
## 범용 에이전트 + Rust-First
|
|
9
|
+
|
|
10
|
+
| 계층 | 구현 |
|
|
11
|
+
|------|------|
|
|
12
|
+
| **Rust** (`forgetforge-engine`) | Retention scoring, tier decision |
|
|
13
|
+
| **Python** (`forgetforge`) | SQLite, recall tracker, pruner, CLI |
|
|
14
|
+
| **Agent adapter** | Hermes plugin, Claude skill, Codex CLI 가이드 |
|
|
15
|
+
|
|
16
|
+
## 데이터 흐름
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
graph TD
|
|
20
|
+
subgraph Host["연결된 AI (host model)"]
|
|
21
|
+
Skill[Skill / tool 지시 따름]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
subgraph Core["ForgetForge Core"]
|
|
25
|
+
DB[SQLite ~/.forgetforge/db.sqlite]
|
|
26
|
+
Engine[Rust Scoring Engine]
|
|
27
|
+
Tracker[Recall Tracker 3-layer]
|
|
28
|
+
Pruner[Background Pruner]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Skill -->|forgetforge_recall / CLI| Tracker
|
|
32
|
+
Tracker --> Engine
|
|
33
|
+
Engine --> DB
|
|
34
|
+
DB --> Pruner
|
|
35
|
+
DB -->|recall 결과 JSON| Skill
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
연결된 AI는 recall 결과를 읽고 **자신의 응답 맥락에 반영**합니다. 플러그인이 별도 completion을 생성하지 않습니다.
|
|
39
|
+
|
|
40
|
+
## Tiered Memory
|
|
41
|
+
|
|
42
|
+
| Tier | 조건 | 연결된 AI |
|
|
43
|
+
|------|------|-----------|
|
|
44
|
+
| **Hot** | 최근 7일 + N_r ≥ 1 | recall 결과 우선 반영 |
|
|
45
|
+
| **Warm-Episodic** | R ≥ 0.65 | 필요 시 recall |
|
|
46
|
+
| **Warm-Semantic** | R ≥ 0.80 | 장기 사실 유지 |
|
|
47
|
+
| **Warm-Procedural** | skill + N_r ≥ 3 | 절차·스킬 유지 |
|
|
48
|
+
| **Cold** | R < 0.40 or 180일 무회상 | archive, on-demand recall |
|
|
49
|
+
|
|
50
|
+
## Host 경계
|
|
51
|
+
|
|
52
|
+
- **Host**: 모델·OAuth·completion·최종 응답
|
|
53
|
+
- **ForgetForge**: 점수·tier·DB·archive·도구 JSON
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Design
|
|
2
|
+
|
|
3
|
+
## Retention formula
|
|
4
|
+
|
|
5
|
+
\[
|
|
6
|
+
R = e^{-t / S} \times \left(1 + 0.45 \cdot N_r + 0.30 \cdot I + 0.25 \cdot F \right)
|
|
7
|
+
\]
|
|
8
|
+
|
|
9
|
+
- \( t \): 마지막 회상 이후 경과일
|
|
10
|
+
- \( S = \ln(1 + N_r) \): Stability (회상 횟수 기반)
|
|
11
|
+
- \( N_r \): Retrieval count (Explicit + Implicit + Reflection)
|
|
12
|
+
- \( I \): Importance (0~1)
|
|
13
|
+
- \( F \): Frequency (secondary)
|
|
14
|
+
|
|
15
|
+
구현: `rust/forgetforge_engine/src/scoring.rs` (+ Python fallback in `rust_bridge.py`).
|
|
16
|
+
|
|
17
|
+
## Retrieval 3-layer (연결된 AI가 기록)
|
|
18
|
+
|
|
19
|
+
플러그인은 별도 LLM을 돌리지 않습니다. **연결된 AI**가 skill·도구 지시에 따라 `forgetforge_recall`을 호출할 때 `layer`로 구분합니다.
|
|
20
|
+
|
|
21
|
+
| Layer | 연결된 AI가 호출하는 시점 | Boost |
|
|
22
|
+
|-------|---------------------------|-------|
|
|
23
|
+
| `explicit` | `/recall`, 주제 검색, `forgetforge recall` | +0.45 |
|
|
24
|
+
| `implicit` | 응답에 해당 기억을 실제로 사용한 직후 | +0.35 |
|
|
25
|
+
| `reflection` | 세션 마무리 시 “이 기억을 썼는가?” 점검 후 | +0.25 |
|
|
26
|
+
|
|
27
|
+
모든 이벤트는 `retrieval_events` 테이블에 기록됩니다. recall 시 `importance`·`frequency`가 layer별로 소폭 증가합니다 (`db.bump_recall_stats`).
|
|
28
|
+
|
|
29
|
+
## FTS5 recall
|
|
30
|
+
|
|
31
|
+
- `memories_fts` (FTS5, porter tokenizer) — `search_memories`가 bm25 정렬
|
|
32
|
+
- FTS 실패·무결과 시 `LIKE` fallback
|
|
33
|
+
- upsert/forget 시 FTS 동기화
|
|
34
|
+
|
|
35
|
+
## Brief handoff
|
|
36
|
+
|
|
37
|
+
`import_brief` — preprocessing/supercoder brief를 episodic memory로 저장:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
forgetforge import-brief --source supercoder --brief "<json or text>"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Hermes: `forgetforge_import_brief`
|
|
44
|
+
|
|
45
|
+
## Contradiction hints
|
|
46
|
+
|
|
47
|
+
`store_memory`는 유사 토큰·부정 쌍(`always/never` 등)을 검사해 `contradiction_warnings`를 반환합니다. 연결된 AI가 사용자에게 reconcile을 제안합니다.
|
|
48
|
+
|
|
49
|
+
## Hot inject
|
|
50
|
+
|
|
51
|
+
- `hot_inject.build_hot_context` — hot tier 미리보기 블록
|
|
52
|
+
- Hermes `pre_llm_call` hook — hot 기억을 LLM 호출 전에 자동 주입
|
|
53
|
+
|
|
54
|
+
## Pruner (6시간 주기)
|
|
55
|
+
|
|
56
|
+
- Warm → Cold: \( R < 0.40 \)
|
|
57
|
+
- 180일 무회상 → `~/.forgetforge/archive/`에 parquet + jsonl + txt 저장 (`archive.write_cold_archive`)
|
|
58
|
+
- Cold → Warm: recall 발생 시 즉시 승격
|
|
59
|
+
|
|
60
|
+
주기 실행: `forgetforge prune` (cron/systemd 등).
|
|
61
|
+
|
|
62
|
+
## User safety tags
|
|
63
|
+
|
|
64
|
+
- `#keep_forever` → `forgetforge keep <id>`
|
|
65
|
+
- `#forget_this` → `forgetforge forget <id>`
|
|
66
|
+
|
|
67
|
+
## Package layout
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
src/forgetforge/ # db, recall, pruner, rust_bridge, cli
|
|
71
|
+
rust/forgetforge_engine/ # scoring + tier (Rust)
|
|
72
|
+
adapters/ # Hermes README, Claude skill, Codex snippet
|
|
73
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Installation
|
|
2
|
+
|
|
3
|
+
## pip (모든 에이전트)
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pip install cluxion-Agentplugin-AutoClearMemory
|
|
7
|
+
forgetforge init --agents=all
|
|
8
|
+
forgetforge check
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
데이터: `~/.forgetforge/` (`db.sqlite`, `config.yaml`, `archive/`).
|
|
12
|
+
|
|
13
|
+
## Rust engine (권장)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
cargo build --release --manifest-path rust/forgetforge_engine/Cargo.toml
|
|
17
|
+
export FORGETFORGE_ENGINE_BIN="$(pwd)/rust/forgetforge_engine/target/release/forgetforge-engine"
|
|
18
|
+
forgetforge check
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Rust가 없어도 **Python fallback**으로 scoring/tier가 동작합니다.
|
|
22
|
+
|
|
23
|
+
## Hermes
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
hermes plugins enable forgetforge
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
연결된 AI에게 `forgetforge_*` 도구 사용을 skill로 안내합니다.
|
|
30
|
+
|
|
31
|
+
## Claude Code
|
|
32
|
+
|
|
33
|
+
`adapters/claude/skills/forgetforge/`를 skills 경로에 추가하거나, `adapters/claude/.claude-plugin/` manifest를 사용합니다.
|
|
34
|
+
|
|
35
|
+
## Codex
|
|
36
|
+
|
|
37
|
+
`adapters/codex/mcp-snippet.toml`을 참고합니다. 연결된 AI는 `forgetforge` CLI를 터미널에서 호출합니다.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
forgetforge recall docker
|
|
41
|
+
forgetforge status
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Environment
|
|
45
|
+
|
|
46
|
+
| Variable | Purpose |
|
|
47
|
+
|----------|---------|
|
|
48
|
+
| `FORGETFORGE_HOME` | `~/.forgetforge` override |
|
|
49
|
+
| `FORGETFORGE_ENGINE_BIN` | `forgetforge-engine` 경로 |
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Rust Architecture
|
|
2
|
+
|
|
3
|
+
## 원칙
|
|
4
|
+
|
|
5
|
+
ForgetForge는 **Rust가 메인**, **Python은 연결층**입니다.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
연결된 AI (Hermes / Claude / Codex / Grok)
|
|
9
|
+
↓ skill / forgetforge_* tools / CLI
|
|
10
|
+
forgetforge (Python: DB, recall, pruner, CLI)
|
|
11
|
+
↓ subprocess JSON
|
|
12
|
+
forgetforge-engine (Rust: retention, tier)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
플러그인은 **연결된 AI에게 지시·도구·점수**를 제공합니다. 별도 LLM을 호출하지 않습니다.
|
|
16
|
+
|
|
17
|
+
## Rust: `forgetforge-engine`
|
|
18
|
+
|
|
19
|
+
| 명령 | 역할 |
|
|
20
|
+
|------|------|
|
|
21
|
+
| `score` | RetentionInput → retention, stability, boost |
|
|
22
|
+
| `tier` | TierInput → tier, action, retention |
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cargo build --release --manifest-path rust/forgetforge_engine/Cargo.toml
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Python 역할
|
|
29
|
+
|
|
30
|
+
- SQLite schema (`memories`, `retrieval_events`)
|
|
31
|
+
- recall layer 기록 (`explicit` / `implicit` / `reflection`)
|
|
32
|
+
- pruner orchestration
|
|
33
|
+
- Hermes `register()`, CLI
|
|
34
|
+
- Rust 미설치 시 동일 공식 Python fallback
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cluxion-Agentplugin-AutoClearMemory
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Universal agent memory plugin (ForgetForge): recall-centric retention, tiered forgetting, Rust scoring engine for Hermes, Claude Code, and Codex.
|
|
5
|
+
Project-URL: Homepage, https://github.com/cluxion/cluxion-Agentplugin-AutoClearMemory
|
|
6
|
+
Project-URL: Repository, https://github.com/cluxion/cluxion-Agentplugin-AutoClearMemory
|
|
7
|
+
Project-URL: Issues, https://github.com/cluxion/cluxion-Agentplugin-AutoClearMemory/issues
|
|
8
|
+
Author-email: cluxion <algocean1204@users.noreply.github.com>
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
Keywords: claude-code,cluxion,codex,forgetforge,hermes-agent,memory,plugin,recall
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Plugins
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Requires-Dist: pyarrow>=15.0
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
24
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
25
|
+
Requires-Dist: ruff>=0.8; extra == 'dev'
|
|
26
|
+
Requires-Dist: twine>=6.0; extra == 'dev'
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# cluxion-Agentplugin-AutoClearMemory (ForgetForge)
|
|
30
|
+
|
|
31
|
+
범용 에이전트 **망각·기억 강화 플러그인** — **Hermes, Claude Code, Codex, Grok Build**에서 동일 core로 동작합니다.
|
|
32
|
+
|
|
33
|
+
**Repository:** https://github.com/cluxion/cluxion-Agentplugin-AutoClearMemory
|
|
34
|
+
|
|
35
|
+
## 한 줄 요약
|
|
36
|
+
|
|
37
|
+
세션 메모리가 쌓일수록 컨텍스트가 비대해집니다. ForgetForge는 **회상(Recall) 횟수**로 기억 강도를 계산하고, 오래되거나 쓰이지 않은 기억을 자동으로 낮은 tier로 내립니다. **연결된 AI**가 skill·도구 지시에 따라 recall/status/keep/forget을 호출합니다.
|
|
38
|
+
|
|
39
|
+
## 범용 에이전트 + Rust-First
|
|
40
|
+
|
|
41
|
+
| 계층 | 구현 |
|
|
42
|
+
|------|------|
|
|
43
|
+
| **Rust** (`forgetforge-engine`) | Retention scoring, tier decision |
|
|
44
|
+
| **Python** (`forgetforge`) | SQLite, recall tracker, pruner, CLI |
|
|
45
|
+
| **Agent adapter** | Hermes plugin, Claude skill, Codex CLI 가이드 |
|
|
46
|
+
|
|
47
|
+
내부 로직은 **Rust 중심**. Python·Skill은 등록·DB·JSON bridge **thin wrapper**입니다.
|
|
48
|
+
Rust 바이너리가 없어도 **Python fallback**으로 동일 공식이 동작합니다.
|
|
49
|
+
|
|
50
|
+
## 이 플러그인의 역할
|
|
51
|
+
|
|
52
|
+
- **Recall이 reinforcement**: 저장 횟수가 아니라 실제 회상 \(N_r\)가 강도를 결정
|
|
53
|
+
- **Tiered Memory**: Hot / Warm-Episodic / Warm-Semantic / Warm-Procedural / Cold
|
|
54
|
+
- **Decay + Boost**: Ebbinghaus forgetting curve + spaced repetition
|
|
55
|
+
- **FTS5 recall**: SQLite full-text search + LIKE fallback
|
|
56
|
+
- **Brief handoff**: preprocessing/supercoder brief → episodic memory (`import-brief`)
|
|
57
|
+
- **Hot inject**: Hermes `pre_llm_call` hook으로 hot tier 자동 주입
|
|
58
|
+
- **Contradiction hints**: store 시 유사·부정 기억 경고
|
|
59
|
+
- **Parquet archive**: cold tier → `~/.forgetforge/archive/` (parquet + jsonl + txt)
|
|
60
|
+
- **Background pruner**: 6시간 주기 tier migration (`forgetforge prune`)
|
|
61
|
+
- **Safety**: `#keep_forever`, `#forget_this` 사용자 태그
|
|
62
|
+
|
|
63
|
+
ForgetForge는 **모델·OAuth를 소유하지 않습니다.** 연결된 AI가 도구 결과를 읽고 맥락에 반영합니다.
|
|
64
|
+
|
|
65
|
+
## 연결된 AI가 하는 일
|
|
66
|
+
|
|
67
|
+
| 상황 | 연결된 AI 동작 |
|
|
68
|
+
|------|----------------|
|
|
69
|
+
| 맥락이 커짐 | `forgetforge status` 또는 `forgetforge_status` |
|
|
70
|
+
| 과거 사실 필요 | `forgetforge recall <topic>` (explicit) |
|
|
71
|
+
| 응답에 기억 사용 | `forgetforge_recall` + `layer: implicit` |
|
|
72
|
+
| 세션 마무리 점검 | `forgetforge_recall` + `layer: reflection` |
|
|
73
|
+
| `#keep_forever` | `forgetforge keep <id>` |
|
|
74
|
+
| `#forget_this` | `forgetforge forget <id>` |
|
|
75
|
+
|
|
76
|
+
Hermes는 `forgetforge_*` 도구, Claude/Codex는 skill + CLI를 동일 규칙으로 따릅니다.
|
|
77
|
+
|
|
78
|
+
## Retention formula
|
|
79
|
+
|
|
80
|
+
\[
|
|
81
|
+
R = e^{-t / S} \times \left(1 + 0.45 \cdot N_r + 0.30 \cdot I + 0.25 \cdot F \right), \quad S = \ln(1 + N_r)
|
|
82
|
+
\]
|
|
83
|
+
|
|
84
|
+
## Tier 요약
|
|
85
|
+
|
|
86
|
+
| Tier | 조건 | 연결된 AI 동작 |
|
|
87
|
+
|------|------|----------------|
|
|
88
|
+
| **Hot** | 최근 7일 + \(N_r \geq 1\) | recall 결과를 맥락에 우선 반영 |
|
|
89
|
+
| **Warm-Episodic** | \(R \geq 0.65\) | 필요 시 recall |
|
|
90
|
+
| **Warm-Semantic** | \(R \geq 0.80\) | 장기 사실로 유지 |
|
|
91
|
+
| **Warm-Procedural** | skill + \(N_r \geq 3\) | 절차·스킬로 유지 |
|
|
92
|
+
| **Cold** | \(R < 0.40\) or 180일 무회상 | archive, 필요 시에만 recall |
|
|
93
|
+
|
|
94
|
+
## 빠른 시작
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
pip install cluxion-Agentplugin-AutoClearMemory
|
|
98
|
+
forgetforge init --agents=all
|
|
99
|
+
forgetforge check
|
|
100
|
+
hermes plugins enable forgetforge # Hermes
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Rust 가속 (선택)
|
|
105
|
+
cargo build --release --manifest-path rust/forgetforge_engine/Cargo.toml
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## 공통 명령
|
|
109
|
+
|
|
110
|
+
| Command | Description |
|
|
111
|
+
|---------|-------------|
|
|
112
|
+
| `forgetforge store <id> --content "..."` | Store or update memory |
|
|
113
|
+
| `forgetforge recall <topic>` | Explicit retrieval + tier boost |
|
|
114
|
+
| `forgetforge keep <id>` | `#keep_forever` |
|
|
115
|
+
| `forgetforge forget <id>` | `#forget_this` |
|
|
116
|
+
| `forgetforge status` | Memory health |
|
|
117
|
+
| `forgetforge prune` | Pruner 1회 실행 |
|
|
118
|
+
| `forgetforge pruner-daemon` | Background pruner (interval from config) |
|
|
119
|
+
| `forgetforge import-brief --source supercoder --brief "..."` | Brief → episodic memory |
|
|
120
|
+
| `forgetforge hot-context` | Hot tier context block (CLI) |
|
|
121
|
+
|
|
122
|
+
## Hermes 도구 (`forgetforge` toolset)
|
|
123
|
+
|
|
124
|
+
| Tool | Description |
|
|
125
|
+
|------|-------------|
|
|
126
|
+
| `forgetforge_store` | Save or update memory (contradiction warnings when similar) |
|
|
127
|
+
| `forgetforge_recall` | FTS search + retrieval event (`layer`: explicit / implicit / reflection) |
|
|
128
|
+
| `forgetforge_status` | Tier counts, engine status |
|
|
129
|
+
| `forgetforge_keep` | Pin memory forever |
|
|
130
|
+
| `forgetforge_forget` | Mark for forgetting |
|
|
131
|
+
| `forgetforge_import_brief` | Import preprocessing/supercoder brief |
|
|
132
|
+
| `forgetforge_hot_context` | Hot tier block (also via `pre_llm_call` hook) |
|
|
133
|
+
|
|
134
|
+
## 문서
|
|
135
|
+
|
|
136
|
+
- [Docs/README.md](Docs/README.md) — **처음 읽는 분** + 목차
|
|
137
|
+
- [Docs/architecture.md](Docs/architecture.md)
|
|
138
|
+
- [Docs/design.md](Docs/design.md)
|
|
139
|
+
- [Docs/installation.md](Docs/installation.md)
|
|
140
|
+
- [Docs/agent-surfaces.md](Docs/agent-surfaces.md)
|
|
141
|
+
- [Docs/rust-architecture.md](Docs/rust-architecture.md)
|
|
142
|
+
|
|
143
|
+
## License
|
|
144
|
+
|
|
145
|
+
Apache-2.0
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# cluxion-Agentplugin-AutoClearMemory (ForgetForge)
|
|
2
|
+
|
|
3
|
+
범용 에이전트 **망각·기억 강화 플러그인** — **Hermes, Claude Code, Codex, Grok Build**에서 동일 core로 동작합니다.
|
|
4
|
+
|
|
5
|
+
**Repository:** https://github.com/cluxion/cluxion-Agentplugin-AutoClearMemory
|
|
6
|
+
|
|
7
|
+
## 한 줄 요약
|
|
8
|
+
|
|
9
|
+
세션 메모리가 쌓일수록 컨텍스트가 비대해집니다. ForgetForge는 **회상(Recall) 횟수**로 기억 강도를 계산하고, 오래되거나 쓰이지 않은 기억을 자동으로 낮은 tier로 내립니다. **연결된 AI**가 skill·도구 지시에 따라 recall/status/keep/forget을 호출합니다.
|
|
10
|
+
|
|
11
|
+
## 범용 에이전트 + Rust-First
|
|
12
|
+
|
|
13
|
+
| 계층 | 구현 |
|
|
14
|
+
|------|------|
|
|
15
|
+
| **Rust** (`forgetforge-engine`) | Retention scoring, tier decision |
|
|
16
|
+
| **Python** (`forgetforge`) | SQLite, recall tracker, pruner, CLI |
|
|
17
|
+
| **Agent adapter** | Hermes plugin, Claude skill, Codex CLI 가이드 |
|
|
18
|
+
|
|
19
|
+
내부 로직은 **Rust 중심**. Python·Skill은 등록·DB·JSON bridge **thin wrapper**입니다.
|
|
20
|
+
Rust 바이너리가 없어도 **Python fallback**으로 동일 공식이 동작합니다.
|
|
21
|
+
|
|
22
|
+
## 이 플러그인의 역할
|
|
23
|
+
|
|
24
|
+
- **Recall이 reinforcement**: 저장 횟수가 아니라 실제 회상 \(N_r\)가 강도를 결정
|
|
25
|
+
- **Tiered Memory**: Hot / Warm-Episodic / Warm-Semantic / Warm-Procedural / Cold
|
|
26
|
+
- **Decay + Boost**: Ebbinghaus forgetting curve + spaced repetition
|
|
27
|
+
- **FTS5 recall**: SQLite full-text search + LIKE fallback
|
|
28
|
+
- **Brief handoff**: preprocessing/supercoder brief → episodic memory (`import-brief`)
|
|
29
|
+
- **Hot inject**: Hermes `pre_llm_call` hook으로 hot tier 자동 주입
|
|
30
|
+
- **Contradiction hints**: store 시 유사·부정 기억 경고
|
|
31
|
+
- **Parquet archive**: cold tier → `~/.forgetforge/archive/` (parquet + jsonl + txt)
|
|
32
|
+
- **Background pruner**: 6시간 주기 tier migration (`forgetforge prune`)
|
|
33
|
+
- **Safety**: `#keep_forever`, `#forget_this` 사용자 태그
|
|
34
|
+
|
|
35
|
+
ForgetForge는 **모델·OAuth를 소유하지 않습니다.** 연결된 AI가 도구 결과를 읽고 맥락에 반영합니다.
|
|
36
|
+
|
|
37
|
+
## 연결된 AI가 하는 일
|
|
38
|
+
|
|
39
|
+
| 상황 | 연결된 AI 동작 |
|
|
40
|
+
|------|----------------|
|
|
41
|
+
| 맥락이 커짐 | `forgetforge status` 또는 `forgetforge_status` |
|
|
42
|
+
| 과거 사실 필요 | `forgetforge recall <topic>` (explicit) |
|
|
43
|
+
| 응답에 기억 사용 | `forgetforge_recall` + `layer: implicit` |
|
|
44
|
+
| 세션 마무리 점검 | `forgetforge_recall` + `layer: reflection` |
|
|
45
|
+
| `#keep_forever` | `forgetforge keep <id>` |
|
|
46
|
+
| `#forget_this` | `forgetforge forget <id>` |
|
|
47
|
+
|
|
48
|
+
Hermes는 `forgetforge_*` 도구, Claude/Codex는 skill + CLI를 동일 규칙으로 따릅니다.
|
|
49
|
+
|
|
50
|
+
## Retention formula
|
|
51
|
+
|
|
52
|
+
\[
|
|
53
|
+
R = e^{-t / S} \times \left(1 + 0.45 \cdot N_r + 0.30 \cdot I + 0.25 \cdot F \right), \quad S = \ln(1 + N_r)
|
|
54
|
+
\]
|
|
55
|
+
|
|
56
|
+
## Tier 요약
|
|
57
|
+
|
|
58
|
+
| Tier | 조건 | 연결된 AI 동작 |
|
|
59
|
+
|------|------|----------------|
|
|
60
|
+
| **Hot** | 최근 7일 + \(N_r \geq 1\) | recall 결과를 맥락에 우선 반영 |
|
|
61
|
+
| **Warm-Episodic** | \(R \geq 0.65\) | 필요 시 recall |
|
|
62
|
+
| **Warm-Semantic** | \(R \geq 0.80\) | 장기 사실로 유지 |
|
|
63
|
+
| **Warm-Procedural** | skill + \(N_r \geq 3\) | 절차·스킬로 유지 |
|
|
64
|
+
| **Cold** | \(R < 0.40\) or 180일 무회상 | archive, 필요 시에만 recall |
|
|
65
|
+
|
|
66
|
+
## 빠른 시작
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pip install cluxion-Agentplugin-AutoClearMemory
|
|
70
|
+
forgetforge init --agents=all
|
|
71
|
+
forgetforge check
|
|
72
|
+
hermes plugins enable forgetforge # Hermes
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Rust 가속 (선택)
|
|
77
|
+
cargo build --release --manifest-path rust/forgetforge_engine/Cargo.toml
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 공통 명령
|
|
81
|
+
|
|
82
|
+
| Command | Description |
|
|
83
|
+
|---------|-------------|
|
|
84
|
+
| `forgetforge store <id> --content "..."` | Store or update memory |
|
|
85
|
+
| `forgetforge recall <topic>` | Explicit retrieval + tier boost |
|
|
86
|
+
| `forgetforge keep <id>` | `#keep_forever` |
|
|
87
|
+
| `forgetforge forget <id>` | `#forget_this` |
|
|
88
|
+
| `forgetforge status` | Memory health |
|
|
89
|
+
| `forgetforge prune` | Pruner 1회 실행 |
|
|
90
|
+
| `forgetforge pruner-daemon` | Background pruner (interval from config) |
|
|
91
|
+
| `forgetforge import-brief --source supercoder --brief "..."` | Brief → episodic memory |
|
|
92
|
+
| `forgetforge hot-context` | Hot tier context block (CLI) |
|
|
93
|
+
|
|
94
|
+
## Hermes 도구 (`forgetforge` toolset)
|
|
95
|
+
|
|
96
|
+
| Tool | Description |
|
|
97
|
+
|------|-------------|
|
|
98
|
+
| `forgetforge_store` | Save or update memory (contradiction warnings when similar) |
|
|
99
|
+
| `forgetforge_recall` | FTS search + retrieval event (`layer`: explicit / implicit / reflection) |
|
|
100
|
+
| `forgetforge_status` | Tier counts, engine status |
|
|
101
|
+
| `forgetforge_keep` | Pin memory forever |
|
|
102
|
+
| `forgetforge_forget` | Mark for forgetting |
|
|
103
|
+
| `forgetforge_import_brief` | Import preprocessing/supercoder brief |
|
|
104
|
+
| `forgetforge_hot_context` | Hot tier block (also via `pre_llm_call` hook) |
|
|
105
|
+
|
|
106
|
+
## 문서
|
|
107
|
+
|
|
108
|
+
- [Docs/README.md](Docs/README.md) — **처음 읽는 분** + 목차
|
|
109
|
+
- [Docs/architecture.md](Docs/architecture.md)
|
|
110
|
+
- [Docs/design.md](Docs/design.md)
|
|
111
|
+
- [Docs/installation.md](Docs/installation.md)
|
|
112
|
+
- [Docs/agent-surfaces.md](Docs/agent-surfaces.md)
|
|
113
|
+
- [Docs/rust-architecture.md](Docs/rust-architecture.md)
|
|
114
|
+
|
|
115
|
+
## License
|
|
116
|
+
|
|
117
|
+
Apache-2.0
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: forgetforge
|
|
3
|
+
description: Recall-centric memory for agent sessions. Use when context grows, when prior facts are needed, or when user tags #keep_forever / #forget_this. You (the connected AI) call forgetforge tools/CLI — the plugin does not call a separate model.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ForgetForge — 연결된 AI 지시문
|
|
7
|
+
|
|
8
|
+
ForgetForge는 **당신(연결된 AI)** 이 도구·CLI를 호출해 메모리를 관리합니다. 플러그인은 점수·tier·DB만 제공합니다.
|
|
9
|
+
|
|
10
|
+
## 설치 확인
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
forgetforge check
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 언제 호출할지
|
|
17
|
+
|
|
18
|
+
| 상황 | 동작 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| 새 사실·결정 저장 | `forgetforge store <id> --content "..."` 또는 `forgetforge_store` |
|
|
21
|
+
| 세션 시작·맥락 비대 | `forgetforge status` |
|
|
22
|
+
| 과거 사실 필요 | `forgetforge recall <topic>` 또는 `forgetforge_recall` layer=`explicit` |
|
|
23
|
+
| 응답에 기억을 실제 사용 | `forgetforge_recall` layer=`implicit` |
|
|
24
|
+
| 세션 마무리 | 사용한 기억에 대해 `forgetforge_recall` layer=`reflection` |
|
|
25
|
+
| 사용자 `#keep_forever` | `forgetforge keep <id>` |
|
|
26
|
+
| 사용자 `#forget_this` | `forgetforge forget <id>` |
|
|
27
|
+
| preprocessing/supercoder brief 수신 | `forgetforge import-brief` 또는 `forgetforge_import_brief` |
|
|
28
|
+
| store 후 `contradiction_warnings` | 기존 기억과 충돌 여부를 사용자에게 알리고 reconcile |
|
|
29
|
+
|
|
30
|
+
## 규칙
|
|
31
|
+
|
|
32
|
+
1. **회상이 강화 신호** — 저장만으로는 강해지지 않음. 사용·recall 시 layer를 기록할 것.
|
|
33
|
+
2. Tier: Hot → Warm (episodic/semantic/procedural) → Cold. Cold는 recall 시에만 다시 가져올 것.
|
|
34
|
+
3. recall 결과를 읽고 **당신의 응답 맥락에 반영**할 것. 플러그인이 응답을 대신 작성하지 않음.
|
|
35
|
+
4. 모르는 사실을 기억에서 찾지 못하면 추측하지 말 것.
|
|
36
|
+
5. Hermes에서는 hot tier가 `pre_llm_call` hook으로 자동 inject됩니다. 수동이 필요하면 `forgetforge_hot_context`를 호출하세요.
|
|
37
|
+
|
|
38
|
+
## Retention (참고)
|
|
39
|
+
|
|
40
|
+
R = e^{-t/S} × (1 + 0.45·N_r + 0.30·I + 0.25·F), S = ln(1 + N_r).
|
|
41
|
+
Scoring은 Rust `forgetforge-engine`이 수행합니다.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Hermes adapter
|
|
2
|
+
|
|
3
|
+
Hermes는 pip entry point로 ForgetForge를 로드합니다.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
hermes plugins enable forgetforge
|
|
7
|
+
forgetforge init --agents=hermes
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## 연결된 AI 도구
|
|
11
|
+
|
|
12
|
+
| Tool | 용도 |
|
|
13
|
+
|------|------|
|
|
14
|
+
| `forgetforge_store` | 저장/갱신 (contradiction warnings) |
|
|
15
|
+
| `forgetforge_recall` | FTS 검색 + retrieval 기록 (`layer` 필수) |
|
|
16
|
+
| `forgetforge_status` | tier·건강 상태 |
|
|
17
|
+
| `forgetforge_keep` | `#keep_forever` |
|
|
18
|
+
| `forgetforge_forget` | `#forget_this` |
|
|
19
|
+
| `forgetforge_import_brief` | preprocessing/supercoder brief 수입 |
|
|
20
|
+
| `forgetforge_hot_context` | hot tier 블록 (또는 `pre_llm_call` hook) |
|
|
21
|
+
|
|
22
|
+
연결된 AI는 recall 결과를 읽고 응답 맥락에 반영합니다. Hermes는 hot tier를 `pre_llm_call` hook으로 자동 inject합니다.
|