claude-memory-layer 1.0.26 → 1.0.28
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.
- package/.env.example +7 -0
- package/AGENTS.md +11 -0
- package/README.md +184 -41
- package/benchmarks/replay/anonymized-real-sessions.json +48 -0
- package/dist/cli/index.js +10097 -6003
- package/dist/cli/index.js.map +4 -4
- package/dist/core/index.js +9745 -5587
- package/dist/core/index.js.map +4 -4
- package/dist/hooks/post-tool-use.js +6545 -5270
- package/dist/hooks/post-tool-use.js.map +4 -4
- package/dist/hooks/semantic-daemon.js +6646 -5354
- package/dist/hooks/semantic-daemon.js.map +4 -4
- package/dist/hooks/session-end.js +6618 -5347
- package/dist/hooks/session-end.js.map +4 -4
- package/dist/hooks/session-start.js +6619 -5354
- package/dist/hooks/session-start.js.map +4 -4
- package/dist/hooks/stop.js +6614 -5325
- package/dist/hooks/stop.js.map +4 -4
- package/dist/hooks/user-prompt-submit.js +6702 -5356
- package/dist/hooks/user-prompt-submit.js.map +4 -4
- package/dist/index.js +13537 -0
- package/dist/index.js.map +7 -0
- package/dist/mcp/index.js +20770 -0
- package/dist/mcp/index.js.map +7 -0
- package/dist/server/api/index.js +6632 -5319
- package/dist/server/api/index.js.map +4 -4
- package/dist/server/index.js +6667 -5340
- package/dist/server/index.js.map +4 -4
- package/dist/services/memory-service.js +6568 -5350
- package/dist/services/memory-service.js.map +4 -4
- package/dist/ui/assets/js/bootstrap.js +244 -0
- package/dist/ui/assets/js/chat.js +373 -0
- package/dist/ui/assets/js/disclosure.js +232 -0
- package/dist/ui/assets/js/modals.js +298 -0
- package/dist/ui/assets/js/overview.js +655 -0
- package/dist/ui/assets/js/state.js +72 -0
- package/dist/ui/assets/js/views.js +468 -0
- package/dist/ui/index.html +43 -1
- package/dist/ui/index.ts +3 -0
- package/dist/ui/style.css +222 -0
- package/docs/ARCHITECTURE_COMPARISON_AND_RECOMMENDATIONS.md +627 -0
- package/docs/HERMES_MEMORY_INGESTION_ANALYSIS.md +440 -0
- package/docs/MEMORY_USEFULNESS_AUDIT.md +371 -0
- package/docs/MEMORY_USEFULNESS_AUDIT_RAW.json +80 -0
- package/docs/MEMSEARCH_PROJECT_STRUCTURE_ANALYSIS.md +333 -0
- package/docs/PRODUCT_VALIDATION_MATRIX.md +82 -0
- package/docs/PROJECT_STRUCTURE_ANALYSIS.md +421 -0
- package/docs/REFACTORING_MILESTONES_AND_ISSUES.md +501 -0
- package/docs/REFACTORING_PLAN_THIN_CORE.md +414 -0
- package/docs/REFERENCE_PROJECT_ANALYSES.md +25 -0
- package/docs/SUPERLOCALMEMORY_PROJECT_STRUCTURE_ANALYSIS.md +452 -0
- package/docs/TARGET_ARCHITECTURE_AND_FOLDER_STRUCTURE.md +446 -0
- package/docs/architecture/comparison-index.md +47 -0
- package/docs/reports/codex-real-data-validation-20260505T040447Z.md +46 -0
- package/package.json +9 -5
- package/scripts/build.ts +25 -8
- package/scripts/generate-session-qrels.ts +126 -0
- package/scripts/replay-retrieval-benchmark.ts +69 -0
- package/specs/thin-core-refactor/context.md +275 -0
- package/specs/thin-core-refactor/plan.md +536 -0
- package/specs/thin-core-refactor/spec.md +465 -0
- package/src/adapters/claude/capture/index.ts +3 -0
- package/src/adapters/claude/context/index.ts +3 -0
- package/src/adapters/claude/hooks/index.ts +21 -0
- package/src/adapters/claude/hooks/post-tool-use.ts +239 -0
- package/src/adapters/claude/hooks/prompt-injection-policy.ts +104 -0
- package/src/adapters/claude/hooks/semantic-daemon-client.ts +209 -0
- package/src/adapters/claude/hooks/semantic-daemon.ts +283 -0
- package/src/adapters/claude/hooks/session-end.ts +59 -0
- package/src/adapters/claude/hooks/session-start.ts +73 -0
- package/src/adapters/claude/hooks/stop.ts +128 -0
- package/src/adapters/claude/hooks/user-prompt-submit.ts +361 -0
- package/src/adapters/claude/index.ts +4 -0
- package/src/adapters/claude/transcript/index.ts +4 -0
- package/src/adapters/claude/transcript/transcript-reader.ts +57 -0
- package/src/adapters/claude/transcript/turn-reconstructor.ts +65 -0
- package/src/apps/cli/claude-settings-hooks.ts +138 -0
- package/src/apps/cli/codex-import-runner.ts +125 -0
- package/src/apps/cli/codex-validation-output.ts +95 -0
- package/src/apps/cli/hermes-import-runner.ts +130 -0
- package/src/apps/cli/hermes-validation-output.ts +91 -0
- package/src/apps/cli/index.ts +1731 -0
- package/src/apps/cli/mcp-install.ts +106 -0
- package/src/apps/cli/retrieval-disclosure-output.ts +196 -0
- package/src/apps/dashboard/assets/js/bootstrap.js +244 -0
- package/src/apps/dashboard/assets/js/chat.js +373 -0
- package/src/apps/dashboard/assets/js/disclosure.js +232 -0
- package/src/apps/dashboard/assets/js/modals.js +298 -0
- package/src/apps/dashboard/assets/js/overview.js +655 -0
- package/src/apps/dashboard/assets/js/state.js +72 -0
- package/src/apps/dashboard/assets/js/views.js +468 -0
- package/src/{ui → apps/dashboard}/index.html +43 -1
- package/src/apps/dashboard/index.ts +3 -0
- package/src/{ui → apps/dashboard}/style.css +222 -0
- package/src/apps/index.ts +5 -0
- package/src/apps/server/api/chat.ts +244 -0
- package/src/apps/server/api/citations.ts +105 -0
- package/src/apps/server/api/events.ts +137 -0
- package/src/apps/server/api/health.ts +53 -0
- package/src/apps/server/api/index.ts +26 -0
- package/src/apps/server/api/projects.ts +74 -0
- package/src/apps/server/api/search.ts +184 -0
- package/src/apps/server/api/sessions.ts +115 -0
- package/src/apps/server/api/stats.ts +723 -0
- package/src/apps/server/api/turns.ts +143 -0
- package/src/apps/server/api/utils.ts +65 -0
- package/src/apps/server/index.ts +111 -0
- package/src/cli/index.ts +2 -1311
- package/src/cli/retrieval-disclosure-output.ts +2 -0
- package/src/compat/index.ts +5 -0
- package/src/core/derive/fact-deriver.ts +170 -0
- package/src/core/derive/index.ts +2 -0
- package/src/core/derive/summary-deriver.ts +76 -0
- package/src/core/embedder.ts +4 -152
- package/src/core/engine/embedding-maintenance-service.ts +187 -0
- package/src/core/engine/endless-memory-services.ts +4 -0
- package/src/core/engine/index.ts +19 -0
- package/src/core/engine/memory-engine-services.ts +170 -0
- package/src/core/engine/memory-ingest-service.ts +317 -0
- package/src/core/engine/memory-query-service.ts +173 -0
- package/src/core/engine/memory-runtime-service.ts +162 -0
- package/src/core/engine/memory-service-composition.ts +231 -0
- package/src/core/engine/retrieval-analytics-service.ts +181 -0
- package/src/core/engine/retrieval-disclosure-service.ts +420 -0
- package/src/core/engine/retrieval-orchestrator.ts +377 -0
- package/src/core/engine/retrieval-services.ts +176 -0
- package/src/core/engine/shared-memory-services.ts +4 -0
- package/src/core/entity-repo.ts +1 -3
- package/src/core/event-store.ts +3 -3
- package/src/core/evidence-aligner.ts +2 -2
- package/src/core/external-market-context.ts +582 -0
- package/src/core/graduation.ts +2 -3
- package/src/core/index.ts +21 -0
- package/src/core/matcher.ts +2 -4
- package/src/core/model/memory-fact.ts +30 -0
- package/src/core/model/memory-rule.ts +14 -0
- package/src/core/model/memory-summary.ts +21 -0
- package/src/core/model/raw-event.ts +28 -0
- package/src/core/model/retrieval-result.ts +35 -0
- package/src/core/privacy/filter.ts +21 -10
- package/src/core/product-validation-matrix.ts +314 -0
- package/src/core/progressive-retriever.ts +1 -2
- package/src/core/registry/project-path.ts +54 -0
- package/src/core/registry/session-registry.ts +69 -0
- package/src/core/replay-evaluator.ts +625 -0
- package/src/core/retrieval-benchmark.ts +117 -0
- package/src/core/retrieval-quality.ts +109 -0
- package/src/core/retriever.ts +53 -15
- package/src/core/session-qrels.ts +360 -0
- package/src/core/shared-event-store.ts +1 -1
- package/src/core/sqlite-event-store.ts +35 -11
- package/src/core/task/blocker-resolver.ts +2 -2
- package/src/core/task/task-resolver.ts +0 -1
- package/src/core/vector-outbox.ts +1 -10
- package/src/core/vector-worker.ts +1 -1
- package/src/extensions/endless-memory/endless-memory-services.ts +350 -0
- package/src/extensions/endless-memory/index.ts +1 -0
- package/src/extensions/index.ts +5 -0
- package/src/extensions/mcp/handlers.ts +960 -0
- package/src/extensions/mcp/index.ts +48 -0
- package/src/extensions/mcp/tools.ts +252 -0
- package/src/extensions/shared-memory/index.ts +1 -0
- package/src/extensions/shared-memory/shared-memory-services.ts +211 -0
- package/src/extensions/vector/embedder.ts +197 -0
- package/src/extensions/vector/index.ts +1 -0
- package/src/hooks/post-tool-use.ts +3 -236
- package/src/hooks/semantic-daemon-client.ts +1 -208
- package/src/hooks/semantic-daemon.ts +6 -271
- package/src/hooks/session-end.ts +4 -79
- package/src/hooks/session-start.ts +4 -73
- package/src/hooks/stop.ts +3 -173
- package/src/hooks/user-prompt-submit.ts +3 -338
- package/src/index.ts +13 -0
- package/src/mcp/handlers.ts +2 -212
- package/src/mcp/index.ts +3 -46
- package/src/mcp/tools.ts +2 -78
- package/src/server/api/chat.ts +2 -244
- package/src/server/api/citations.ts +2 -105
- package/src/server/api/events.ts +2 -137
- package/src/server/api/health.ts +2 -53
- package/src/server/api/index.ts +2 -26
- package/src/server/api/projects.ts +2 -74
- package/src/server/api/search.ts +2 -102
- package/src/server/api/sessions.ts +2 -115
- package/src/server/api/stats.ts +2 -724
- package/src/server/api/turns.ts +2 -143
- package/src/server/api/utils.ts +2 -46
- package/src/server/index.ts +2 -100
- package/src/services/bootstrap-organizer.ts +46 -26
- package/src/services/codex-session-history-importer.ts +521 -29
- package/src/services/hermes-session-history-importer.ts +733 -0
- package/src/services/memory-service-config.ts +36 -0
- package/src/services/memory-service-registry.ts +150 -0
- package/src/services/memory-service.ts +211 -1325
- package/src/services/session-history-importer.ts +58 -14
- package/tests/README.md +23 -0
- package/tests/adapters/claude/claude-semantic-daemon-adapter.test.ts +54 -0
- package/tests/adapters/claude/claude-transcript-reconstructor.test.ts +98 -0
- package/tests/adapters/claude-hook-prompt-injection-policy.test.ts +99 -0
- package/tests/apps/app-layer-boundary.test.ts +48 -0
- package/tests/apps/claude-settings-hooks.test.ts +107 -0
- package/tests/apps/cli-disclosure-output.test.ts +212 -0
- package/tests/apps/codex-import-runner.test.ts +99 -0
- package/tests/apps/codex-validation-output.test.ts +100 -0
- package/tests/apps/hermes-import-runner.test.ts +99 -0
- package/tests/apps/mcp-install-command.test.ts +59 -0
- package/tests/apps/package-build-entrypoints.test.ts +30 -0
- package/tests/apps/search-api-disclosure.test.ts +162 -0
- package/tests/apps/stats-api-lightweight.test.ts +67 -0
- package/tests/apps/ui-disclosure-output.test.ts +140 -0
- package/tests/{bootstrap-organizer.test.ts → core/bootstrap-organizer.test.ts} +1 -1
- package/tests/{canonical-key.test.ts → core/canonical-key.test.ts} +1 -1
- package/tests/core/codex-session-history-importer-validation.test.ts +185 -0
- package/tests/{consolidation-worker.test.ts → core/consolidation-worker.test.ts} +2 -2
- package/tests/core/embedding-maintenance-service.test.ts +282 -0
- package/tests/{evidence-aligner.test.ts → core/evidence-aligner.test.ts} +1 -1
- package/tests/core/external-market-context.test.ts +209 -0
- package/tests/core/fact-deriver.test.ts +79 -0
- package/tests/core/hermes-session-history-importer-validation.test.ts +609 -0
- package/tests/{ingest-interceptor.test.ts → core/ingest-interceptor.test.ts} +1 -1
- package/tests/{markdown-mirror.test.ts → core/markdown-mirror.test.ts} +2 -2
- package/tests/{matcher.test.ts → core/matcher.test.ts} +1 -1
- package/tests/{md-mirror.test.ts → core/md-mirror.test.ts} +2 -2
- package/tests/core/memory-engine-services.test.ts +240 -0
- package/tests/core/memory-ingest-service.test.ts +296 -0
- package/tests/core/memory-query-service.test.ts +129 -0
- package/tests/core/memory-runtime-service.test.ts +201 -0
- package/tests/core/memory-service-composition.test.ts +192 -0
- package/tests/core/memory-service-config.test.ts +41 -0
- package/tests/core/memory-service-facade.test.ts +30 -0
- package/tests/core/memory-service-registry.test.ts +206 -0
- package/tests/core/product-validation-matrix.test.ts +61 -0
- package/tests/core/project-registry.test.ts +78 -0
- package/tests/core/replay-evaluator.test.ts +181 -0
- package/tests/core/retrieval-analytics-service.test.ts +210 -0
- package/tests/core/retrieval-benchmark.test.ts +93 -0
- package/tests/core/retrieval-disclosure-service.test.ts +264 -0
- package/tests/core/retrieval-orchestrator.test.ts +403 -0
- package/tests/core/retrieval-quality.test.ts +31 -0
- package/tests/core/retrieval-services.test.ts +185 -0
- package/tests/{retriever-fallback-chain.test.ts → core/retriever-fallback-chain.test.ts} +3 -3
- package/tests/{retriever-strategy-scope.test.ts → core/retriever-strategy-scope.test.ts} +70 -3
- package/tests/{retriever.memu-adoption.test.ts → core/retriever.memu-adoption.test.ts} +3 -3
- package/tests/core/session-history-importer-filter.test.ts +78 -0
- package/tests/core/session-qrels.test.ts +250 -0
- package/tests/{sqlite-event-store-replication.test.ts → core/sqlite-event-store-replication.test.ts} +36 -1
- package/tests/core/summary-deriver.test.ts +66 -0
- package/tests/extensions/embedder-warning-suppression.test.ts +53 -0
- package/tests/extensions/endless-memory-extension-boundary.test.ts +17 -0
- package/tests/extensions/endless-memory-services.test.ts +325 -0
- package/tests/extensions/mcp-context-tools.test.ts +905 -0
- package/tests/extensions/mcp-extension-boundary.test.ts +21 -0
- package/tests/extensions/mcp-package-build.test.ts +22 -0
- package/tests/extensions/mcp-project-aware-tools.test.ts +102 -0
- package/tests/extensions/shared-memory-extension-boundary.test.ts +24 -0
- package/tests/extensions/shared-memory-services.test.ts +309 -0
- package/tests/extensions/vector-extension-boundary.test.ts +21 -0
- package/.claude/settings.local.json +0 -25
- package/.npm-cache/_cacache/content-v2/sha512/04/76/c098f88dfe584a2b80870bff7421b05d17d3d9ee1027f77772332a22d3f93a9a57101a2855107f6ad82077a818bba912b2bc317f2361b5ddb09ad284d9ce +0 -0
- package/.npm-cache/_cacache/content-v2/sha512/60/25/d2ecd39cfc7cab58351162814be77f935c6d6491c10c3745d456da7ddb2117ffd90c10e53fe3c0f1ed16b403307841543634504398b16ee4e6b6dd8e0c45 +0 -0
- package/.npm-cache/_cacache/index-v5/2b/9a/7f8f40206ed8a2e0a84efaa953ccaed1f5d001e14b931083f2e7a0738007 +0 -2
- package/.npm-cache/_cacache/index-v5/2e/d9/fcfa5c6a6abdc2a3644ab84a95936047298c465a2f47ee03db8f7fe1e946 +0 -3
- package/.npm-cache/_cacache/index-v5/a9/42/e519633356d12d3d2f19da66a8301016d496c8f5c3e0554124aaa62dc043 +0 -2
- package/.npm-cache/_logs/2026-02-26T12_04_52_729Z-debug-0.log +0 -256
- package/.npm-cache/_logs/2026-02-26T12_05_36_835Z-debug-0.log +0 -18
- package/.npm-cache/_logs/2026-02-26T12_05_45_982Z-debug-0.log +0 -32
- package/.npm-cache/_logs/2026-02-26T12_05_48_515Z-debug-0.log +0 -260
- package/.npm-cache/_logs/2026-02-26T12_05_53_567Z-debug-0.log +0 -69
- package/.npm-cache/_update-notifier-last-checked +0 -0
- package/bootstrap-kb/decisions/decisions.md +0 -244
- package/bootstrap-kb/glossary/glossary.md +0 -46
- package/bootstrap-kb/modules/.claude-plugin.md +0 -22
- package/bootstrap-kb/modules/agents.md.md +0 -15
- package/bootstrap-kb/modules/claude.md.md +0 -15
- package/bootstrap-kb/modules/context.md.md +0 -15
- package/bootstrap-kb/modules/docs.md +0 -18
- package/bootstrap-kb/modules/handoff.md.md +0 -15
- package/bootstrap-kb/modules/package-lock.json.md +0 -15
- package/bootstrap-kb/modules/package.json.md +0 -15
- package/bootstrap-kb/modules/plan.md.md +0 -15
- package/bootstrap-kb/modules/readme.md.md +0 -15
- package/bootstrap-kb/modules/scripts.md +0 -26
- package/bootstrap-kb/modules/spec.md.md +0 -15
- package/bootstrap-kb/modules/specs.md +0 -20
- package/bootstrap-kb/modules/src.md +0 -51
- package/bootstrap-kb/modules/tests.md +0 -42
- package/bootstrap-kb/modules/tsconfig.json.md +0 -15
- package/bootstrap-kb/modules/vitest.config.ts.md +0 -15
- package/bootstrap-kb/overview/overview.md +0 -40
- package/bootstrap-kb/sources/manifest.json +0 -950
- package/bootstrap-kb/sources/manifest.md +0 -227
- package/bootstrap-kb/timeline/timeline.md +0 -57
- package/claude-memory-layer-1.0.14.tgz +0 -0
- package/d.sh +0 -3
- package/deploy.sh +0 -3
- package/dist/ui/app.js +0 -2101
- package/memory/.claude-plugin/commands/2026-02-25.md +0 -263
- package/memory/_index.md +0 -418
- package/memory/agent_response/uncategorized/2026-02-26.md +0 -176
- package/memory/agent_response/uncategorized/2026-03-03.md +0 -14
- package/memory/agent_response/uncategorized/2026-03-04.md +0 -1421
- package/memory/agent_response/uncategorized/2026-03-05.md +0 -48
- package/memory/default/uncategorized/2026-02-25.md +0 -4839
- package/memory/session_summary/uncategorized/2026-02-26.md +0 -13
- package/memory/session_summary/uncategorized/2026-03-03.md +0 -5
- package/memory/session_summary/uncategorized/2026-03-04.md +0 -50
- package/memory/specs/20260207-dashboard-upgrade/2026-02-25.md +0 -142
- package/memory/specs/citations-system/2026-02-25.md +0 -1121
- package/memory/specs/endless-mode/2026-02-25.md +0 -1392
- package/memory/specs/entity-edge-model/2026-02-25.md +0 -1263
- package/memory/specs/evidence-aligner-v2/2026-02-25.md +0 -1028
- package/memory/specs/mcp-desktop-integration/2026-02-25.md +0 -1334
- package/memory/specs/post-tool-use-hook/2026-02-25.md +0 -1164
- package/memory/specs/private-tags/2026-02-25.md +0 -1057
- package/memory/specs/progressive-disclosure/2026-02-25.md +0 -1436
- package/memory/specs/task-entity-system/2026-02-25.md +0 -924
- package/memory/specs/vector-outbox-v2/2026-02-25.md +0 -1510
- package/memory/specs/web-viewer-ui/2026-02-25.md +0 -1709
- package/memory/tool_observation/uncategorized/2026-02-26.md +0 -209
- package/memory/tool_observation/uncategorized/2026-03-03.md +0 -21
- package/memory/tool_observation/uncategorized/2026-03-04.md +0 -1033
- package/memory/tool_observation/uncategorized/2026-03-05.md +0 -29
- package/memory/user_prompt/uncategorized/2026-02-26.md +0 -25
- package/memory/user_prompt/uncategorized/2026-03-04.md +0 -634
- package/specs/optional-duckdb/context.md +0 -77
- package/specs/optional-duckdb/plan.md +0 -142
- package/specs/optional-duckdb/spec.md +0 -35
- package/src/ui/app.js +0 -2101
|
@@ -1,1421 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
## 2026-03-04T06:28:06.090Z | 22424d25-2906-494c-8308-334081c07d2b
|
|
3
|
-
- type: agent_response
|
|
4
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
5
|
-
`@huggingface/transformers` is missing from local `node_modules` (only `jinja` is there). Run `npm install` in the workspace:
|
|
6
|
-
## 2026-03-04T06:28:06.118Z | 14ec2daf-64da-4d17-ab68-9d0f808ef2db
|
|
7
|
-
- type: agent_response
|
|
8
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
9
|
-
`npm install` completed successfully — `@huggingface/transformers` is now installed. Try `npx claude-memory-layer import` again.
|
|
10
|
-
## 2026-03-04T06:36:47.069Z | 58672b48-2a7a-401e-ab51-2116abaa5acf
|
|
11
|
-
- type: agent_response
|
|
12
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
13
|
-
변경사항은 `package.json`과 `package-lock.json`의 버전 bump (1.0.20 → 1.0.22)뿐입니다.
|
|
14
|
-
## 2026-03-04T06:36:47.080Z | ed63476b-dbe5-4f91-9700-706133fdec75
|
|
15
|
-
- type: agent_response
|
|
16
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
17
|
-
커밋 완료! `chore: bump version to 1.0.22` (3da2502)
|
|
18
|
-
## 2026-03-04T06:39:10.597Z | 5bcee020-0f05-4722-b5f1-0a73d258494d
|
|
19
|
-
- type: agent_response
|
|
20
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
21
|
-
ONNX Runtime가 `RotaryEmbedding` 업데이트를 지원하지 않는 문제입니다. 입력 토큰이 8389개로 모델의 max sequence length를 초과했을 가능성이 높습니다. 관련 코드를 확인해보겠습니다.
|
|
22
|
-
## 2026-03-04T06:39:10.634Z | 741b8a86-c7a7-470a-b9ab-d73a19e01ace
|
|
23
|
-
- type: agent_response
|
|
24
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
25
|
-
문제가 명확합니다. 입력 텍스트가 8389 토큰으로 모델의 max sequence length를 초과했고, ONNX Runtime이 RotaryEmbedding의 캐시 업데이트를 지원하지 않아 에러가 발생합니다.
|
|
26
|
-
|
|
27
|
-
`truncation: true` 옵션을 추가하면 해결됩니다.
|
|
28
|
-
## 2026-03-04T06:39:10.644Z | 72571d87-cfe7-4aed-83cc-20e1f27103c3
|
|
29
|
-
- type: agent_response
|
|
30
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
31
|
-
`embedBatch`도 동일하게 수정합니다.
|
|
32
|
-
## 2026-03-04T06:39:10.656Z | 628e80d5-6fb4-4b53-ad1d-281ee54d3144
|
|
33
|
-
- type: agent_response
|
|
34
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
35
|
-
이제 빌드하고 배포하면 됩니다.
|
|
36
|
-
## 2026-03-04T06:39:10.665Z | 339cafcb-46be-4ef9-90c2-8e9d4ed6177f
|
|
37
|
-
- type: agent_response
|
|
38
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
39
|
-
빌드 성공! 이제 버전 bump하고 배포하면 됩니다.
|
|
40
|
-
## 2026-03-04T06:39:10.673Z | 43348f80-aca8-4e3a-9ab8-d58787f039a8
|
|
41
|
-
- type: agent_response
|
|
42
|
-
- session: 49653e19-2797-42cb-b203-bb26aaa00738
|
|
43
|
-
빌드 완료 (v1.0.23). 이제 publish하세요:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
npm publish --otp=<OTP코드>
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
OTP 코드 입력하면 배포됩니다.
|
|
50
|
-
## 2026-03-04T07:23:58.757Z | 2f804e76-3abd-4445-936b-55dd92dcbff4
|
|
51
|
-
- type: agent_response
|
|
52
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
53
|
-
전체 구조를 파악하기 위해 CLI 진입점과 빌드 설정도 확인합니다.
|
|
54
|
-
## 2026-03-04T07:23:58.786Z | d5fc5bc7-dc9a-4d13-8a03-70a5e612ee40
|
|
55
|
-
- type: agent_response
|
|
56
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
57
|
-
코드 리뷰 결과입니다.
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 전체 구조 평가: 양호
|
|
62
|
-
|
|
63
|
-
Unix domain socket 기반 daemon 패턴은 적절한 선택입니다. 아래 세 계층으로 잘 분리되어 있습니다.
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
hook process (ephemeral)
|
|
67
|
-
└─ semantic-daemon-client.ts (IPC client)
|
|
68
|
-
└─ semantic-daemon.ts (long-running, model in memory)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## 문제점
|
|
74
|
-
|
|
75
|
-
### 1. 콜드 스타트 타임아웃이 타이트할 수 있음 (잠재적 버그)
|
|
76
|
-
|
|
77
|
-
`semantic-daemon-client.ts:44`
|
|
78
|
-
```
|
|
79
|
-
DAEMON_START_TIMEOUT_MS = 1500ms ← 데몬 기동 대기
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
`user-prompt-submit.ts:29`
|
|
83
|
-
```
|
|
84
|
-
SEMANTIC_TIMEOUT_MS = 1200ms ← 실제 retrieval 타임아웃
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
데몬이 소켓을 열어도(`ensureDaemonRunning` 완료) `MemoryService`는 첫 요청 시점에 lazy하게 초기화됩니다 (`getServiceForSession`). 모델 초기화 ~730ms + retrieval ~20ms = ~750ms이면 괜찮지만, 느린 머신에서는 1200ms를 초과할 수 있습니다. 데몬이 정상 기동된 직후의 첫 retrieval이 timeout으로 silent하게 버려지는 상황이 됩니다.
|
|
88
|
-
|
|
89
|
-
### 2. 데몬 크래시 후 재기동이 한 번만 시도됨
|
|
90
|
-
|
|
91
|
-
`semantic-daemon-client.ts:60-69`
|
|
92
|
-
```ts
|
|
93
|
-
try {
|
|
94
|
-
return await requestFromDaemon(payload, timeoutMs);
|
|
95
|
-
} catch (error) {
|
|
96
|
-
if (!isConnectionError(error)) throw error;
|
|
97
|
-
await ensureDaemonRunning();
|
|
98
|
-
return requestFromDaemon(payload, timeoutMs); // 재시도 1회만
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
데몬이 이미 실행 중이었다가 크래시된 경우: `ECONNRESET`이나 `EPIPE` 에러가 `isConnectionError`로 잡혀 `ensureDaemonRunning`을 호출하지만, 이때 `canConnect()` 체크가 false → 새 데몬 spawn → 최대 1500ms 대기 → 다시 `requestFromDaemon`. 흐름 자체는 맞습니다. ✓
|
|
103
|
-
|
|
104
|
-
그러나 재기동 후의 두 번째 `requestFromDaemon`에서 또 실패하면 `catch` 없이 throw됩니다. `user-prompt-submit.ts`의 `try/catch`가 받아서 empty context로 처리하므로 사용자에게는 영향 없지만, 디버깅 시 혼란스러울 수 있습니다.
|
|
105
|
-
|
|
106
|
-
### 3. 주석이 구현과 불일치
|
|
107
|
-
|
|
108
|
-
`user-prompt-submit.ts:5-9`
|
|
109
|
-
```ts
|
|
110
|
-
/**
|
|
111
|
-
* Uses SQLite FTS5 for fast keyword-based search (no ML model needed)
|
|
112
|
-
* Much faster than vector search (~100ms vs 3-5s)
|
|
113
|
-
*/
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
현재는 `hybrid` 기본값으로 semantic도 사용합니다. 주석이 outdated 상태입니다.
|
|
117
|
-
|
|
118
|
-
### 4. 데몬 서비스가 `readOnly: true`인데 shutdown 시 close를 호출
|
|
119
|
-
|
|
120
|
-
`semantic-daemon.ts:218-221`
|
|
121
|
-
```ts
|
|
122
|
-
for (const service of serviceCache.values()) {
|
|
123
|
-
closePromises.push(service.shutdown().catch(() => undefined));
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
`MemoryService`가 read-only로 생성되어 있으니 `shutdown()`에서 write 관련 flush가 없을 것 같지만, `service.shutdown()`이 정의되어 있다면 문제는 없습니다. MemoryService 내부 구현 확인이 필요합니다.
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## 잘 된 부분
|
|
132
|
-
|
|
133
|
-
| 항목 | 내용 |
|
|
134
|
-
|------|------|
|
|
135
|
-
| `socketInUse` 체크 | 데몬 중복 기동 방지 정확히 처리됨 |
|
|
136
|
-
| `idleTimer.unref()` | 이벤트 루프 블로킹 없이 idle 감지 |
|
|
137
|
-
| `serviceCache` per projectHash | 프로젝트별 격리 + 메모리 재사용 |
|
|
138
|
-
| request 1MB / response 4MB 제한 | 적절한 방어 처리 |
|
|
139
|
-
| `daemonStartPromise` dedup | 동일 프로세스 내 중복 spawn 방지 |
|
|
140
|
-
| build에 `semantic-daemon` 포함 | `dist/hooks/semantic-daemon.js` 정확히 빌드됨 |
|
|
141
|
-
| `getDaemonScriptPath()` | `import.meta.url` 기반이라 경로 이동에 안전 |
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## 권장 수정
|
|
146
|
-
|
|
147
|
-
1. **타임아웃 여유 확보**: `SEMANTIC_TIMEOUT_MS` 기본값을 `2000`으로 올리거나, 데몬 기동 직후 warm-up 요청을 별도로 처리
|
|
148
|
-
2. **주석 업데이트**: `user-prompt-submit.ts` 상단 주석을 hybrid 모드 반영으로 수정
|
|
149
|
-
3. (선택) `requestFromDaemon` 두 번째 실패 시 디버그 로그 추가
|
|
150
|
-
|
|
151
|
-
전체적으로 구조는 맞고 핵심 목적(모델 재사용)은 잘 달성됩니다. 타임아웃 값 조정이 가장 실용적인 개선점입니다.
|
|
152
|
-
## 2026-03-04T07:25:04.412Z | 976f91d5-e52b-44ae-b224-403be6772f5a
|
|
153
|
-
- type: agent_response
|
|
154
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
155
|
-
세 가지 수정 완료했습니다.
|
|
156
|
-
|
|
157
|
-
1. **주석 업데이트** (`user-prompt-submit.ts:1-14`) — keyword/semantic/hybrid 모드 설명 및 daemon 재사용 동작 명시
|
|
158
|
-
|
|
159
|
-
2. **타임아웃 여유 확보** (`user-prompt-submit.ts:29`) — `1200ms → 2000ms`로 변경. 콜드 스타트 시 daemon 기동 후 첫 retrieval(모델 초기화 ~730ms + 검색 ~20ms)이 timeout으로 버려지는 문제 방지
|
|
160
|
-
|
|
161
|
-
3. **재시도 실패 디버그 로그** (`semantic-daemon-client.ts:68-72`) — daemon 재기동 후 두 번째 요청도 실패할 경우 `CLAUDE_MEMORY_DEBUG=1` 환경변수 설정 시 원인 로그 출력
|
|
162
|
-
## 2026-03-04T07:26:20.051Z | 654d54e9-3de0-4aeb-b214-76ba68623612
|
|
163
|
-
- type: agent_response
|
|
164
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
165
|
-
커밋 완료했습니다.
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
fb27cae feat(semantic): add long-running daemon for embedding model reuse
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
9개 파일 변경 (506 추가, 52 삭제), `semantic-daemon.ts`와 `semantic-daemon-client.ts` 신규 생성 포함.
|
|
172
|
-
## 2026-03-04T07:27:09.338Z | 8e50ef75-09ce-4ec7-a924-e2c73f442c77
|
|
173
|
-
- type: agent_response
|
|
174
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
175
|
-
맞습니다. 현재 저장은 `shouldStorePrompt`에서 `/` 명령어를 걸러주지만, **검색은 `length > 10`만 체크**합니다.
|
|
176
|
-
|
|
177
|
-
`/commit fix the bug` 같이 10자 넘는 slash command도 retrieval을 타게 됩니다.
|
|
178
|
-
## 2026-03-04T07:27:09.365Z | e84e2c92-5ac4-40af-9ca1-b25228293fdb
|
|
179
|
-
- type: agent_response
|
|
180
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
181
|
-
완료했습니다.
|
|
182
|
-
|
|
183
|
-
`/commit`, `/clear`, `/commit fix the bug` 등 slash command는 이제 retrieval을 건너뜁니다. `shouldStorePrompt`와 동일한 패턴으로 일관성도 맞췄습니다.
|
|
184
|
-
## 2026-03-04T07:46:04.205Z | a55204a3-2e5c-42da-98e2-5cefd3a0f047
|
|
185
|
-
- type: agent_response
|
|
186
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
187
|
-
좋은 아이디어입니다. 특히 이런 케이스에서 효과적입니다:
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
[turn 2] 사용자: "그럼 그거 고쳐줘"
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
prompt만으론 무엇을 고치는지 임베딩이 잡을 수 없지만, 이전 assistant 답변 일부를 붙이면 맥락이 해소됩니다.
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
**구현 방향:**
|
|
198
|
-
|
|
199
|
-
1. **`Stop` hook** — agent 응답 완료 후, 응답 앞부분(~500자)을 세션 state 파일에 저장
|
|
200
|
-
2. **`UserPromptSubmit` hook** — retrieval query를 `lastAssistantSnippet + "\n\n" + currentPrompt` 로 구성 (저장은 원래 prompt만)
|
|
201
|
-
|
|
202
|
-
**주의할 점:**
|
|
203
|
-
|
|
204
|
-
| 항목 | 내용 |
|
|
205
|
-
|------|------|
|
|
206
|
-
| **쿼리 길이** | assistant 답변이 길 수 있으므로 500자 내외로 truncate |
|
|
207
|
-
| **적용 조건** | turn 1은 이전 응답이 없으므로 그냥 prompt만 사용 |
|
|
208
|
-
| **저장 분리** | retrieval query 확장은 검색에만 적용, DB 저장은 원래 prompt 그대로 |
|
|
209
|
-
| **노이즈 위험** | assistant 답변이 관련 없는 내용을 길게 포함하면 오히려 검색 품질 저하 가능 → 요약보다 앞부분 slice가 안전 |
|
|
210
|
-
|
|
211
|
-
구현할까요?
|
|
212
|
-
## 2026-03-04T07:49:13.254Z | 3b7efe0a-f245-4fde-a63f-19d52a7cde1d
|
|
213
|
-
- type: agent_response
|
|
214
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
215
|
-
구조가 명확합니다. `turn-state.ts`에 read/write 유틸 추가 → `stop.ts`에서 저장 → `user-prompt-submit.ts`에서 읽어서 retrieval query 확장합니다.
|
|
216
|
-
## 2026-03-04T07:49:13.274Z | dc70cd78-5fec-4c0d-834a-c3224b5e3281
|
|
217
|
-
- type: agent_response
|
|
218
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
219
|
-
이제 `user-prompt-submit.ts`에서 snippet을 읽어 retrieval query 확장합니다.
|
|
220
|
-
## 2026-03-04T07:49:13.284Z | ec13d3f8-32da-4254-8be1-80d1b164b105
|
|
221
|
-
- type: agent_response
|
|
222
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
223
|
-
fallback retry에도 `retrievalQuery` 적용되는지 확인합니다.
|
|
224
|
-
## 2026-03-04T07:49:13.294Z | 7f2ed0ab-cd35-4b78-9fcc-1221a75d87d0
|
|
225
|
-
- type: agent_response
|
|
226
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
227
|
-
fallback retry도 `input.prompt` → `retrievalQuery`로 수정합니다.
|
|
228
|
-
## 2026-03-04T07:49:13.303Z | 74f69afb-63e2-4815-866c-b221516f74a9
|
|
229
|
-
- type: agent_response
|
|
230
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
231
|
-
구현 완료했습니다.
|
|
232
|
-
|
|
233
|
-
---
|
|
234
|
-
|
|
235
|
-
**변경 요약:**
|
|
236
|
-
|
|
237
|
-
| 파일 | 변경 내용 |
|
|
238
|
-
|------|-----------|
|
|
239
|
-
| `turn-state.ts` | `writeLastAssistantSnippet` / `readLastAssistantSnippet` 추가 (500자 slice, 2시간 TTL) |
|
|
240
|
-
| `stop.ts` | agent 응답 처리 후 마지막 assistant message snippet 저장 |
|
|
241
|
-
| `user-prompt-submit.ts` | turn 2부터 `lastSnippet + "\n\n" + prompt`를 retrieval query로 사용 (semantic + keyword 모두 적용) |
|
|
242
|
-
|
|
243
|
-
**흐름:**
|
|
244
|
-
```
|
|
245
|
-
[turn N] Stop hook → .last-response-{session_id}.json 저장
|
|
246
|
-
[turn N+1] UserPromptSubmit → snippet 읽어 retrievalQuery 구성 → 검색
|
|
247
|
-
DB 저장은 여전히 원래 prompt만
|
|
248
|
-
```
|
|
249
|
-
## 2026-03-04T07:55:25.443Z | 14342adf-b624-4e00-a224-481110cff2fb
|
|
250
|
-
- type: agent_response
|
|
251
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
252
|
-
커밋 완료했습니다.
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
4a9939c feat(retrieval): enrich query with last assistant response on turn 2+
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
5개 파일 변경 (100 추가, 18 삭제).
|
|
259
|
-
## 2026-03-04T07:57:07.138Z | 6f8a2fb2-4356-4d90-9d71-a2da52c30d95
|
|
260
|
-
- type: agent_response
|
|
261
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
262
|
-
Playwright MCP이 없어서 직접 API를 조회하겠습니다.
|
|
263
|
-
## 2026-03-04T07:57:07.164Z | 6aab52d5-4890-43e6-bb8a-b4bf72ce8078
|
|
264
|
-
- type: agent_response
|
|
265
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
266
|
-
API 데이터를 기반으로 분석합니다.
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## 분석 결과
|
|
271
|
-
|
|
272
|
-
### 1. 이벤트 구성 - 심각한 불균형
|
|
273
|
-
|
|
274
|
-
```
|
|
275
|
-
전체 이벤트: 1,587개
|
|
276
|
-
├─ tool_observation : 1,475개 (92.9%) ← 과도하게 많음
|
|
277
|
-
├─ user_prompt : 94개 (5.9%)
|
|
278
|
-
├─ agent_response : 16개 (1.0%) ← 너무 적음
|
|
279
|
-
└─ session_summary : 2개
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
**문제:** `agent_response`가 16개밖에 없습니다. 55개 세션 중 Stop hook이 정상 동작했다면 훨씬 많아야 합니다. Stop hook이 자주 실패하거나, transcript를 못 읽는 경우가 많은 것으로 보입니다.
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
### 2. Retrieval이 사실상 작동하지 않았음
|
|
287
|
-
|
|
288
|
-
```
|
|
289
|
-
totalQueries: 1 (55개 세션, 94개 user_prompt 중 딱 1번)
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
이전에 기본값이 `keyword`였을 때 keyword 검색 결과는 retrieval trace에 기록이 안 됩니다. 오늘 `hybrid`로 바꿨으니 앞으로는 trace가 쌓일 것입니다. 단, 유일한 trace를 보면:
|
|
293
|
-
|
|
294
|
-
```
|
|
295
|
-
fallback: primary → deep → scope-expanded → summary (4단계 모두 fallback)
|
|
296
|
-
confidence: "none"
|
|
297
|
-
score 범위: 0.40 ~ 0.60
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
primary 검색이 바로 실패하고 fallback 체인 전체를 탄 것입니다. `projectHash: null`로 찍혀 있어 **프로젝트 scope 매핑이 안 된 상태**에서 검색한 것이 원인으로 보입니다.
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
### 3. 메모리 레벨 승격이 전혀 없음
|
|
305
|
-
|
|
306
|
-
```
|
|
307
|
-
L0: 1,587개
|
|
308
|
-
L1~L4: 0개
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
모든 이벤트가 raw 상태(L0)에만 있습니다. 승격 파이프라인이 설계는 되어 있지만 실제로 동작하지 않고 있습니다.
|
|
312
|
-
|
|
313
|
-
---
|
|
314
|
-
|
|
315
|
-
### 4. 긍정적인 부분
|
|
316
|
-
|
|
317
|
-
```
|
|
318
|
-
vectorCount: 1,586 / 1,587 (99.9% 벡터화 완료)
|
|
319
|
-
embedding pending: 1건만 남음
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
벡터화는 잘 되고 있습니다.
|
|
323
|
-
|
|
324
|
-
---
|
|
325
|
-
|
|
326
|
-
## 요약
|
|
327
|
-
|
|
328
|
-
| 항목 | 상태 | 심각도 |
|
|
329
|
-
|------|------|--------|
|
|
330
|
-
| Retrieval 실제 사용 | 거의 0 (keyword → trace 미기록) | 중 |
|
|
331
|
-
| agent_response 저장 | 55세션 중 16건만 | 높음 |
|
|
332
|
-
| memory level 승격 | 전혀 없음 (L0 고착) | 중 |
|
|
333
|
-
| 벡터화 | 정상 | - |
|
|
334
|
-
| projectHash 매핑 | null (scope 미적용) | 높음 |
|
|
335
|
-
|
|
336
|
-
가장 먼저 봐야 할 것은 **agent_response가 왜 16건밖에 없는지** (Stop hook 실패 원인) 와 **projectHash가 왜 null인지** 입니다. `CLAUDE_MEMORY_DEBUG=1` 설정 후 Stop hook 로그를 확인해보시겠습니까?
|
|
337
|
-
## 2026-03-04T07:59:57.248Z | 9887ca4f-588f-4bba-9ae3-66fca78fbe69
|
|
338
|
-
- type: agent_response
|
|
339
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
340
|
-
## f4d5c120 프로젝트 분석
|
|
341
|
-
|
|
342
|
-
### 1. 이벤트 구성 - 이건 양호
|
|
343
|
-
|
|
344
|
-
```
|
|
345
|
-
전체: 10,000개 / 210세션
|
|
346
|
-
├─ tool_observation : 7,195개 (71.9%)
|
|
347
|
-
├─ agent_response : 1,971개 (19.7%) ✅ 정상
|
|
348
|
-
├─ user_prompt : 682개 (6.8%)
|
|
349
|
-
└─ session_summary : 152개 (1.5%)
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
저장 자체는 잘 되고 있습니다.
|
|
353
|
-
|
|
354
|
-
---
|
|
355
|
-
|
|
356
|
-
### 2. 핵심 문제 - 벡터화가 16%밖에 안 됨
|
|
357
|
-
|
|
358
|
-
```
|
|
359
|
-
전체 이벤트: 10,000개
|
|
360
|
-
벡터화 완료: 1,600개 (16%) ← 심각
|
|
361
|
-
embedding 대기: 8,485개
|
|
362
|
-
embedding 처리중: 384개
|
|
363
|
-
embedding 실패: 64개
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
**벡터가 없으면 semantic/hybrid 검색이 작동하지 않습니다.** 서버가 켜져 있어도 임베딩 처리 속도가 쌓이는 속도를 못 따라가거나 중단된 상태로 보입니다.
|
|
367
|
-
|
|
368
|
-
---
|
|
369
|
-
|
|
370
|
-
### 3. Retrieval 결과 - 거의 무용
|
|
371
|
-
|
|
372
|
-
```
|
|
373
|
-
210세션 / 682개 user_prompt → 실제 retrieval: 4번
|
|
374
|
-
avgCandidateCount: 0.25 (4번 중 3번은 결과 0개)
|
|
375
|
-
confidence: "none" (4번 모두)
|
|
376
|
-
fallback: 매번 4단계 전부 탐색
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
"redis" 쿼리 4번 중 1번만 결과 1개 나왔습니다. 벡터가 1,600개밖에 없으니 당연한 결과입니다.
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
### 결론
|
|
384
|
-
|
|
385
|
-
| 항목 | 상태 |
|
|
386
|
-
|------|------|
|
|
387
|
-
| 이벤트 저장 | ✅ 정상 (10,000개) |
|
|
388
|
-
| 벡터화 | ❌ 16% (8,485개 대기) |
|
|
389
|
-
| Semantic 검색 | ❌ 사실상 미작동 |
|
|
390
|
-
| Embedding 실패 | ⚠️ 64건 |
|
|
391
|
-
|
|
392
|
-
**지금 당장 의미있는 메모리 검색이 되려면 벡터화 backlog를 소진해야 합니다.** 서버(`npm run server` 또는 유사 명령)가 실행 중인지, 그리고 임베딩 워커가 처리 중인지 확인이 필요합니다. 서버가 계속 돌면서 8,485개를 소진하면 그때부터 검색 품질이 올라갑니다.
|
|
393
|
-
## 2026-03-04T08:04:01.949Z | 143af438-2265-47c0-a7ec-6a5e9eccf64b
|
|
394
|
-
- type: agent_response
|
|
395
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
396
|
-
`process` 명령어 구현도 확인합니다.
|
|
397
|
-
## 2026-03-04T08:04:01.961Z | b92e3e34-0ce9-4d40-ba62-83c90a8a7be0
|
|
398
|
-
- type: agent_response
|
|
399
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
400
|
-
`processPendingEmbeddings`가 모델을 어떻게 사용하는지 확인합니다.
|
|
401
|
-
## 2026-03-04T08:04:01.971Z | 273ce6b7-4876-4f17-a5e7-0cfa07d9d931
|
|
402
|
-
- type: agent_response
|
|
403
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
404
|
-
이제 정리가 됩니다.
|
|
405
|
-
|
|
406
|
-
---
|
|
407
|
-
|
|
408
|
-
## 수동 벡터화 명령어
|
|
409
|
-
|
|
410
|
-
```bash
|
|
411
|
-
claude-memory-layer process -p <프로젝트_경로>
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
f4d5c120 프로젝트 경로를 알아야 합니다.
|
|
415
|
-
## 2026-03-04T08:04:01.980Z | 311eb875-3062-4dd8-a49d-0ca5bf62b1df
|
|
416
|
-
- type: agent_response
|
|
417
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
418
|
-
확인됐습니다.
|
|
419
|
-
|
|
420
|
-
---
|
|
421
|
-
|
|
422
|
-
## 수동 벡터화 명령어
|
|
423
|
-
|
|
424
|
-
```bash
|
|
425
|
-
claude-memory-layer process -p /home/walter/workspace/hsmoa_backend_shopping_assistant/projects/shopping_assistant
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
8,485개를 처리해야 하므로 꽤 걸립니다. 백그라운드로 실행하려면:
|
|
429
|
-
|
|
430
|
-
```bash
|
|
431
|
-
nohup claude-memory-layer process -p /home/walter/workspace/hsmoa_backend_shopping_assistant/projects/shopping_assistant > /tmp/embed-process.log 2>&1 &
|
|
432
|
-
tail -f /tmp/embed-process.log
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
---
|
|
436
|
-
|
|
437
|
-
## 모델 로드 효율 확인 결과 - ✅ 1번만 로드됨
|
|
438
|
-
|
|
439
|
-
```
|
|
440
|
-
Embedder.initialize() (embedder.ts:29)
|
|
441
|
-
└─ if (this.initialized) return; ← 중복 초기화 방지
|
|
442
|
-
|
|
443
|
-
getDefaultEmbedder() (embedder.ts:146-151)
|
|
444
|
-
└─ 모듈 레벨 singleton → 프로세스 내 1개 인스턴스만 존재
|
|
445
|
-
|
|
446
|
-
MemoryService 생성자
|
|
447
|
-
└─ this.embedder = getDefaultEmbedder() ← singleton 주입
|
|
448
|
-
|
|
449
|
-
VectorWorker.processAll()
|
|
450
|
-
└─ 루프 내 embedder 재사용, initialize() 재호출 없음
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
`process` 명령 실행 시 모델은 맨 처음 첫 번째 텍스트 임베딩 시 **1번만 초기화**되고, 이후 8,485개는 warm 상태로 처리됩니다. `embedBatch()`도 동일하게 1회 초기화 후 32개 단위 배치로 반복합니다.
|
|
454
|
-
## 2026-03-04T08:05:56.403Z | 9e7cbaee-4b25-4324-9e0f-4e17c3297be2
|
|
455
|
-
- type: agent_response
|
|
456
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
457
|
-
아직 진행 전입니다. pending이 8,485 → 8,509으로 오히려 늘었습니다. `process` 명령을 아직 실행 안 하신 것 같습니다.
|
|
458
|
-
|
|
459
|
-
지금 바로 실행하시겠습니까?
|
|
460
|
-
|
|
461
|
-
```bash
|
|
462
|
-
nohup claude-memory-layer process -p /home/walter/workspace/hsmoa_backend_shopping_assistant/projects/shopping_assistant > /tmp/embed-process.log 2>&1 &
|
|
463
|
-
```
|
|
464
|
-
|
|
465
|
-
실행하시면 진행 상황을 `tail -f /tmp/embed-process.log` 로 확인하거나 다시 여기서 물어보시면 됩니다.
|
|
466
|
-
## 2026-03-04T08:07:09.155Z | 361dc352-2eef-4b77-897d-470298f7d408
|
|
467
|
-
- type: agent_response
|
|
468
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
469
|
-
`vectorWorker`가 null인 상태로 추정됩니다. CLI의 `getMemoryServiceForProject` 설정을 확인합니다.
|
|
470
|
-
## 2026-03-04T08:07:09.168Z | f21d4ce0-656f-4f60-ace9-87aae1852214
|
|
471
|
-
- type: agent_response
|
|
472
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
473
|
-
원인 찾았습니다. `process` 명령에 `service.initialize()` 호출이 빠져 있습니다.
|
|
474
|
-
|
|
475
|
-
```ts
|
|
476
|
-
// 현재 process 명령 (index.ts:440-454)
|
|
477
|
-
const service = getMemoryServiceForProject(projectPath);
|
|
478
|
-
// initialize() 없음!
|
|
479
|
-
const count = await service.processPendingEmbeddings();
|
|
480
|
-
// → vectorWorker가 null이라 항상 0 반환
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
`vectorWorker`는 `initialize()` 안에서만 생성됩니다. 다른 명령들(`import` 등)은 `service.initialize()`를 먼저 호출하는데 `process`만 빠진 버그입니다.
|
|
484
|
-
## 2026-03-04T08:07:09.177Z | 5c314ba8-8bb3-4c11-a0ae-e408a456fbd5
|
|
485
|
-
- type: agent_response
|
|
486
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
487
|
-
빌드 후 다시 실행하세요.
|
|
488
|
-
|
|
489
|
-
```bash
|
|
490
|
-
npm run build && claude-memory-layer process -p /home/walter/workspace/hsmoa_backend_shopping_assistant/projects/shopping_assistant
|
|
491
|
-
```
|
|
492
|
-
## 2026-03-04T08:23:48.616Z | 0f4f8143-eb72-4234-b666-648d067cc783
|
|
493
|
-
- type: agent_response
|
|
494
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
495
|
-
데이터를 먼저 분석하고 spec을 작성합니다.
|
|
496
|
-
## 2026-03-04T08:23:48.635Z | 602853cf-41b1-43e6-97d3-3747f5fddbe6
|
|
497
|
-
- type: agent_response
|
|
498
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
499
|
-
content가 비어 있습니다. PostToolUse hook과 실제 저장 구조를 확인합니다.
|
|
500
|
-
## 2026-03-04T08:23:48.650Z | 5417bc40-9993-43fc-befa-ddb80102d93b
|
|
501
|
-
- type: agent_response
|
|
502
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
503
|
-
충분한 데이터를 얻었습니다. 이제 스펙을 작성합니다.
|
|
504
|
-
## 2026-03-04T08:23:48.670Z | c16d2806-bd81-40aa-821f-41046633d729
|
|
505
|
-
- type: agent_response
|
|
506
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
507
|
-
완료했습니다.
|
|
508
|
-
|
|
509
|
-
```
|
|
510
|
-
specs/selective-tool-observation/
|
|
511
|
-
├── context.md — 실측 데이터 분석 및 도구별 가치 평가
|
|
512
|
-
├── spec.md — 필터 규칙, 환경변수, 판단 흐름
|
|
513
|
-
└── plan.md — 구현 단계, 코드 스니펫, 리스크
|
|
514
|
-
```
|
|
515
|
-
|
|
516
|
-
**핵심 결론:**
|
|
517
|
-
|
|
518
|
-
- Read / Grep / Glob / ToolSearch / WebFetch 는 blocklist 추가 → 즉시 **~30% 감소**
|
|
519
|
-
- Bash는 output이 100자 미만이면 스킵 → 추가 **~10% 감소**
|
|
520
|
-
- Write / Edit / Agent 는 항상 저장 (작업 결과 기록)
|
|
521
|
-
- 구현은 `post-tool-use.ts` 한 파일만 수정, 스키마 변경 없음
|
|
522
|
-
|
|
523
|
-
구현 바로 시작할까요?
|
|
524
|
-
## 2026-03-04T08:36:22.430Z | 60251c14-3a6f-43d0-9495-51b6a0d86205
|
|
525
|
-
- type: agent_response
|
|
526
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
527
|
-
`agent_response`와 stop.ts 로직을 더 자세히 봐야 합니다.
|
|
528
|
-
## 2026-03-04T08:36:22.456Z | d4e49df5-9ef6-4ca0-9521-acc6cb4c40ae
|
|
529
|
-
- type: agent_response
|
|
530
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
531
|
-
API가 content를 항상 빈 값으로 반환합니다. SQLite 직접 조회해서 실제 데이터를 확인합니다.
|
|
532
|
-
## 2026-03-04T08:36:22.467Z | 27264c8f-6cd8-4078-aebe-34aa41e4e5a0
|
|
533
|
-
- type: agent_response
|
|
534
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
535
|
-
DB 파일이 0 bytes입니다. 실제 데이터는 다른 경로에 있습니다.
|
|
536
|
-
## 2026-03-04T08:36:22.478Z | b74cbdd1-d139-47f2-add4-555f3fd2c98d
|
|
537
|
-
- type: agent_response
|
|
538
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
539
|
-
`events.sqlite`가 실제 DB입니다 (104MB).
|
|
540
|
-
## 2026-03-04T08:36:22.486Z | 3ac6b26f-6502-40fe-a48e-5836e5a8de64
|
|
541
|
-
- type: agent_response
|
|
542
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
543
|
-
실제 데이터 확보했습니다. 추가 분석합니다.
|
|
544
|
-
## 2026-03-04T08:36:22.494Z | 2ee780c2-066c-4de5-8e6a-42e52b319c6a
|
|
545
|
-
- type: agent_response
|
|
546
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
547
|
-
이제 전체 그림이 명확합니다.
|
|
548
|
-
|
|
549
|
-
---
|
|
550
|
-
|
|
551
|
-
## tool_observation 외 불필요 저장 데이터
|
|
552
|
-
|
|
553
|
-
### 1. `agent_response` - 중간 전환 메시지 (27%)
|
|
554
|
-
|
|
555
|
-
```
|
|
556
|
-
< 50 chars : 608개 (27%) ← 도구 체인 중간 메시지
|
|
557
|
-
50~200 chars: 587개 (26%) ← 짧은 중간 응답
|
|
558
|
-
200~1k chars: 758개 (34%) ← 실질적 내용 있음
|
|
559
|
-
> 1k chars : 269개 (12%) ← 확실히 가치 있음
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
저장된 실제 예:
|
|
563
|
-
```
|
|
564
|
-
[15] "**문제 찾았습니다!** 🎯"
|
|
565
|
-
[20] "이제 실제로 서버를 시작해보겠습니다:"
|
|
566
|
-
[44] "code-server 문제를 진단해보겠습니다. 먼저 현재 상태를 확인하겠습니다."
|
|
567
|
-
```
|
|
568
|
-
|
|
569
|
-
이것들은 Claude가 다음 도구를 쓰기 전에 내뱉는 **전환 문장**입니다. 단독으로는 retrieval 가치가 없고 노이즈만 됩니다. **min-length 150자** 필터 적용 시 ~53% (1,195개) 감소 가능합니다.
|
|
570
|
-
|
|
571
|
-
---
|
|
572
|
-
|
|
573
|
-
### 2. `user_prompt` - 쓰레기 입력 188개
|
|
574
|
-
|
|
575
|
-
```python
|
|
576
|
-
[1] '1', '2', '3' ← 메뉴 번호 선택
|
|
577
|
-
[2] 'go', 'go' ← 단순 실행 명령
|
|
578
|
-
[2] '커밋', '커밋' ← 한글 단어 (2자)
|
|
579
|
-
[2] '\x03\x03' ← Ctrl+C 입력까지 저장됨
|
|
580
|
-
```
|
|
581
|
-
|
|
582
|
-
**원인:** import 시 `shouldStorePrompt()` 필터가 적용되지 않아 transcript의 모든 user 메시지가 그대로 들어옴. Ctrl+C까지 저장된 것이 결정적 증거입니다.
|
|
583
|
-
|
|
584
|
-
---
|
|
585
|
-
|
|
586
|
-
## 전체 요약
|
|
587
|
-
|
|
588
|
-
| 타입 | 현재 | 제안 | 예상 감소 |
|
|
589
|
-
|------|------|------|-----------|
|
|
590
|
-
| tool_obs / Read | 2,285개 | blocklist | -31.7% |
|
|
591
|
-
| tool_obs / Grep | 1,338개 | blocklist | -18.6% |
|
|
592
|
-
| tool_obs / Glob+ToolSearch | 304개 | blocklist | -4.2% |
|
|
593
|
-
| agent_response < 150자 | ~1,200개 | min-length | -54% of agent_resp |
|
|
594
|
-
| user_prompt tiny (<15자) | 188개 | importer 필터 | -20% of user_prompt |
|
|
595
|
-
| **전체** | **10,536개** | → **약 5,800개** | **-45%** |
|
|
596
|
-
|
|
597
|
-
spec 업데이트할까요?
|
|
598
|
-
## 2026-03-04T08:39:32.119Z | ee0bcdd3-fac5-4e53-b010-9013948f6258
|
|
599
|
-
- type: agent_response
|
|
600
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
601
|
-
spec.md와 plan.md도 업데이트합니다.
|
|
602
|
-
## 2026-03-04T08:39:32.146Z | 70849cf8-6915-47c8-b74a-86d94d888420
|
|
603
|
-
- type: agent_response
|
|
604
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
605
|
-
3개 파일 모두 업데이트 완료했습니다.
|
|
606
|
-
|
|
607
|
-
**주요 변경 내용:**
|
|
608
|
-
|
|
609
|
-
- `context.md` — SQLite 직접 쿼리 기반 실측 데이터로 전면 갱신 (tool별 분포, agent_response 길이 분포, user_prompt 쓰레기 데이터 분석)
|
|
610
|
-
- `spec.md` — tool_observation에서 agent_response / user_prompt importer까지 3개 타입 전체 필터 규칙 포함
|
|
611
|
-
- `plan.md` — 3개 파일 각각 구현 코드 스니펫과 리스크 대응 포함
|
|
612
|
-
|
|
613
|
-
구현 바로 시작할까요?
|
|
614
|
-
## 2026-03-04T08:45:14.832Z | 15aaaefa-c249-4f0b-9cf4-3e802a3ca359
|
|
615
|
-
- type: agent_response
|
|
616
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
617
|
-
완료. 커밋 `6c84e70`
|
|
618
|
-
|
|
619
|
-
**변경 요약:**
|
|
620
|
-
- **post-tool-use.ts**: blocklist 9개 도구 추가 (Read/Grep/Glob 등), `ALWAYS_STORE_TOOLS` 집합, `hasSignificantOutput()` 필터 (min 100자 또는 stderr 존재)
|
|
621
|
-
- **stop.ts**: agent_response 150자 미만 스킵, 마지막 메시지는 예외 저장
|
|
622
|
-
- **session-history-importer.ts**: `isWorthStoringPrompt()` 필터 추가 — Ctrl+C, '1', 'go' 등 쓰레기 입력 스킵
|
|
623
|
-
- **types.ts**: `minOutputLength` 필드 추가
|
|
624
|
-
|
|
625
|
-
예상 효과: 전체 이벤트 저장량 **~55% 감소** (10,536 → ~4,693)
|
|
626
|
-
## 2026-03-04T08:45:58.758Z | 364d46be-af64-4962-a1f8-6324615db447
|
|
627
|
-
- type: agent_response
|
|
628
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
629
|
-
`forget` 명령어는 아직 미구현 상태입니다. DB 파일을 직접 삭제하고 재import하는 방법이 가장 확실합니다:
|
|
630
|
-
|
|
631
|
-
**1. DB 파일 위치 확인**
|
|
632
|
-
```bash
|
|
633
|
-
# 프로젝트 해시 기반 경로
|
|
634
|
-
ls ~/.claude-code/memory/projects/
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
**2. 특정 프로젝트 DB 초기화**
|
|
638
|
-
```bash
|
|
639
|
-
# 프로젝트 경로 확인 후 해당 DB 삭제
|
|
640
|
-
PROJECT_PATH="/home/walter/workspace/hsmoa_backend_shopping_assistant/projects/shopping_assistant"
|
|
641
|
-
PROJECT_HASH=$(echo -n "$PROJECT_PATH" | md5sum | cut -d' ' -f1)
|
|
642
|
-
rm ~/.claude-code/memory/projects/${PROJECT_HASH}/events.sqlite
|
|
643
|
-
rm -rf ~/.claude-code/memory/projects/${PROJECT_HASH}/vectors/ # LanceDB
|
|
644
|
-
```
|
|
645
|
-
|
|
646
|
-
**3. 재import**
|
|
647
|
-
```bash
|
|
648
|
-
claude-memory-layer import -p "$PROJECT_PATH"
|
|
649
|
-
```
|
|
650
|
-
|
|
651
|
-
---
|
|
652
|
-
|
|
653
|
-
프로젝트 해시를 직접 확인하려면:
|
|
654
|
-
```bash
|
|
655
|
-
ls ~/.claude-code/memory/projects/
|
|
656
|
-
```
|
|
657
|
-
|
|
658
|
-
실제 경로는 `~/.claude-code/memory/projects/<hash>/events.sqlite` 입니다. 삭제 후 `import` 하면 새 필터가 적용된 상태로 깨끗하게 재구성됩니다.
|
|
659
|
-
## 2026-03-04T08:47:31.151Z | d71098ab-4bd8-4c38-9e44-10cf9b58a9e5
|
|
660
|
-
- type: agent_response
|
|
661
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
662
|
-
네, 맞습니다. `/home/walter/.claude-code/memory/projects` 하위 폴더를 모두 지우면 모든 프로젝트의 메모리가 초기화됩니다.
|
|
663
|
-
|
|
664
|
-
```bash
|
|
665
|
-
rm -rf ~/.claude-code/memory/projects/*/
|
|
666
|
-
```
|
|
667
|
-
|
|
668
|
-
**지워지는 것:**
|
|
669
|
-
- `events.sqlite` — 모든 저장된 이벤트 (tool_observation, agent_response, user_prompt 등)
|
|
670
|
-
- `vectors/` — LanceDB 벡터 인덱스
|
|
671
|
-
|
|
672
|
-
**지워지지 않는 것 (보존됨):**
|
|
673
|
-
- hook 설정 (`~/.claude/settings.json`)
|
|
674
|
-
- 플러그인 자체 (`dist/`, `node_modules/`)
|
|
675
|
-
- 다른 세션 상태 파일들
|
|
676
|
-
|
|
677
|
-
재import 시 새로운 필터(blocklist, min-length 등)가 적용되므로, 기존 노이즈 데이터 없이 깨끗하게 시작할 수 있습니다. 해도 됩니다.
|
|
678
|
-
## 2026-03-04T08:54:07.025Z | 31ca2434-b591-4369-affa-3516124e21a8
|
|
679
|
-
- type: agent_response
|
|
680
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
681
|
-
완료. 커밋 `6c84e70`
|
|
682
|
-
|
|
683
|
-
**변경 요약:**
|
|
684
|
-
- **post-tool-use.ts**: blocklist 9개 도구 추가 (Read/Grep/Glob 등), `ALWAYS_STORE_TOOLS` 집합, `hasSignificantOutput()` 필터 (min 100자 또는 stderr 존재)
|
|
685
|
-
- **stop.ts**: agent_response 150자 미만 스킵, 마지막 메시지는 예외 저장
|
|
686
|
-
- **session-history-importer.ts**: `isWorthStoringPrompt()` 필터 추가 — Ctrl+C, '1', 'go' 등 쓰레기 입력 스킵
|
|
687
|
-
- **types.ts**: `minOutputLength` 필드 추가
|
|
688
|
-
|
|
689
|
-
예상 효과: 전체 이벤트 저장량 **~55% 감소** (10,536 → ~4,693)
|
|
690
|
-
## 2026-03-04T08:54:07.044Z | c77cf482-4a04-4bc9-851e-881a7976d027
|
|
691
|
-
- type: agent_response
|
|
692
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
693
|
-
`forget` 명령어는 아직 미구현 상태입니다. DB 파일을 직접 삭제하고 재import하는 방법이 가장 확실합니다:
|
|
694
|
-
|
|
695
|
-
**1. DB 파일 위치 확인**
|
|
696
|
-
```bash
|
|
697
|
-
# 프로젝트 해시 기반 경로
|
|
698
|
-
ls ~/.claude-code/memory/projects/
|
|
699
|
-
```
|
|
700
|
-
|
|
701
|
-
**2. 특정 프로젝트 DB 초기화**
|
|
702
|
-
```bash
|
|
703
|
-
# 프로젝트 경로 확인 후 해당 DB 삭제
|
|
704
|
-
PROJECT_PATH="/home/walter/workspace/hsmoa_backend_shopping_assistant/projects/shopping_assistant"
|
|
705
|
-
PROJECT_HASH=$(echo -n "$PROJECT_PATH" | md5sum | cut -d' ' -f1)
|
|
706
|
-
rm ~/.claude-code/memory/projects/${PROJECT_HASH}/events.sqlite
|
|
707
|
-
rm -rf ~/.claude-code/memory/projects/${PROJECT_HASH}/vectors/ # LanceDB
|
|
708
|
-
```
|
|
709
|
-
|
|
710
|
-
**3. 재import**
|
|
711
|
-
```bash
|
|
712
|
-
claude-memory-layer import -p "$PROJECT_PATH"
|
|
713
|
-
```
|
|
714
|
-
|
|
715
|
-
---
|
|
716
|
-
|
|
717
|
-
프로젝트 해시를 직접 확인하려면:
|
|
718
|
-
```bash
|
|
719
|
-
ls ~/.claude-code/memory/projects/
|
|
720
|
-
```
|
|
721
|
-
|
|
722
|
-
실제 경로는 `~/.claude-code/memory/projects/<hash>/events.sqlite` 입니다. 삭제 후 `import` 하면 새 필터가 적용된 상태로 깨끗하게 재구성됩니다.
|
|
723
|
-
## 2026-03-04T08:54:07.054Z | 2d6460dc-5975-4ff8-8458-ddb258321b3f
|
|
724
|
-
- type: agent_response
|
|
725
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
726
|
-
네, 맞습니다. `/home/walter/.claude-code/memory/projects` 하위 폴더를 모두 지우면 모든 프로젝트의 메모리가 초기화됩니다.
|
|
727
|
-
|
|
728
|
-
```bash
|
|
729
|
-
rm -rf ~/.claude-code/memory/projects/*/
|
|
730
|
-
```
|
|
731
|
-
|
|
732
|
-
**지워지는 것:**
|
|
733
|
-
- `events.sqlite` — 모든 저장된 이벤트 (tool_observation, agent_response, user_prompt 등)
|
|
734
|
-
- `vectors/` — LanceDB 벡터 인덱스
|
|
735
|
-
|
|
736
|
-
**지워지지 않는 것 (보존됨):**
|
|
737
|
-
- hook 설정 (`~/.claude/settings.json`)
|
|
738
|
-
- 플러그인 자체 (`dist/`, `node_modules/`)
|
|
739
|
-
- 다른 세션 상태 파일들
|
|
740
|
-
|
|
741
|
-
재import 시 새로운 필터(blocklist, min-length 등)가 적용되므로, 기존 노이즈 데이터 없이 깨끗하게 시작할 수 있습니다. 해도 됩니다.
|
|
742
|
-
## 2026-03-04T08:54:07.063Z | dc990ff9-5b0a-4656-88bd-a7e143ce5140
|
|
743
|
-
- type: agent_response
|
|
744
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
745
|
-
필터링이 잘 작동하고 있습니다! 이전과 비교해보면:
|
|
746
|
-
|
|
747
|
-
**이전 (필터 적용 전)**
|
|
748
|
-
| eventType | count | 비율 |
|
|
749
|
-
|-----------|-------|------|
|
|
750
|
-
| tool_observation | 7,212 | **68.5%** |
|
|
751
|
-
| agent_response | 2,222 | 21.1% |
|
|
752
|
-
| user_prompt | 948 | 9.0% |
|
|
753
|
-
| **합계** | **10,536** | |
|
|
754
|
-
|
|
755
|
-
**현재 (필터 적용 후)**
|
|
756
|
-
| eventType | count | 비율 |
|
|
757
|
-
|-----------|-------|------|
|
|
758
|
-
| tool_observation | 5 | **0.3%** |
|
|
759
|
-
| agent_response | 789 | 53.3% |
|
|
760
|
-
| user_prompt | 687 | 46.4% |
|
|
761
|
-
| **합계** | **1,481** | |
|
|
762
|
-
|
|
763
|
-
**결과 분석:**
|
|
764
|
-
- 전체 이벤트: 10,536 → 1,481 (**-86%**, 목표 55%보다 훨씬 좋음)
|
|
765
|
-
- tool_observation: 7,212 → 5 (거의 완전히 제거 — import 시 Bash 도구가 거의 없었던 것으로 보임)
|
|
766
|
-
- agent_response: 2,222 → 789 (min-length 필터로 ~65% 감소)
|
|
767
|
-
- user_prompt: 948 → 687 (쓰레기 입력 필터로 ~27% 감소)
|
|
768
|
-
|
|
769
|
-
**특이사항:** tool_observation이 5개만 남은 건 import된 transcript에 Bash 같은 allowlist 도구 사용이 거의 없었기 때문입니다. 실제 세션에서는 Bash stderr/stdout ≥100자인 경우 정상 저장됩니다.
|
|
770
|
-
|
|
771
|
-
vectorCount도 1,476으로 99.7% vectorized — 임베딩 backlog 문제도 해소되었습니다.
|
|
772
|
-
## 2026-03-04T08:57:04.958Z | 8410e4e7-58cb-4acd-ad21-f2626da1a8a7
|
|
773
|
-
- type: agent_response
|
|
774
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
775
|
-
모두 잘 작동하고 있습니다:
|
|
776
|
-
|
|
777
|
-
**체크 결과**
|
|
778
|
-
|
|
779
|
-
| 항목 | 상태 | 비고 |
|
|
780
|
-
|------|------|------|
|
|
781
|
-
| 저장 (tool_observation) | ✅ | Bash(pytest 결과), Edit → 정상 저장. Read/Grep → 필터링됨 |
|
|
782
|
-
| 저장 (user_prompt/agent_response) | ✅ | shopping_assistant 687/789개 |
|
|
783
|
-
| 시맨틱 데몬 | ✅ | socket 존재 (17:37 생성) |
|
|
784
|
-
| 벡터화 | ✅ | 1,476/1,481 (99.7%) |
|
|
785
|
-
| 검색 (retrieval) | ✅ | "pytest test" 쿼리 → 4개 결과, score 0.45~0.60 |
|
|
786
|
-
| confidence | ⚠️ | "none" — score가 threshold(0.4) 근처라 낮게 나옴 |
|
|
787
|
-
|
|
788
|
-
**confidence "none" 에 대해:** 현재 결과들이 keyword 매칭 기반(FTS5)으로 나오고 score가 0.4~0.6 구간입니다. 실제 user_prompt hook에서 retrieval 결과가 Claude에게 주입될 때는 동일하게 작동하므로 기능상 문제없습니다. 더 많은 데이터가 쌓일수록 정확도가 높아집니다.
|
|
789
|
-
|
|
790
|
-
전반적으로 정상 동작 중입니다.
|
|
791
|
-
## 2026-03-04T08:58:10.450Z | 25553ee4-fa3f-41eb-b0a0-6104634c7eb1
|
|
792
|
-
- type: agent_response
|
|
793
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
794
|
-
의미있는 사용 여부를 판단하는 핵심 지표들입니다:
|
|
795
|
-
|
|
796
|
-
---
|
|
797
|
-
|
|
798
|
-
## 1. Retrieval 품질 (가장 중요)
|
|
799
|
-
|
|
800
|
-
**확인 위치:** `/api/stats` → `retrievalTrace`
|
|
801
|
-
|
|
802
|
-
```json
|
|
803
|
-
"retrievalTrace": {
|
|
804
|
-
"totalQueries": 50+, // 검색 횟수 (많을수록 좋음)
|
|
805
|
-
"avgCandidateCount": 3~5, // 평균 검색 결과 수
|
|
806
|
-
"avgSelectedCount": 2~4, // 평균 실제 사용된 수
|
|
807
|
-
"selectionRate": 0.7+ // 선택률 70% 이상이면 양호
|
|
808
|
-
}
|
|
809
|
-
```
|
|
810
|
-
|
|
811
|
-
→ `totalQueries`가 늘어나고 `selectionRate`가 높으면 Claude가 실제로 메모리를 활용 중
|
|
812
|
-
|
|
813
|
-
---
|
|
814
|
-
|
|
815
|
-
## 2. accessCount (메모리 재사용률)
|
|
816
|
-
|
|
817
|
-
**확인 위치:** `/api/events` → 각 이벤트의 `accessCount`
|
|
818
|
-
|
|
819
|
-
```json
|
|
820
|
-
"accessCount": 3+ // 같은 메모리가 여러 번 검색에서 발견됨
|
|
821
|
-
```
|
|
822
|
-
|
|
823
|
-
→ 0이면 한 번도 retrieval에 안 걸린 것. 높을수록 유용한 메모리
|
|
824
|
-
|
|
825
|
-
---
|
|
826
|
-
|
|
827
|
-
## 3. 이벤트 타입 비율
|
|
828
|
-
|
|
829
|
-
**목표 비율 (현재):**
|
|
830
|
-
|
|
831
|
-
| 타입 | 좋은 상태 |
|
|
832
|
-
|------|-----------|
|
|
833
|
-
| tool_observation | **< 40%** (현재 0.3% ✅) |
|
|
834
|
-
| agent_response | 40~60% |
|
|
835
|
-
| user_prompt | 30~50% |
|
|
836
|
-
|
|
837
|
-
---
|
|
838
|
-
|
|
839
|
-
## 4. 벡터화 비율
|
|
840
|
-
|
|
841
|
-
```
|
|
842
|
-
vectorCount / eventCount ≈ 1.0 → 백로그 없음 ✅
|
|
843
|
-
```
|
|
844
|
-
|
|
845
|
-
→ 비율이 낮으면 `claude-memory-layer process -p <path>` 실행 필요
|
|
846
|
-
|
|
847
|
-
---
|
|
848
|
-
|
|
849
|
-
## 5. 현재 shopping_assistant 상태
|
|
850
|
-
|
|
851
|
-
```bash
|
|
852
|
-
curl "http://localhost:37777/api/stats?project=f4d5c120"
|
|
853
|
-
```
|
|
854
|
-
|
|
855
|
-
지금 당장 가장 의미있는 신호는 **세션을 실제로 사용하면서 `retrievalTrace.totalQueries`가 늘어나는지** 입니다. 현재 0인데, shopping_assistant 프로젝트에서 Claude Code로 작업을 시작하면 user_prompt hook이 발동되어 이 숫자가 올라가야 정상입니다.
|
|
856
|
-
## 2026-03-04T09:04:00.049Z | c3c72b1b-1044-477d-aafb-1db3cef68a3c
|
|
857
|
-
- type: agent_response
|
|
858
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
859
|
-
아니요, 현재 대시보드에는 표시되지 않습니다.
|
|
860
|
-
|
|
861
|
-
**현재 대시보드에 있는 것:**
|
|
862
|
-
- Retrieval Trace 목록 (개별 조회 이력)
|
|
863
|
-
- 기본 stats (eventCount, vectorCount, sessions)
|
|
864
|
-
|
|
865
|
-
**없는 것 (API에만 존재):**
|
|
866
|
-
- `retrievalTrace.totalQueries` (총 검색 횟수)
|
|
867
|
-
- `retrievalTrace.selectionRate` (선택률)
|
|
868
|
-
- `retrievalTrace.avgCandidateCount`
|
|
869
|
-
- `event.accessCount` (메모리별 재사용 횟수)
|
|
870
|
-
|
|
871
|
-
대시보드에 이 지표들을 추가하면 "잘 쓰이고 있는지" 한눈에 볼 수 있을 것 같습니다. 추가할까요?
|
|
872
|
-
|
|
873
|
-
예를 들면:
|
|
874
|
-
```
|
|
875
|
-
📊 Retrieval Quality
|
|
876
|
-
총 검색: 47회 | 평균 결과: 3.2개 | 선택률: 78%
|
|
877
|
-
|
|
878
|
-
🔥 Top Memories (accessCount 순)
|
|
879
|
-
[agent_response] "채팅 그래프에서 ManualQuestion..." × 12
|
|
880
|
-
[user_prompt] "pytest test_followup..." × 8
|
|
881
|
-
```
|
|
882
|
-
## 2026-03-04T09:08:34.374Z | f70de2c4-a215-491a-83fd-38e6568e31dc
|
|
883
|
-
- type: agent_response
|
|
884
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
885
|
-
모든 accessCount가 0이라 현재는 "No accessed memories yet"이 표시됩니다. 정상입니다 — shopping_assistant 세션을 실제로 사용하면 채워집니다.
|
|
886
|
-
|
|
887
|
-
하나 수정할 게 있습니다 — `stat-shared` DOM 요소를 제거했으니 JS에서 참조하는 부분도 처리해야 합니다:
|
|
888
|
-
## 2026-03-04T09:08:34.394Z | 716f650b-9011-4b51-ac8a-c0fac25b041a
|
|
889
|
-
- type: agent_response
|
|
890
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
891
|
-
완료. 커밋 `a8596fb`
|
|
892
|
-
|
|
893
|
-
**추가된 내용:**
|
|
894
|
-
|
|
895
|
-
| 항목 | 변경 |
|
|
896
|
-
|------|------|
|
|
897
|
-
| **Retrieval Queries 카드** | 상단 통계 카드에 총 retrieval 횟수 + 선택률(%) 표시 |
|
|
898
|
-
| **Top Accessed Events 섹션** | Memory Usage 카드에 accessCount 상위 5개 메모리 표시 (hits 수 강조) |
|
|
899
|
-
|
|
900
|
-
대시보드를 새로고침하면 반영됩니다. shopping_assistant 세션에서 실제 작업을 하면 retrieval 횟수가 올라가고 accessCount도 채워지기 시작합니다.
|
|
901
|
-
## 2026-03-04T09:10:41.707Z | 010338b6-b4d9-4f8b-8c26-1a870ec7c6b9
|
|
902
|
-
- type: agent_response
|
|
903
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
904
|
-
현재 `totalQueries = 0`이기 때문에 선택률은 표시되지 않습니다. 현재 카드에는:
|
|
905
|
-
|
|
906
|
-
- **숫자**: `0`
|
|
907
|
-
- **레이블**: `Retrieval Queries`
|
|
908
|
-
- **서브텍스트**: `no queries yet` (작은 회색 글씨)
|
|
909
|
-
|
|
910
|
-
선택률은 실제 retrieval이 발생한 후에만 표시됩니다:
|
|
911
|
-
```
|
|
912
|
-
47 ← totalQueries
|
|
913
|
-
Retrieval Queries
|
|
914
|
-
78% selection rate ← 이때 나타남
|
|
915
|
-
```
|
|
916
|
-
|
|
917
|
-
shopping_assistant 프로젝트에서 Claude Code로 작업을 시작하면 (user_prompt hook이 발동되면) retrieval이 발생하면서 숫자가 올라가고 선택률도 보이기 시작합니다. 지금은 정상입니다.
|
|
918
|
-
## 2026-03-04T09:12:04.850Z | cd26ecf2-02fb-45a3-8cb7-4c01841128c9
|
|
919
|
-
- type: agent_response
|
|
920
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
921
|
-
아니요, 재시작 불필요합니다.
|
|
922
|
-
|
|
923
|
-
**hook은 이미 live** — 매 user_prompt 제출마다 실행되므로, shopping_assistant 프로젝트에서 Claude Code로 작업하면 즉시 retrieval이 발생합니다.
|
|
924
|
-
|
|
925
|
-
**대시보드만 새로고침** — 브라우저에서 Refresh 버튼 클릭하면 최신 stats 반영됩니다.
|
|
926
|
-
|
|
927
|
-
다만 **새 세션을 시작하거나 이미 열린 세션에서 프롬프트를 입력**하면 바로 쌓이기 시작합니다. 재시작 없이도 됩니다.
|
|
928
|
-
## 2026-03-04T09:18:28.761Z | c42db907-e1fc-4e5e-99ad-3bac140a14f5
|
|
929
|
-
- type: agent_response
|
|
930
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
931
|
-
원인을 찾았습니다. `user-prompt-submit.ts`는 `keywordSearch()`를 직접 호출하는데, 이 경로는 `retrieval_traces` 테이블에 기록하지 않습니다. `recordRetrievalTrace()`는 `retrieveMemories()` 내부에서만 호출됩니다.
|
|
932
|
-
|
|
933
|
-
fix: `MemoryService`에 public wrapper 추가 후 hook에서 호출:
|
|
934
|
-
## 2026-03-04T09:18:28.798Z | 19f37f45-4147-4d11-a478-d9b8a1884146
|
|
935
|
-
- type: agent_response
|
|
936
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
937
|
-
빌드 성공. 이제 shopping_assistant에서 프롬프트를 입력하면 `retrieval_traces`에 기록됩니다.
|
|
938
|
-
|
|
939
|
-
동작 확인하려면 shopping_assistant에서 프롬프트 하나 입력 후:
|
|
940
|
-
```bash
|
|
941
|
-
sqlite3 ~/.claude-code/memory/projects/f4d5c120/events.sqlite "SELECT COUNT(*) FROM retrieval_traces;"
|
|
942
|
-
```
|
|
943
|
-
|
|
944
|
-
0 → 1 이상으로 바뀌면 정상입니다. 그 다음 대시보드 새로고침하면 Retrieval Queries 카드에 숫자가 올라옵니다.
|
|
945
|
-
|
|
946
|
-
커밋합니다:
|
|
947
|
-
## 2026-03-04T09:18:28.814Z | cc5b9968-6ade-4dda-9c8a-9c012e7621b9
|
|
948
|
-
- type: agent_response
|
|
949
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
950
|
-
커밋 `4c2ebea`
|
|
951
|
-
|
|
952
|
-
**요약:** `retrieval_traces`가 항상 0이었던 근본 원인은 hook이 `keywordSearch()` 직접 호출 경로를 사용해서 trace 기록을 우회하고 있었기 때문입니다. `recordQueryTrace()` wrapper를 추가해서 hook에서도 trace가 기록되도록 수정했습니다.
|
|
953
|
-
## 2026-03-04T09:23:19.708Z | fa5ceee0-8e19-4fc9-916b-c0bb060d2143
|
|
954
|
-
- type: agent_response
|
|
955
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
956
|
-
fix가 작동하고 있습니다. 방금 이 대화의 프롬프트("방금 다시 설치해서...")가 `retrieval_traces`에 기록됐습니다 — `confidence: none` (이 프로젝트는 아직 관련 메모리가 없어서).
|
|
957
|
-
|
|
958
|
-
**문제는 shopping_assistant 프로젝트** — 사용자가 shopping_assistant 디렉토리에서 Claude Code를 열고 프롬프트를 입력해야 그 프로젝트 DB에 trace가 쌓입니다. 지금 현재 세션은 `claude-memory-layer` 프로젝트에서 실행 중이라 `90701721` DB에만 기록됩니다.
|
|
959
|
-
|
|
960
|
-
shopping_assistant에서 테스트하려면:
|
|
961
|
-
1. `cd /home/walter/workspace/hsmoa_backend_shopping_assistant/projects/shopping_assistant`
|
|
962
|
-
2. Claude Code 새 세션 시작
|
|
963
|
-
3. 프롬프트 입력
|
|
964
|
-
|
|
965
|
-
그 다음 확인:
|
|
966
|
-
```bash
|
|
967
|
-
sqlite3 ~/.claude-code/memory/projects/f4d5c120/events.sqlite "SELECT COUNT(*) FROM retrieval_traces;"
|
|
968
|
-
```
|
|
969
|
-
## 2026-03-04T09:26:00.278Z | 6e917d53-3cc6-4663-b746-bb25c730bbf3
|
|
970
|
-
- type: agent_response
|
|
971
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
972
|
-
네, 맞습니다. 기존 세션도 재시작하면 됩니다.
|
|
973
|
-
|
|
974
|
-
**이유:** hook은 Claude Code 프로세스 실행 시마다 새로 `dist/hooks/*.js`를 불러오기 때문에, 기존 세션은 fix 이전 버전으로 계속 실행 중이었습니다. 재시작하면 새 버전이 적용됩니다.
|
|
975
|
-
## 2026-03-04T09:30:32.114Z | ab3a55e4-f00c-42d5-9103-74c92a782f06
|
|
976
|
-
- type: agent_response
|
|
977
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
978
|
-
계산 방식:
|
|
979
|
-
|
|
980
|
-
```
|
|
981
|
-
usefulRecallRate = helpful / totalEvaluated
|
|
982
|
-
```
|
|
983
|
-
|
|
984
|
-
**`totalEvaluated`와 `helpful`은 어떻게 채워지나:**
|
|
985
|
-
|
|
986
|
-
`stop.ts` (세션 종료 시) → `evaluateSessionHelpfulness()` 호출 → 해당 세션에서 retrieval된 메모리들이 실제 agent_response에 내용이 반영됐는지 자동 평가
|
|
987
|
-
|
|
988
|
-
**조건:**
|
|
989
|
-
- 세션이 종료(Stop hook 발동)되어야 평가가 실행됨
|
|
990
|
-
- retrieval된 메모리의 내용이 Claude 답변에 등장했으면 `helpful`, 없으면 평가 후 `unhelpful`
|
|
991
|
-
- retrieval 자체가 0건이면 `totalEvaluated = 0` → 대시보드에 `-` 표시
|
|
992
|
-
|
|
993
|
-
**요약하면:**
|
|
994
|
-
|
|
995
|
-
| 순서 | 시점 | 동작 |
|
|
996
|
-
|------|------|------|
|
|
997
|
-
| 1 | 프롬프트 입력 | retrieval 발생, 메모리 context 주입 |
|
|
998
|
-
| 2 | 세션 사용 중 | agent_response 생성 |
|
|
999
|
-
| 3 | 세션 종료 | Stop hook → helpfulness 자동 평가 |
|
|
1000
|
-
| 4 | 대시보드 조회 | `helpful / totalEvaluated` 비율 표시 |
|
|
1001
|
-
|
|
1002
|
-
즉, **세션을 완전히 닫아야** 비율이 업데이트됩니다. 현재 진행 중인 세션은 종료 전까지 반영 안 됩니다.
|
|
1003
|
-
## 2026-03-04T09:31:14.891Z | 6eb18034-67be-4290-9c80-483c5421441c
|
|
1004
|
-
- type: agent_response
|
|
1005
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
1006
|
-
아니요, `/clear`가 아니라 **Claude Code 자체를 종료(exit)할 때** Stop hook이 발동됩니다.
|
|
1007
|
-
|
|
1008
|
-
| 동작 | Stop hook 발동? |
|
|
1009
|
-
|------|----------------|
|
|
1010
|
-
| `/clear` (대화 초기화) | ❌ 안됨 |
|
|
1011
|
-
| `exit` 또는 Ctrl+D (종료) | ✅ 됨 |
|
|
1012
|
-
| 창 닫기 | ✅ 됨 (보통) |
|
|
1013
|
-
| 새 세션 시작 | ❌ 이전 세션 평가 안됨 |
|
|
1014
|
-
|
|
1015
|
-
즉 shopping_assistant에서 실제로 작업하다가 **Claude Code를 exit**하면 그 세션의 helpfulness가 평가되어 Useful Recall Rate가 업데이트됩니다.
|
|
1016
|
-
## 2026-03-04T09:32:28.792Z | bd644a22-1114-4a5c-a80c-c204bc3e7ef9
|
|
1017
|
-
- type: agent_response
|
|
1018
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
1019
|
-
객관적으로 **현재 방식(Stop hook)이 가장 적합**합니다.
|
|
1020
|
-
|
|
1021
|
-
---
|
|
1022
|
-
|
|
1023
|
-
**각 시점별 트레이드오프:**
|
|
1024
|
-
|
|
1025
|
-
| 시점 | 장점 | 단점 |
|
|
1026
|
-
|------|------|------|
|
|
1027
|
-
| **Stop (현재)** | 세션 전체 컨텍스트 확보, 자연스러운 종료점 | exit 안 하면 평가 안됨 |
|
|
1028
|
-
| `/clear` | 자주 발동 | 대화만 초기화, 작업 중간이라 판단 불완전 |
|
|
1029
|
-
| 매 turn (real-time) | 즉시 반영 | 단편적 판단, 비용 증가 |
|
|
1030
|
-
| 타이머 (N분마다) | exit 안해도 동작 | 불필요한 평가, 세션 도중 정확도 낮음 |
|
|
1031
|
-
|
|
1032
|
-
---
|
|
1033
|
-
|
|
1034
|
-
**개선할 점이 있다면:**
|
|
1035
|
-
|
|
1036
|
-
현재 문제는 **세션을 exit하지 않고 그냥 창을 닫거나 터미널이 죽는 경우** Stop hook이 발동 안 될 수 있다는 점입니다.
|
|
1037
|
-
|
|
1038
|
-
실용적 개선안:
|
|
1039
|
-
```
|
|
1040
|
-
세션 시작 시 (UserPromptSubmit) →
|
|
1041
|
-
이전 세션 중 미평가된 세션이 있으면 그때 평가
|
|
1042
|
-
```
|
|
1043
|
-
|
|
1044
|
-
즉 "다음 세션 첫 turn에 이전 미완료 세션을 소급 평가"하는 방식이 실용적입니다. 이렇게 하면 비정상 종료도 커버됩니다.
|
|
1045
|
-
|
|
1046
|
-
구현할까요?
|
|
1047
|
-
## 2026-03-04T09:35:29.099Z | 00cbcb40-6082-4791-b824-0ad27b7fd1dc
|
|
1048
|
-
- type: agent_response
|
|
1049
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
1050
|
-
아니요, **다른 세션**입니다.
|
|
1051
|
-
|
|
1052
|
-
예시:
|
|
1053
|
-
```
|
|
1054
|
-
[세션 A] 작업하다가 터미널 그냥 닫음 → Stop hook 미발동, 미평가
|
|
1055
|
-
[세션 B] 다음날 Claude Code 새로 열고 첫 프롬프트 입력
|
|
1056
|
-
→ UserPromptSubmit hook에서 "세션 A가 미평가" 감지
|
|
1057
|
-
→ 세션 A 소급 평가 실행
|
|
1058
|
-
```
|
|
1059
|
-
|
|
1060
|
-
`/clear`는 같은 세션 ID를 유지하므로 해당 없습니다.
|
|
1061
|
-
|
|
1062
|
-
구현하면 될까요?
|
|
1063
|
-
## 2026-03-04T09:38:58.429Z | f905117a-82f8-4b35-982c-aa26fffeb89f
|
|
1064
|
-
- type: agent_response
|
|
1065
|
-
- session: 8b808e43-9f19-45c6-a657-6689f11520d2
|
|
1066
|
-
커밋 `a204f49`
|
|
1067
|
-
|
|
1068
|
-
이제 Claude Code를 강제 종료하거나 터미널이 죽어도, **다음 세션 첫 프롬프트 입력 시** 미평가 세션들이 자동으로 소급 평가됩니다. Useful Recall Rate가 더 정확하게 반영됩니다.
|
|
1069
|
-
## 2026-03-04T09:48:24.789Z | 6664485c-847c-42ff-896f-6960ca03d1af
|
|
1070
|
-
- type: agent_response
|
|
1071
|
-
- session: 71462bbf-6d77-4cc7-b8d1-f126ac3dc034
|
|
1072
|
-
Refresh 버튼도 `/api/stats` 포함해서 모든 데이터를 다 다시 가져오는 구조예요 — full page reload랑 동일하게 동작해요.
|
|
1073
|
-
|
|
1074
|
-
그러면 아마 그때 우연히 embedding worker가 처리 중이어서 vectorCount가 일시적으로 낮게 보였을 가능성이 높아요. Worker가 batch로 처리하다 보니 순간적으로 eventCount - vectorCount 차이가 생길 수 있거든요.
|
|
1075
|
-
|
|
1076
|
-
현재는 1587 vs 1586으로 거의 동일하니 정상이에요!
|
|
1077
|
-
## 2026-03-04T10:06:44.938Z | 822d55f5-4d7b-48db-b8e7-fbcd4bbbb434
|
|
1078
|
-
- type: agent_response
|
|
1079
|
-
- session: 71462bbf-6d77-4cc7-b8d1-f126ac3dc034
|
|
1080
|
-
차이가 **125개** (1601 - 1476)네요. 오늘 날짜에 1601개가 한꺼번에 들어왔고, agent_response/user_prompt가 많은 걸 보면 임포트된 프로젝트 같아요. Vector worker가 처리 중이거나 stuck된 상황일 수 있어요.
|
|
1081
|
-
## 2026-03-04T10:21:49.709Z | 7e163a48-1603-4332-b271-6d8ea83ada79
|
|
1082
|
-
- type: agent_response
|
|
1083
|
-
- session: 71462bbf-6d77-4cc7-b8d1-f126ac3dc034
|
|
1084
|
-
원인 발견! `utils.ts`에서 dashboard API는 항상 **`readOnly: true`** 로 MemoryService를 생성하고, `memory-service.ts`에서 readOnly면 VectorWorker를 시작하지 않아요.
|
|
1085
|
-
|
|
1086
|
-
그럼 `f4d5c120` 프로젝트의 VectorWorker는 누가 돌리는 걸까요? semantic-daemon이 그 프로젝트를 처리한 적이 있는지 확인해요.
|
|
1087
|
-
## 2026-03-04T10:21:49.738Z | 2f28ad07-5e7a-40f0-8354-7ce25ed59c76
|
|
1088
|
-
- type: agent_response
|
|
1089
|
-
- session: 71462bbf-6d77-4cc7-b8d1-f126ac3dc034
|
|
1090
|
-
두 곳 다 `readOnly: true`예요! semantic daemon도, dashboard도. 그럼 VectorWorker는 오직 hooks에서만 write 모드로 실행돼요.
|
|
1091
|
-
|
|
1092
|
-
`f4d5c120` 프로젝트는 아마 session-history-importer로 데이터를 임포트했고, 그 프로세스가 끝나면서 137개가 미처리 상태로 남은 거예요. 지금 그 프로젝트의 Claude 세션이 활성화되지 않으면 처리할 프로세스가 없는 거죠.
|
|
1093
|
-
## 2026-03-04T10:21:49.749Z | a6b9cfa9-f8f0-405b-8694-75fc9f6e4658
|
|
1094
|
-
- type: agent_response
|
|
1095
|
-
- session: 71462bbf-6d77-4cc7-b8d1-f126ac3dc034
|
|
1096
|
-
원인이 완전히 파악됐어요.
|
|
1097
|
-
|
|
1098
|
-
**VectorWorker가 실행되는 경우:**
|
|
1099
|
-
- CLI 명령어 실행 시 (`getMemoryServiceForProject` → write mode)
|
|
1100
|
-
|
|
1101
|
-
**VectorWorker가 실행되지 않는 경우:**
|
|
1102
|
-
- Dashboard API → `readOnly: true`
|
|
1103
|
-
- Semantic daemon → `readOnly: true`
|
|
1104
|
-
- `user-prompt-submit` hook → `lightweightMode: true` (임베더/벡터 완전 생략)
|
|
1105
|
-
|
|
1106
|
-
결국 `f4d5c120` 프로젝트의 137개는 **아무도 처리 안 하는 상태**예요. session-start hook 확인해볼게요.
|
|
1107
|
-
## 2026-03-04T10:21:49.760Z | b5d0c44f-b89f-4f41-8612-4a2562038276
|
|
1108
|
-
- type: agent_response
|
|
1109
|
-
- session: 71462bbf-6d77-4cc7-b8d1-f126ac3dc034
|
|
1110
|
-
결론이 나왔어요.
|
|
1111
|
-
|
|
1112
|
-
**모든 hooks가 `lightweightMode: true`** 로 실행되고 있어요. VectorWorker를 실행하는 경로가 CLI 명령어밖에 없어요.
|
|
1113
|
-
|
|
1114
|
-
`f4d5c120` 프로젝트에 137개가 쌓인 이유:
|
|
1115
|
-
- session-history-importer 같은 CLI로 데이터를 임포트했을 때 VectorWorker가 일부만 처리하고 프로세스가 종료됨
|
|
1116
|
-
- 그 이후로는 아무 CLI도 안 돌아서 나머지 137개가 pending 상태로 남아있음
|
|
1117
|
-
|
|
1118
|
-
**지금 당장 처리하는 방법:**
|
|
1119
|
-
## 2026-03-04T10:21:49.769Z | 9ea6ded5-4833-4c42-bb93-4f181cb6dfbc
|
|
1120
|
-
- type: agent_response
|
|
1121
|
-
- session: 71462bbf-6d77-4cc7-b8d1-f126ac3dc034
|
|
1122
|
-
완전히 해결됐어요! `totalEvents: 1643 = vectorCount: 1643`, pending: 0.
|
|
1123
|
-
|
|
1124
|
-
103개만 처리됐다고 나왔는데 전부 맞은 이유는, 그 사이에 새 이벤트가 더 들어와서 1643까지 늘었고 그것도 같이 처리된 거예요.
|
|
1125
|
-
|
|
1126
|
-
---
|
|
1127
|
-
|
|
1128
|
-
**근본 원인 정리:**
|
|
1129
|
-
- 모든 hooks/daemon/dashboard가 `readOnly: true` 또는 `lightweightMode: true`로 실행되어 VectorWorker가 실행되지 않음
|
|
1130
|
-
- CLI `process` 명령어로만 수동 처리 가능
|
|
1131
|
-
- session-history-importer 같은 bulk import 후 프로세스가 종료되면 미처리 항목이 남음
|
|
1132
|
-
|
|
1133
|
-
**장기적 개선 방향이 필요하면:**
|
|
1134
|
-
dashboard 서버가 시작될 때 해당 프로젝트의 embedding backlog를 백그라운드로 처리하는 로직을 추가하거나, session-start hook에서 backlog가 있을 때 VectorWorker를 트리거하는 방법을 고려해볼 수 있어요.
|
|
1135
|
-
## 2026-03-04T10:45:34.213Z | 442c303d-a351-4dae-bfe0-6db30a88a225
|
|
1136
|
-
- type: agent_response
|
|
1137
|
-
- session: e3c1fe2b-c018-4532-86d5-7cdd467408f0
|
|
1138
|
-
Build passes. All 4 changes are done:
|
|
1139
|
-
|
|
1140
|
-
1. **`memory-service.ts`**: Added `embeddingOnly?: boolean` to `MemoryServiceConfig`, private field, and constructor init. The `if (!this.embeddingOnly)` guard skips GraduationWorker and SyncWorker startup.
|
|
1141
|
-
|
|
1142
|
-
2. **`semantic-daemon.ts`**: Changed `readOnly: true` → `readOnly: false, embeddingOnly: true` so the daemon now starts VectorWorker to drain the embedding outbox.
|
|
1143
|
-
|
|
1144
|
-
3. **`semantic-daemon-client.ts`**: Exported `ensureDaemonRunning` (was previously private).
|
|
1145
|
-
|
|
1146
|
-
4. **`session-start.ts`**: Added fire-and-forget `ensureDaemonRunning()` so the daemon (and its VectorWorker) starts immediately when a session begins, without waiting for the first user prompt.
|
|
1147
|
-
## 2026-03-04T10:48:04.922Z | e14d8b13-dfdb-4e1e-a340-8b037d53dd43
|
|
1148
|
-
- type: agent_response
|
|
1149
|
-
- session: e3c1fe2b-c018-4532-86d5-7cdd467408f0
|
|
1150
|
-
Committed as `b865ab9`.
|
|
1151
|
-
## 2026-03-04T10:58:54.146Z | b61f8d01-e4c3-4669-be31-8e277d47401b
|
|
1152
|
-
- type: agent_response
|
|
1153
|
-
- session: e3c1fe2b-c018-4532-86d5-7cdd467408f0
|
|
1154
|
-
3개 파일 생성 완료:
|
|
1155
|
-
|
|
1156
|
-
```
|
|
1157
|
-
specs/optional-duckdb/
|
|
1158
|
-
├── context.md ← 에러 원인 분석
|
|
1159
|
-
├── spec.md ← 요구사항 정의
|
|
1160
|
-
└── plan.md ← 구현 계획
|
|
1161
|
-
```
|
|
1162
|
-
|
|
1163
|
-
**문제 요약:**
|
|
1164
|
-
- `duckdb@0.10.2`는 Node.js v24 (ABI v137)용 pre-built binary가 없음
|
|
1165
|
-
- source 컴파일 fallback도 최신 Clang의 C++ template 문법 거부로 실패
|
|
1166
|
-
- DuckDB는 **analytics 전용** (대시보드 통계)이고 핵심 기능은 SQLite/LanceDB 사용
|
|
1167
|
-
|
|
1168
|
-
**해결 방향 (plan.md):**
|
|
1169
|
-
1. `package.json`에서 `duckdb`를 `optionalDependencies`로 이동 → 설치 실패해도 npm이 중단하지 않음
|
|
1170
|
-
2. `db-wrapper.ts`의 `import duckdb from 'duckdb'` → dynamic import + `isDuckDBAvailable()` 함수
|
|
1171
|
-
3. `memory-service.ts`에서 DuckDB 가용성 체크 후 analytics 비활성화 graceful degradation
|
|
1172
|
-
4. `edge-repo.ts`, `server/api/utils.ts` 등 직접 import하는 파일들도 동일 처리
|
|
1173
|
-
|
|
1174
|
-
구현을 바로 진행할까요?
|
|
1175
|
-
## 2026-03-04T11:01:16.318Z | acfb6e38-91b7-4cb5-ad3c-70c4a16578d7
|
|
1176
|
-
- type: agent_response
|
|
1177
|
-
- session: e3c1fe2b-c018-4532-86d5-7cdd467408f0
|
|
1178
|
-
코드를 보면 답이 명확합니다.
|
|
1179
|
-
|
|
1180
|
-
**DuckDB가 하는 일 2가지:**
|
|
1181
|
-
|
|
1182
|
-
1. **`edge-repo.ts`의 edges 테이블** — `db-wrapper.ts`가 DuckDB API를 감싸지만, 쿼리는 전부 표준 SQL (`INSERT`, `SELECT WITH CTE`, `JOIN`). SQLite가 완벽히 지원함. 심지어 주석에도 `"DuckDB doesn't return affected rows easily"`라고 적혀있을 정도로 DuckDB가 오히려 불편함.
|
|
1183
|
-
|
|
1184
|
-
2. **Analytics Store (SyncWorker)** — SQLite 데이터를 DuckDB로 복사해서 대시보드 집계 쿼리 실행. 근데 `server/api/utils.ts`는 이미 `analyticsEnabled: false`로 DuckDB를 끄고 있음. 실제로 대부분의 경로가 SQLite만 쓰고 있음.
|
|
1185
|
-
|
|
1186
|
-
**결론: DuckDB 완전 제거 가능.** `db-wrapper.ts`를 `better-sqlite3`으로 교체하고 edges 테이블을 SQLite에 올리면 끝. `better-sqlite3`은 이미 dependency에 있음.
|
|
1187
|
-
|
|
1188
|
-
specs 파일을 업데이트하겠습니다:
|
|
1189
|
-
## 2026-03-04T11:01:16.330Z | b49716e3-71db-450d-b05d-7706e75fde14
|
|
1190
|
-
- type: agent_response
|
|
1191
|
-
- session: e3c1fe2b-c018-4532-86d5-7cdd467408f0
|
|
1192
|
-
specs 업데이트 완료.
|
|
1193
|
-
|
|
1194
|
-
---
|
|
1195
|
-
|
|
1196
|
-
**결론: DuckDB는 필요 없습니다.**
|
|
1197
|
-
|
|
1198
|
-
코드를 보면:
|
|
1199
|
-
- `edge-repo.ts`의 SQL 쿼리는 표준 SQL — SQLite가 100% 동일하게 지원
|
|
1200
|
-
- Analytics Store는 이미 대부분의 경로에서 `analyticsEnabled: false`로 꺼져있음
|
|
1201
|
-
- `better-sqlite3`이 이미 있으므로 새 dependency 추가도 없음
|
|
1202
|
-
|
|
1203
|
-
**제거하면 얻는 것:**
|
|
1204
|
-
- Node.js v24+ 포함 모든 환경에서 설치 성공
|
|
1205
|
-
- `npm install` 속도 대폭 향상 (native addon 빌드 없음)
|
|
1206
|
-
- 아키텍처 단순화 (SQLite 하나로 통합)
|
|
1207
|
-
|
|
1208
|
-
구현 진행할까요?
|
|
1209
|
-
## 2026-03-04T12:32:18.900Z | 5775641e-d0ee-429d-addd-f7adf271753d
|
|
1210
|
-
- type: agent_response
|
|
1211
|
-
- session: e3c1fe2b-c018-4532-86d5-7cdd467408f0
|
|
1212
|
-
완료. `cb93e43`으로 커밋됐습니다.
|
|
1213
|
-
|
|
1214
|
-
**요약:**
|
|
1215
|
-
- `db-wrapper.ts`: DuckDB 콜백 API → `better-sqlite3` 동기 API로 교체 (같은 Promise 인터페이스 유지)
|
|
1216
|
-
- `memory-service.ts`: `analyticsStore` 초기화/종료, `SyncWorker` 블록 제거
|
|
1217
|
-
- `package.json`: `duckdb` 제거
|
|
1218
|
-
|
|
1219
|
-
**결과**: `event-store.ts`, `shared-event-store.ts`, `edge-repo.ts` 등 `db-wrapper.ts`를 쓰는 모든 파일이 자동으로 SQLite로 전환됐고, Node.js v24+ 포함 모든 환경에서 `npm install` 성공합니다.
|
|
1220
|
-
## 2026-03-04T12:44:56.860Z | 2bf64dfb-6830-4186-a7c5-b295ffd439f9
|
|
1221
|
-
- type: agent_response
|
|
1222
|
-
- session: 2fe5b2e5-83ea-4778-b09b-5264c550ea86
|
|
1223
|
-
이제 대시보드 데이터와 코드베이스를 분석했습니다. 핵심 문제들을 파악하고 개선안을 설계하겠습니다.
|
|
1224
|
-
|
|
1225
|
-
**주요 발견:**
|
|
1226
|
-
- 1,587 이벤트가 **전부 L0** - 졸업 파이프라인 미작동
|
|
1227
|
-
- **55 세션 중 retrieval trace가 단 1개** - 메모리가 거의 주입되지 않음
|
|
1228
|
-
- 이벤트의 **93%가 tool observation** - 노이즈 과다
|
|
1229
|
-
- 세션 요약이 **55개 세션 중 단 2개**만 생성
|
|
1230
|
-
## 2026-03-04T12:44:56.874Z | 1c0af921-7106-4178-be6c-547dc11308b0
|
|
1231
|
-
- type: agent_response
|
|
1232
|
-
- session: 2fe5b2e5-83ea-4778-b09b-5264c550ea86
|
|
1233
|
-
이제 실제 데이터로 정확한 분석이 됐습니다. 핵심 발견:
|
|
1234
|
-
|
|
1235
|
-
- `adherence: True/False`가 이벤트에 기록됨 → 검색은 **실제로 실행되고 있음**
|
|
1236
|
-
- 하지만 retrieval trace는 **단 1개** → trace 기록 자체가 실패하고 있음
|
|
1237
|
-
- ONNX/embedding 모델 오류 반복 발생
|
|
1238
|
-
- 이것이 cascade failure의 시작점
|
|
1239
|
-
|
|
1240
|
-
specs 폴더를 만들고 세 파일을 작성합니다.
|
|
1241
|
-
## 2026-03-04T12:44:56.884Z | a235d394-8c64-4e5f-baf0-d625adfeac2b
|
|
1242
|
-
- type: agent_response
|
|
1243
|
-
- session: 2fe5b2e5-83ea-4778-b09b-5264c550ea86
|
|
1244
|
-
세 파일 모두 작성 완료했습니다.
|
|
1245
|
-
|
|
1246
|
-
---
|
|
1247
|
-
|
|
1248
|
-
## 생성된 스펙
|
|
1249
|
-
|
|
1250
|
-
`specs/memory-utilization-improvements/`
|
|
1251
|
-
|
|
1252
|
-
### 핵심 진단 (f4d5c120 실데이터 기반)
|
|
1253
|
-
|
|
1254
|
-
**Cascade Failure 구조가 핵심 문제:**
|
|
1255
|
-
|
|
1256
|
-
```
|
|
1257
|
-
Trace 기록 실패 → access_count 미증가 → Graduation 미발생
|
|
1258
|
-
→ 고품질 메모리 없음 → Helpfulness 측정 불가 → 개선 피드백 단절
|
|
1259
|
-
```
|
|
1260
|
-
|
|
1261
|
-
---
|
|
1262
|
-
|
|
1263
|
-
### 7가지 개선 항목
|
|
1264
|
-
|
|
1265
|
-
| 우선순위 | ID | 개선 내용 | 예상 효과 |
|
|
1266
|
-
|---------|-----|---------|---------|
|
|
1267
|
-
| **P0** | IMP-01 | Retrieval Trace **동기** 기록으로 변경 | Trace 기록률 0% → 95%+ |
|
|
1268
|
-
| **P0** | IMP-02 | Tool Observation 선택적 저장 (Read/Glob 제외, Bash 오류만) | 저장량 60~70% 감소 |
|
|
1269
|
-
| **P1** | IMP-03 | Session-start에서 이전 세션 요약 백필 | 요약 생성률 5% → 80%+ |
|
|
1270
|
-
| **P1** | IMP-04 | `graduation --repair` CLI로 기존 L0 이벤트 승격 | L1+ 비율 0% → 10%+ |
|
|
1271
|
-
| **P1** | IMP-05 | Embedding 모델 헬스체크 + 자동 폴백 | ONNX 오류 시 키워드 모드 전환 |
|
|
1272
|
-
| **P2** | IMP-06 | Stop hook에서 Helpfulness 자동 평가 | 피드백 루프 활성화 |
|
|
1273
|
-
| **P2** | IMP-07 | 메모리 컨텍스트 포맷 구조화 | Claude의 메모리 인식률 향상 |
|
|
1274
|
-
|
|
1275
|
-
---
|
|
1276
|
-
|
|
1277
|
-
**가장 먼저 해야 할 것**: IMP-01 — `user-prompt-submit.ts`에서 trace INSERT가 stdout 출력 전에 **동기적으로** 실행되도록 수정. 이것 하나만 고쳐도 Graduation → Helpfulness 전체 파이프라인이 살아납니다.
|
|
1278
|
-
## 2026-03-04T12:50:23.597Z | 07d8383b-c503-463e-ab38-b496269ad6c2
|
|
1279
|
-
- type: agent_response
|
|
1280
|
-
- session: 2fe5b2e5-83ea-4778-b09b-5264c550ea86
|
|
1281
|
-
구현 완료. 요약:
|
|
1282
|
-
|
|
1283
|
-
---
|
|
1284
|
-
|
|
1285
|
-
## 구현된 수정 사항
|
|
1286
|
-
|
|
1287
|
-
### IMP-01 ✅ `recordQueryTrace` projectHash 버그 수정 (P0)
|
|
1288
|
-
**`src/services/memory-service.ts`**
|
|
1289
|
-
- `recordQueryTrace()`에 `projectHash: this.projectHash || undefined` 추가
|
|
1290
|
-
- 이제 traces가 올바른 project hash와 함께 저장됨 → 대시보드에서 조회 가능
|
|
1291
|
-
- **기대 효과**: retrieval trace 수 0 → 검색 실행 횟수 수준으로 증가
|
|
1292
|
-
|
|
1293
|
-
### IMP-02 ✅ Bash Tool Observation 스마트 필터링 (P0)
|
|
1294
|
-
**`src/hooks/post-tool-use.ts`**
|
|
1295
|
-
- `isBashSignificant()` 함수 추가: stderr > 20자 OR 중요 키워드(error, failed, test passed 등) OR 출력 > 800자
|
|
1296
|
-
- Bash 출력의 80%+ 이상이 저장에서 제외됨 → tool observation 비율 93% → 40~50% 예상
|
|
1297
|
-
|
|
1298
|
-
### IMP-03 ✅ Stop Hook - Helpfulness + 세션 요약 (P1)
|
|
1299
|
-
**`src/hooks/stop.ts`**, **`src/services/memory-service.ts`**
|
|
1300
|
-
- `evaluateSessionHelpfulness()` 호출 추가
|
|
1301
|
-
- `generateSessionSummary()` 추가: 규칙 기반 요약 생성 (날짜, 주요 작업, 사용 툴, 오류 수)
|
|
1302
|
-
- LLM 없이 동작 → 빠르고 안정적
|
|
1303
|
-
|
|
1304
|
-
### IMP-04 ✅ Session-start 백필 (P1)
|
|
1305
|
-
**`src/hooks/session-start.ts`**, **`src/core/sqlite-event-store.ts`**
|
|
1306
|
-
- `backfillMissingSummaries()`: 세션 시작 시 미요약 이전 세션 최대 5개 요약 생성
|
|
1307
|
-
- `getSessionsWithoutSummary()` SQL 쿼리 추가
|
|
1308
|
-
- 기존 40 세션 중 38개에 요약이 생성될 것
|
|
1309
|
-
|
|
1310
|
-
---
|
|
1311
|
-
|
|
1312
|
-
다음 번 Claude Code 세션부터 trace, summary, helpfulness가 모두 정상 기록됩니다.
|
|
1313
|
-
## 2026-03-04T13:13:24.319Z | 7117aef9-fdda-4028-a486-b3b7403248e1
|
|
1314
|
-
- type: agent_response
|
|
1315
|
-
- session: 2fe5b2e5-83ea-4778-b09b-5264c550ea86
|
|
1316
|
-
모든 수정이 실제로 작동하고 있습니다.
|
|
1317
|
-
|
|
1318
|
-
---
|
|
1319
|
-
|
|
1320
|
-
## 적용 확인 결과
|
|
1321
|
-
|
|
1322
|
-
### ✅ IMP-01: Retrieval Trace projectHash 수정
|
|
1323
|
-
| | 수정 전 | 수정 후 |
|
|
1324
|
-
|---|---|---|
|
|
1325
|
-
| 총 traces | 1 | **16** |
|
|
1326
|
-
| project_hash 있는 traces | 0 | **2** (새 세션) |
|
|
1327
|
-
| 최근 1시간 traces | 0 | **2** |
|
|
1328
|
-
|
|
1329
|
-
가장 최신 trace 확인:
|
|
1330
|
-
```
|
|
1331
|
-
a5e8fffc | session b96134fe | project_hash: f4d5c120 | hybrid | medium
|
|
1332
|
-
```
|
|
1333
|
-
이제 새 세션의 trace는 `project_hash = f4d5c120`으로 저장 → **대시보드에서 조회 가능**
|
|
1334
|
-
|
|
1335
|
-
기존 14개 trace는 `project_hash = NULL` (수정 전 기록, append-only 원칙상 유지)
|
|
1336
|
-
|
|
1337
|
-
---
|
|
1338
|
-
|
|
1339
|
-
### ✅ IMP-03/04: 세션 요약 생성
|
|
1340
|
-
| | 수정 전 | 수정 후 |
|
|
1341
|
-
|---|---|---|
|
|
1342
|
-
| 세션 요약 수 | 2 | **8** (+6개) |
|
|
1343
|
-
|
|
1344
|
-
실제 생성된 요약 샘플:
|
|
1345
|
-
```
|
|
1346
|
-
"Session with 9 user prompts and 18 responses.
|
|
1347
|
-
Topics discussed: b2.log 보면 '안국건강 아이원 루테인'으로 검색해서..."
|
|
1348
|
-
|
|
1349
|
-
"[2026-03-04] 1턴 세션. 주요 작업: scripts/evaluation/evaluate_multiturn_30scenarios.py..."
|
|
1350
|
-
```
|
|
1351
|
-
LLM 요약(기존) + 규칙 기반 요약(신규) 모두 작동 중
|
|
1352
|
-
|
|
1353
|
-
---
|
|
1354
|
-
|
|
1355
|
-
### ✅ IMP-02: Bash 필터링
|
|
1356
|
-
tool_observation 비율이 크게 감소한 것으로 확인 (이번 세션 기준)
|
|
1357
|
-
|
|
1358
|
-
---
|
|
1359
|
-
|
|
1360
|
-
### 남은 과제
|
|
1361
|
-
|
|
1362
|
-
**대시보드가 여전히 trace count를 1로 표시하는 이유**: `/api/stats?projectId=f4d5c120`가 `project_hash`로만 필터링하는데, 기존 14개 trace는 `project_hash = NULL`. 서버 API에서 세션 기반 fallback 조회가 필요합니다. 다음 세션부터는 올바른 project_hash로 쌓이므로 자연히 해결됩니다.
|
|
1363
|
-
## 2026-03-04T14:57:31.558Z | f74d484c-f17d-4472-bbc0-c02f4991c6b6
|
|
1364
|
-
- type: agent_response
|
|
1365
|
-
- session: 2fe5b2e5-83ea-4778-b09b-5264c550ea86
|
|
1366
|
-
분석 완료. 결과를 정리합니다.
|
|
1367
|
-
|
|
1368
|
-
---
|
|
1369
|
-
|
|
1370
|
-
## 개선 사항 적용 효과 (실측 데이터)
|
|
1371
|
-
|
|
1372
|
-
### 지표 비교
|
|
1373
|
-
|
|
1374
|
-
| 지표 | 수정 전 | 현재 | 변화 |
|
|
1375
|
-
|------|---------|------|------|
|
|
1376
|
-
| Retrieval Traces | **1건** | **20건** | +1,900% ✅ |
|
|
1377
|
-
| project_hash 있는 traces | **0** | **6** | 신규 ✅ |
|
|
1378
|
-
| 세션 요약 | **2건** | **12건** | +500% ✅ |
|
|
1379
|
-
| Helpfulness 평가 레코드 | **0** | **43건** | 신규 ✅ |
|
|
1380
|
-
| 평가 완료 비율 | 0% | **88%** (38/43) | ✅ |
|
|
1381
|
-
| 평균 helpfulness score | 측정 불가 | **0.655** | 측정 시작 ✅ |
|
|
1382
|
-
|
|
1383
|
-
---
|
|
1384
|
-
|
|
1385
|
-
### 각 개선 항목 상세
|
|
1386
|
-
|
|
1387
|
-
**IMP-01 ✅ Trace projectHash 수정**
|
|
1388
|
-
- 오늘 오후 신규 traces는 `project_hash = f4d5c120` 정상 태깅
|
|
1389
|
-
- 최신 trace (14:48): `hybrid | medium confidence | 5 candidates`
|
|
1390
|
-
- 이전 14건은 `null` (수정 전 기록, 정상)
|
|
1391
|
-
|
|
1392
|
-
**IMP-03/04 ✅ 세션 요약 생성**
|
|
1393
|
-
- 12개 요약, 두 형식 모두 작동 중:
|
|
1394
|
-
- LLM 생성: *"Session with 9 user prompts. Topics: 안국건강 루테인 검색 필터링..."*
|
|
1395
|
-
- 규칙 기반: *"[2026-03-04] 1턴 세션. 주요 작업: evaluate_multiturn_30scenarios.py..."*
|
|
1396
|
-
- 오늘 오후에만 4개 생성됨
|
|
1397
|
-
|
|
1398
|
-
**IMP-06 ✅ Helpfulness 평가 작동**
|
|
1399
|
-
- 43건 기록, 38건 평가 완료
|
|
1400
|
-
- 모든 평가 항목에서 `session_continued = 1` → 메모리 검색 후 세션이 계속 이어짐 (긍정적 신호)
|
|
1401
|
-
- helpfulness_score 분포: 0.62 ~ 0.68 (일관된 중상 수준)
|
|
1402
|
-
|
|
1403
|
-
**IMP-02 ✅ Bash 필터링**
|
|
1404
|
-
- 오늘 오후 tool_observation 비율: 17/24 = **71%** (수정 전 93%)
|
|
1405
|
-
- 불필요한 bash 출력 저장이 줄어들고 있음
|
|
1406
|
-
|
|
1407
|
-
---
|
|
1408
|
-
|
|
1409
|
-
### 아직 개선 여지
|
|
1410
|
-
|
|
1411
|
-
**1. Helpfulness score 0.65 — "중간" 수준**
|
|
1412
|
-
|
|
1413
|
-
`was_reasked = 1`인데 score가 0.65에 머무름. 평가 알고리즘이 모든 항목에 비슷한 점수를 주고 있어 **변별력이 낮음**. 실제로 도움된 메모리와 아닌 것을 더 잘 구분해야 함.
|
|
1414
|
-
|
|
1415
|
-
**2. 대시보드 표시 문제 잔존**
|
|
1416
|
-
|
|
1417
|
-
대시보드 `/api/stats?projectId=f4d5c120`는 여전히 trace count를 낮게 표시함. 서버 API가 `project_hash`로만 필터링하는데, 새 6건만 집계됨. 대시보드 API에서 session-based fallback 조회를 추가하면 해결됨.
|
|
1418
|
-
|
|
1419
|
-
**3. tool_observation 71% — 아직 높음**
|
|
1420
|
-
|
|
1421
|
-
오후 기준 17건의 tool_observation이 저장됨. Bash 필터가 작동하고 있지만 여전히 높은 편. 임계값 조정 또는 `AskUserQuestion`/`Agent` 같은 추가 툴 제외를 고려할 수 있음.
|