claude-memory-layer 1.0.31 → 1.0.32

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.
Files changed (313) hide show
  1. package/README.md +9 -2
  2. package/dist/cli/index.js +1 -1
  3. package/package.json +11 -2
  4. package/scripts/postinstall-embedding-backend.cjs +16 -12
  5. package/AGENTS.md +0 -71
  6. package/CLAUDE.md +0 -30
  7. package/HANDOFF.md +0 -92
  8. package/Memo.txt +0 -558
  9. package/benchmarks/replay/anonymized-real-sessions.json +0 -48
  10. package/config/kpi-thresholds.json +0 -7
  11. package/context.md +0 -636
  12. package/docs/ARCHITECTURE_COMPARISON_AND_RECOMMENDATIONS.md +0 -627
  13. package/docs/HERMES_MEMORY_INGESTION_ANALYSIS.md +0 -440
  14. package/docs/MCP_MEMORY_SERVICE_COMPARATIVE_REVIEW.md +0 -271
  15. package/docs/MEMORY_USEFULNESS_AUDIT.md +0 -371
  16. package/docs/MEMORY_USEFULNESS_AUDIT_RAW.json +0 -80
  17. package/docs/MEMSEARCH_PROJECT_STRUCTURE_ANALYSIS.md +0 -333
  18. package/docs/MEMU_ADOPTION.md +0 -40
  19. package/docs/OPERATIONS.md +0 -18
  20. package/docs/PRODUCT_VALIDATION_MATRIX.md +0 -82
  21. package/docs/PROJECT_STRUCTURE_ANALYSIS.md +0 -421
  22. package/docs/REFACTORING_MILESTONES_AND_ISSUES.md +0 -501
  23. package/docs/REFACTORING_PLAN_THIN_CORE.md +0 -414
  24. package/docs/REFERENCE_PROJECT_ANALYSES.md +0 -25
  25. package/docs/SUPERLOCALMEMORY_PROJECT_STRUCTURE_ANALYSIS.md +0 -452
  26. package/docs/TARGET_ARCHITECTURE_AND_FOLDER_STRUCTURE.md +0 -446
  27. package/docs/architecture/comparison-index.md +0 -47
  28. package/docs/reports/codex-real-data-validation-20260505T040447Z.md +0 -46
  29. package/plan.md +0 -1642
  30. package/scripts/build.ts +0 -159
  31. package/scripts/bump-patch-version.sh +0 -18
  32. package/scripts/delete-unknown-projects.js +0 -154
  33. package/scripts/fix-sync-gap.js +0 -32
  34. package/scripts/generate-session-qrels.ts +0 -126
  35. package/scripts/heartbeat-memory-orchestrator.sh +0 -28
  36. package/scripts/replay-retrieval-benchmark.ts +0 -69
  37. package/scripts/report-sync-gap.js +0 -26
  38. package/scripts/review-queue-auto-resolve.js +0 -21
  39. package/scripts/sync-gap-auto-heal.sh +0 -17
  40. package/spec.md +0 -624
  41. package/specs/20260207-dashboard-upgrade/context.md +0 -38
  42. package/specs/20260207-dashboard-upgrade/spec.md +0 -96
  43. package/specs/citations-system/context.md +0 -243
  44. package/specs/citations-system/plan.md +0 -495
  45. package/specs/citations-system/spec.md +0 -371
  46. package/specs/endless-mode/context.md +0 -305
  47. package/specs/endless-mode/plan.md +0 -620
  48. package/specs/endless-mode/spec.md +0 -455
  49. package/specs/entity-edge-model/context.md +0 -401
  50. package/specs/entity-edge-model/plan.md +0 -459
  51. package/specs/entity-edge-model/spec.md +0 -391
  52. package/specs/evidence-aligner-v2/context.md +0 -401
  53. package/specs/evidence-aligner-v2/plan.md +0 -303
  54. package/specs/evidence-aligner-v2/spec.md +0 -312
  55. package/specs/mcp-desktop-integration/context.md +0 -278
  56. package/specs/mcp-desktop-integration/plan.md +0 -550
  57. package/specs/mcp-desktop-integration/spec.md +0 -494
  58. package/specs/memory-utilization-improvements/context.md +0 -145
  59. package/specs/memory-utilization-improvements/plan.md +0 -361
  60. package/specs/memory-utilization-improvements/spec.md +0 -361
  61. package/specs/post-tool-use-hook/context.md +0 -319
  62. package/specs/post-tool-use-hook/plan.md +0 -469
  63. package/specs/post-tool-use-hook/spec.md +0 -364
  64. package/specs/private-tags/context.md +0 -288
  65. package/specs/private-tags/plan.md +0 -412
  66. package/specs/private-tags/spec.md +0 -345
  67. package/specs/progressive-disclosure/context.md +0 -346
  68. package/specs/progressive-disclosure/plan.md +0 -663
  69. package/specs/progressive-disclosure/spec.md +0 -415
  70. package/specs/selective-tool-observation/context.md +0 -100
  71. package/specs/selective-tool-observation/plan.md +0 -158
  72. package/specs/selective-tool-observation/spec.md +0 -127
  73. package/specs/task-entity-system/context.md +0 -297
  74. package/specs/task-entity-system/plan.md +0 -301
  75. package/specs/task-entity-system/spec.md +0 -314
  76. package/specs/thin-core-refactor/context.md +0 -275
  77. package/specs/thin-core-refactor/plan.md +0 -536
  78. package/specs/thin-core-refactor/spec.md +0 -465
  79. package/specs/vector-outbox-v2/context.md +0 -470
  80. package/specs/vector-outbox-v2/plan.md +0 -562
  81. package/specs/vector-outbox-v2/spec.md +0 -466
  82. package/specs/web-viewer-ui/context.md +0 -384
  83. package/specs/web-viewer-ui/plan.md +0 -797
  84. package/specs/web-viewer-ui/spec.md +0 -516
  85. package/src/adapters/claude/capture/index.ts +0 -3
  86. package/src/adapters/claude/context/index.ts +0 -3
  87. package/src/adapters/claude/hooks/index.ts +0 -21
  88. package/src/adapters/claude/hooks/post-tool-use.ts +0 -239
  89. package/src/adapters/claude/hooks/prompt-injection-policy.ts +0 -104
  90. package/src/adapters/claude/hooks/semantic-daemon-client.ts +0 -209
  91. package/src/adapters/claude/hooks/semantic-daemon.ts +0 -283
  92. package/src/adapters/claude/hooks/session-end.ts +0 -59
  93. package/src/adapters/claude/hooks/session-start.ts +0 -73
  94. package/src/adapters/claude/hooks/stop.ts +0 -128
  95. package/src/adapters/claude/hooks/user-prompt-submit.ts +0 -361
  96. package/src/adapters/claude/index.ts +0 -4
  97. package/src/adapters/claude/transcript/index.ts +0 -4
  98. package/src/adapters/claude/transcript/transcript-reader.ts +0 -57
  99. package/src/adapters/claude/transcript/turn-reconstructor.ts +0 -65
  100. package/src/apps/cli/claude-settings-hooks.ts +0 -138
  101. package/src/apps/cli/codex-import-runner.ts +0 -125
  102. package/src/apps/cli/codex-validation-output.ts +0 -95
  103. package/src/apps/cli/hermes-import-runner.ts +0 -130
  104. package/src/apps/cli/hermes-validation-output.ts +0 -91
  105. package/src/apps/cli/index.ts +0 -1735
  106. package/src/apps/cli/mcp-install.ts +0 -106
  107. package/src/apps/cli/retrieval-disclosure-output.ts +0 -196
  108. package/src/apps/dashboard/assets/js/bootstrap.js +0 -244
  109. package/src/apps/dashboard/assets/js/chat.js +0 -373
  110. package/src/apps/dashboard/assets/js/disclosure.js +0 -232
  111. package/src/apps/dashboard/assets/js/modals.js +0 -298
  112. package/src/apps/dashboard/assets/js/overview.js +0 -655
  113. package/src/apps/dashboard/assets/js/state.js +0 -72
  114. package/src/apps/dashboard/assets/js/views.js +0 -468
  115. package/src/apps/dashboard/index.html +0 -543
  116. package/src/apps/dashboard/index.ts +0 -3
  117. package/src/apps/dashboard/style.css +0 -1750
  118. package/src/apps/index.ts +0 -5
  119. package/src/apps/server/api/chat.ts +0 -244
  120. package/src/apps/server/api/citations.ts +0 -105
  121. package/src/apps/server/api/events.ts +0 -137
  122. package/src/apps/server/api/health.ts +0 -53
  123. package/src/apps/server/api/index.ts +0 -26
  124. package/src/apps/server/api/projects.ts +0 -74
  125. package/src/apps/server/api/search.ts +0 -184
  126. package/src/apps/server/api/sessions.ts +0 -115
  127. package/src/apps/server/api/stats.ts +0 -723
  128. package/src/apps/server/api/turns.ts +0 -143
  129. package/src/apps/server/api/utils.ts +0 -65
  130. package/src/apps/server/index.ts +0 -111
  131. package/src/cli/index.ts +0 -3
  132. package/src/cli/retrieval-disclosure-output.ts +0 -2
  133. package/src/compat/index.ts +0 -5
  134. package/src/core/canonical-key.ts +0 -186
  135. package/src/core/citation-generator.ts +0 -63
  136. package/src/core/consolidated-store.ts +0 -356
  137. package/src/core/consolidation-worker.ts +0 -493
  138. package/src/core/context-formatter.ts +0 -276
  139. package/src/core/continuity-manager.ts +0 -341
  140. package/src/core/db-wrapper.ts +0 -64
  141. package/src/core/derive/fact-deriver.ts +0 -170
  142. package/src/core/derive/index.ts +0 -2
  143. package/src/core/derive/summary-deriver.ts +0 -76
  144. package/src/core/edge-repo.ts +0 -333
  145. package/src/core/embedder.ts +0 -4
  146. package/src/core/engine/embedding-maintenance-service.ts +0 -187
  147. package/src/core/engine/endless-memory-services.ts +0 -4
  148. package/src/core/engine/index.ts +0 -19
  149. package/src/core/engine/memory-engine-services.ts +0 -170
  150. package/src/core/engine/memory-ingest-service.ts +0 -317
  151. package/src/core/engine/memory-query-service.ts +0 -173
  152. package/src/core/engine/memory-runtime-service.ts +0 -162
  153. package/src/core/engine/memory-service-composition.ts +0 -231
  154. package/src/core/engine/retrieval-analytics-service.ts +0 -181
  155. package/src/core/engine/retrieval-disclosure-service.ts +0 -420
  156. package/src/core/engine/retrieval-orchestrator.ts +0 -377
  157. package/src/core/engine/retrieval-services.ts +0 -176
  158. package/src/core/engine/shared-memory-services.ts +0 -4
  159. package/src/core/entity-repo.ts +0 -349
  160. package/src/core/event-store.ts +0 -779
  161. package/src/core/evidence-aligner.ts +0 -635
  162. package/src/core/external-market-context.ts +0 -582
  163. package/src/core/graduation-worker.ts +0 -171
  164. package/src/core/graduation.ts +0 -377
  165. package/src/core/index.ts +0 -64
  166. package/src/core/ingest-interceptor.ts +0 -80
  167. package/src/core/markdown-mirror.ts +0 -70
  168. package/src/core/matcher.ts +0 -208
  169. package/src/core/md-mirror.ts +0 -92
  170. package/src/core/metadata-extractor.ts +0 -203
  171. package/src/core/model/memory-fact.ts +0 -30
  172. package/src/core/model/memory-rule.ts +0 -14
  173. package/src/core/model/memory-summary.ts +0 -21
  174. package/src/core/model/raw-event.ts +0 -28
  175. package/src/core/model/retrieval-result.ts +0 -35
  176. package/src/core/mongo-sync-config.ts +0 -165
  177. package/src/core/mongo-sync-worker.ts +0 -381
  178. package/src/core/privacy/filter.ts +0 -190
  179. package/src/core/privacy/index.ts +0 -20
  180. package/src/core/privacy/tag-parser.ts +0 -145
  181. package/src/core/product-validation-matrix.ts +0 -314
  182. package/src/core/progressive-retriever.ts +0 -414
  183. package/src/core/registry/project-path.ts +0 -54
  184. package/src/core/registry/session-registry.ts +0 -69
  185. package/src/core/replay-evaluator.ts +0 -625
  186. package/src/core/retrieval-benchmark.ts +0 -117
  187. package/src/core/retrieval-quality.ts +0 -109
  188. package/src/core/retriever.ts +0 -800
  189. package/src/core/session-qrels.ts +0 -360
  190. package/src/core/shared-event-store.ts +0 -114
  191. package/src/core/shared-promoter.ts +0 -249
  192. package/src/core/shared-store.ts +0 -289
  193. package/src/core/shared-vector-store.ts +0 -203
  194. package/src/core/sqlite-event-store.ts +0 -1846
  195. package/src/core/sqlite-wrapper.ts +0 -116
  196. package/src/core/sync-worker.ts +0 -228
  197. package/src/core/tag-taxonomy.ts +0 -51
  198. package/src/core/task/blocker-resolver.ts +0 -333
  199. package/src/core/task/index.ts +0 -9
  200. package/src/core/task/task-matcher.ts +0 -240
  201. package/src/core/task/task-projector.ts +0 -358
  202. package/src/core/task/task-resolver.ts +0 -421
  203. package/src/core/turn-state.ts +0 -207
  204. package/src/core/types.ts +0 -952
  205. package/src/core/vector-outbox.ts +0 -299
  206. package/src/core/vector-store.ts +0 -231
  207. package/src/core/vector-worker.ts +0 -521
  208. package/src/core/working-set-store.ts +0 -257
  209. package/src/extensions/endless-memory/endless-memory-services.ts +0 -350
  210. package/src/extensions/endless-memory/index.ts +0 -1
  211. package/src/extensions/index.ts +0 -5
  212. package/src/extensions/mcp/handlers.ts +0 -960
  213. package/src/extensions/mcp/index.ts +0 -48
  214. package/src/extensions/mcp/tools.ts +0 -252
  215. package/src/extensions/shared-memory/index.ts +0 -1
  216. package/src/extensions/shared-memory/shared-memory-services.ts +0 -211
  217. package/src/extensions/vector/embedder.ts +0 -234
  218. package/src/extensions/vector/index.ts +0 -1
  219. package/src/hooks/post-tool-use.ts +0 -9
  220. package/src/hooks/semantic-daemon-client.ts +0 -1
  221. package/src/hooks/semantic-daemon.ts +0 -11
  222. package/src/hooks/session-end.ts +0 -9
  223. package/src/hooks/session-start.ts +0 -9
  224. package/src/hooks/stop.ts +0 -9
  225. package/src/hooks/user-prompt-submit.ts +0 -9
  226. package/src/index.ts +0 -13
  227. package/src/mcp/handlers.ts +0 -2
  228. package/src/mcp/index.ts +0 -4
  229. package/src/mcp/tools.ts +0 -2
  230. package/src/server/api/chat.ts +0 -2
  231. package/src/server/api/citations.ts +0 -2
  232. package/src/server/api/events.ts +0 -2
  233. package/src/server/api/health.ts +0 -2
  234. package/src/server/api/index.ts +0 -2
  235. package/src/server/api/projects.ts +0 -2
  236. package/src/server/api/search.ts +0 -2
  237. package/src/server/api/sessions.ts +0 -2
  238. package/src/server/api/stats.ts +0 -2
  239. package/src/server/api/turns.ts +0 -2
  240. package/src/server/api/utils.ts +0 -2
  241. package/src/server/index.ts +0 -2
  242. package/src/services/bootstrap-organizer.ts +0 -463
  243. package/src/services/codex-session-history-importer.ts +0 -966
  244. package/src/services/hermes-session-history-importer.ts +0 -733
  245. package/src/services/memory-service-config.ts +0 -36
  246. package/src/services/memory-service-registry.ts +0 -150
  247. package/src/services/memory-service.ts +0 -688
  248. package/src/services/session-history-importer.ts +0 -629
  249. package/tests/README.md +0 -23
  250. package/tests/adapters/claude/claude-semantic-daemon-adapter.test.ts +0 -54
  251. package/tests/adapters/claude/claude-transcript-reconstructor.test.ts +0 -98
  252. package/tests/adapters/claude-hook-prompt-injection-policy.test.ts +0 -99
  253. package/tests/apps/app-layer-boundary.test.ts +0 -48
  254. package/tests/apps/claude-settings-hooks.test.ts +0 -107
  255. package/tests/apps/cli-disclosure-output.test.ts +0 -212
  256. package/tests/apps/codex-import-runner.test.ts +0 -99
  257. package/tests/apps/codex-validation-output.test.ts +0 -100
  258. package/tests/apps/hermes-import-runner.test.ts +0 -99
  259. package/tests/apps/mcp-install-command.test.ts +0 -59
  260. package/tests/apps/package-build-entrypoints.test.ts +0 -30
  261. package/tests/apps/postinstall-embedding-backend.test.ts +0 -185
  262. package/tests/apps/search-api-disclosure.test.ts +0 -162
  263. package/tests/apps/stats-api-lightweight.test.ts +0 -67
  264. package/tests/apps/ui-disclosure-output.test.ts +0 -140
  265. package/tests/core/bootstrap-organizer.test.ts +0 -111
  266. package/tests/core/canonical-key.test.ts +0 -101
  267. package/tests/core/codex-session-history-importer-validation.test.ts +0 -185
  268. package/tests/core/consolidation-worker.test.ts +0 -75
  269. package/tests/core/embedding-maintenance-service.test.ts +0 -282
  270. package/tests/core/evidence-aligner.test.ts +0 -152
  271. package/tests/core/external-market-context.test.ts +0 -209
  272. package/tests/core/fact-deriver.test.ts +0 -79
  273. package/tests/core/hermes-session-history-importer-validation.test.ts +0 -609
  274. package/tests/core/ingest-interceptor.test.ts +0 -38
  275. package/tests/core/markdown-mirror.test.ts +0 -85
  276. package/tests/core/matcher.test.ts +0 -112
  277. package/tests/core/md-mirror.test.ts +0 -50
  278. package/tests/core/memory-engine-services.test.ts +0 -240
  279. package/tests/core/memory-ingest-service.test.ts +0 -296
  280. package/tests/core/memory-query-service.test.ts +0 -129
  281. package/tests/core/memory-runtime-service.test.ts +0 -201
  282. package/tests/core/memory-service-composition.test.ts +0 -192
  283. package/tests/core/memory-service-config.test.ts +0 -41
  284. package/tests/core/memory-service-facade.test.ts +0 -30
  285. package/tests/core/memory-service-registry.test.ts +0 -206
  286. package/tests/core/product-validation-matrix.test.ts +0 -61
  287. package/tests/core/project-registry.test.ts +0 -78
  288. package/tests/core/replay-evaluator.test.ts +0 -181
  289. package/tests/core/retrieval-analytics-service.test.ts +0 -210
  290. package/tests/core/retrieval-benchmark.test.ts +0 -93
  291. package/tests/core/retrieval-disclosure-service.test.ts +0 -264
  292. package/tests/core/retrieval-orchestrator.test.ts +0 -403
  293. package/tests/core/retrieval-quality.test.ts +0 -31
  294. package/tests/core/retrieval-services.test.ts +0 -185
  295. package/tests/core/retriever-fallback-chain.test.ts +0 -223
  296. package/tests/core/retriever-strategy-scope.test.ts +0 -164
  297. package/tests/core/retriever.memu-adoption.test.ts +0 -122
  298. package/tests/core/session-history-importer-filter.test.ts +0 -78
  299. package/tests/core/session-qrels.test.ts +0 -250
  300. package/tests/core/sqlite-event-store-replication.test.ts +0 -127
  301. package/tests/core/summary-deriver.test.ts +0 -66
  302. package/tests/extensions/embedder-warning-suppression.test.ts +0 -84
  303. package/tests/extensions/endless-memory-extension-boundary.test.ts +0 -17
  304. package/tests/extensions/endless-memory-services.test.ts +0 -325
  305. package/tests/extensions/mcp-context-tools.test.ts +0 -905
  306. package/tests/extensions/mcp-extension-boundary.test.ts +0 -21
  307. package/tests/extensions/mcp-package-build.test.ts +0 -22
  308. package/tests/extensions/mcp-project-aware-tools.test.ts +0 -102
  309. package/tests/extensions/shared-memory-extension-boundary.test.ts +0 -24
  310. package/tests/extensions/shared-memory-services.test.ts +0 -309
  311. package/tests/extensions/vector-extension-boundary.test.ts +0 -21
  312. package/tsconfig.json +0 -24
  313. package/vitest.config.ts +0 -15
@@ -1,127 +0,0 @@
1
- # Spec: Selective Storage Filtering
2
-
3
- ## 개요
4
-
5
- 모든 이벤트 타입에 걸쳐 메모리 가치가 낮은 데이터를 선별적으로 필터링하여
6
- 저장량 55% 감소, 임베딩 backlog 해소, retrieval 품질 향상을 목표로 한다.
7
-
8
- ## 목표
9
-
10
- - 전체 이벤트 저장량 **-55%** (10,536 → ~4,693)
11
- - 임베딩 pending 증가 속도 감소
12
- - retrieval signal-to-noise 향상
13
- - Ctrl+C, 메뉴번호 같은 쓰레기 데이터 제거
14
-
15
- ## 비목표
16
-
17
- - 저장 스키마 변경 없음
18
- - 기존 저장된 이벤트 소급 삭제 없음
19
- - session_summary 로직 변경 없음
20
-
21
- ---
22
-
23
- ## 필터 규칙 1: tool_observation (post-tool-use.ts)
24
-
25
- ### Blocklist 확장
26
-
27
- **추가 제외 도구** (현재: TodoWrite, TodoRead만 제외):
28
-
29
- ```
30
- Read, Grep, Glob, ToolSearch,
31
- WebFetch, WebSearch, NotebookRead,
32
- Skill, EnterPlanMode,
33
- mcp__* (MCP 도구 전체, 조건부 예외 적용)
34
- ```
35
-
36
- **항상 저장 (allowlist)**:
37
- - `Write`, `Edit`, `MultiEdit` — 파일 변경 기록
38
- - `Agent`, `Task` — 서브태스크 결과
39
- - `Bash` — 조건부 (output 필터 적용)
40
- - `ExitPlanMode` — 계획 완료 기록 (조건부)
41
-
42
- ### Output-level 필터 (Bash 등 조건부 도구)
43
-
44
- | 조건 | 동작 |
45
- |------|------|
46
- | `stderr` 존재 | 저장 (에러 컨텍스트) |
47
- | `stdout` 길이 ≥ 100 chars | 저장 |
48
- | Write/Edit/Agent/Task | 길이 무관 저장 |
49
- | 그 외 | 스킵 |
50
-
51
- ### 환경변수
52
-
53
- ```bash
54
- CLAUDE_MEMORY_TOOL_BLOCKLIST="Read,Grep,Glob,..." # 커스텀 blocklist
55
- CLAUDE_MEMORY_TOOL_MIN_OUTPUT_LEN=100 # Bash 최소 출력 길이
56
- ```
57
-
58
- ---
59
-
60
- ## 필터 규칙 2: agent_response (stop.ts)
61
-
62
- ### Min-length 필터
63
-
64
- **150자 미만 agent_response는 저장 안 함**
65
-
66
- 근거: 50자 미만 608개 (27%), 50~200자 587개 (26%) 가 도구 체인 전환 메시지.
67
- 독립적 retrieval 가치 없음.
68
-
69
- ```bash
70
- CLAUDE_MEMORY_AGENT_RESPONSE_MIN_LEN=150 # 기본값
71
- ```
72
-
73
- **예외 (짧아도 저장):**
74
- - 세션의 마지막 agent_response (최종 답변일 가능성)
75
-
76
- ---
77
-
78
- ## 필터 규칙 3: user_prompt (importer + hook)
79
-
80
- ### 임포터에 shouldStorePrompt() 적용
81
-
82
- 현재 import 시 transcript의 모든 user 메시지를 무조건 저장.
83
- Ctrl+C(`\x03`), 숫자 `'1'`, `'go'` 등이 저장되는 원인.
84
-
85
- **변경:** `session-history-importer.ts`에서 각 user_prompt 저장 전
86
- `shouldStorePrompt()` 동일 조건 적용:
87
- - 길이 < 15자 → 스킵
88
- - `/`로 시작 → 스킵
89
- - 제어문자 포함 → 스킵
90
- - 한글/영문 2글자 이상 포함 여부 확인
91
-
92
- ---
93
-
94
- ## 적용 파일
95
-
96
- | 파일 | 변경 |
97
- |------|------|
98
- | `src/hooks/post-tool-use.ts` | blocklist 확장 + output-level 필터 |
99
- | `src/hooks/stop.ts` | agent_response min-length 필터 |
100
- | `src/services/session-history-importer.ts` | shouldStorePrompt() 임포트 적용 |
101
-
102
- ---
103
-
104
- ## 판단 흐름
105
-
106
- ```
107
- [PostToolUse]
108
- tool_name이 blocklist? → 스킵
109
- tool_name이 allowlist(Write/Edit/Agent/Task)? → 저장
110
- Bash/기타: output length ≥ 100 OR stderr 있음? → 저장 else 스킵
111
-
112
- [Stop - agent_response]
113
- 마지막 메시지? → 저장
114
- length ≥ 150? → 저장 else 스킵
115
-
116
- [Importer - user_prompt]
117
- shouldStorePrompt() 통과? → 저장 else 스킵
118
- ```
119
-
120
- ---
121
-
122
- ## 성공 지표
123
-
124
- - 신규 세션 tool_observation 비율 < 40% (현재 68.5%)
125
- - agent_response 저장 비율 < 50% (현재 전량 저장)
126
- - user_prompt 쓰레기 입력 0건
127
- - 임베딩 pending 증가 속도 현재 대비 -50%
@@ -1,297 +0,0 @@
1
- # Task Entity System Context
2
-
3
- > **Version**: 1.0.0
4
- > **Created**: 2026-01-31
5
-
6
- ## 1. 배경
7
-
8
- ### 1.1 기존 설계의 한계
9
-
10
- 현재 code-memory 시스템에서 Task는 `entries` 테이블에 저장되는 불변 기록으로 관리됩니다:
11
-
12
- ```typescript
13
- // 기존: entries 테이블에 Task를 저장
14
- {
15
- entry_id: "ent_abc123",
16
- entry_type: "task",
17
- title: "벡터 검색 구현",
18
- content_json: { status: "in_progress", ... }
19
- }
20
- ```
21
-
22
- **문제점**:
23
-
24
- 1. **세션 A**에서 "벡터 검색 구현" Task 생성 → `ent_abc123`
25
- 2. **세션 B**에서 같은 Task 언급 → `ent_def456` (새 entry 생성!)
26
- 3. **세션 C**에서 "완료" 언급 → `ent_ghi789` (또 새 entry!)
27
-
28
- 결과: 하나의 Task가 3개의 분리된 entry로 존재하며, 상태 추적 불가
29
-
30
- ### 1.2 해결 방향
31
-
32
- **Entry와 Entity 분리**:
33
-
34
- | 구분 | Entry | Entity |
35
- |------|-------|--------|
36
- | 특성 | 불변 기록 | 상태 변화 개체 |
37
- | 예시 | Fact, Decision, Insight | Task, Condition, Artifact |
38
- | 생명주기 | 생성 후 변경 없음 | 이벤트로 상태 변화 |
39
- | 식별 | UUID | canonical_key |
40
-
41
- ## 2. Memo.txt 참고 사항
42
-
43
- ### 2.1 핵심 원칙 (섹션 2)
44
-
45
- > **5. Task는 entity**
46
- > - Task 상태(status/priority/blockers)는 이벤트 fold 결과로 계산
47
- > - 세션마다 Task entry를 새로 만들지 말고, 기존 task entity를 찾아 업데이트
48
-
49
- ### 2.2 DB 스키마 (섹션 4.3)
50
-
51
- ```sql
52
- CREATE TABLE entities (
53
- entity_id VARCHAR PRIMARY KEY,
54
- entity_type VARCHAR NOT NULL, -- task|condition|artifact
55
- canonical_key VARCHAR NOT NULL,
56
- title VARCHAR NOT NULL,
57
- stage VARCHAR NOT NULL,
58
- status VARCHAR NOT NULL,
59
- current_json JSON NOT NULL,
60
- ...
61
- );
62
- ```
63
-
64
- ### 2.3 Task 이벤트 타입 (섹션 7.2)
65
-
66
- - `task_created`
67
- - `task_status_changed`
68
- - `task_priority_changed`
69
- - `task_blockers_set` (mode=replace|suggest)
70
- - `task_transition_rejected`
71
-
72
- ### 2.4 BlockerResolver 규칙 (섹션 7.3)
73
-
74
- 1. 강한 ID/URL/키 패턴 → artifact로 get-or-create
75
- 2. 명시 task_id → task로 연결
76
- 3. Task 제목 매칭 실패 → **condition으로 fallback** (스텁 Task 생성 금지)
77
-
78
- ## 3. Idris2 영감 적용
79
-
80
- ### 3.1 의존적 타입 개념
81
-
82
- **Idris2의 Vector 타입**:
83
- ```idris
84
- -- 길이가 타입에 인코딩됨
85
- data Vect : Nat -> Type -> Type where
86
- Nil : Vect 0 a
87
- (::) : a -> Vect n a -> Vect (S n) a
88
- ```
89
-
90
- **TypeScript 적용**:
91
- ```typescript
92
- // 상태에 따라 blockers 필드 타입이 달라짐
93
- type TaskState =
94
- | { status: 'blocked'; blockers: BlockerRef[] } // 필수, 1개 이상
95
- | { status: 'done'; blockers?: never }; // 없어야 함
96
- ```
97
-
98
- ### 3.2 불변식 (Invariants)
99
-
100
- **Idris2에서**:
101
- ```idris
102
- -- 타입 시스템이 강제
103
- nonEmptyBlockers : (t : Task) -> t.status = Blocked -> NonEmpty t.blockers
104
- ```
105
-
106
- **TypeScript + Zod에서**:
107
- ```typescript
108
- // 런타임 검증
109
- const BlockedTaskSchema = z.object({
110
- status: z.literal('blocked'),
111
- blockers: z.array(BlockerRefSchema).min(1) // 최소 1개 강제
112
- });
113
- ```
114
-
115
- ### 3.3 왜 실제 Idris2를 사용하지 않는가?
116
-
117
- **Memo.txt 섹션 11**:
118
- > "지금은 Python 쪽 구현이 핵심이므로, Idris는 Candidate/Verified 래퍼 기반으로만 최소 수정"
119
-
120
- **실용적 이유**:
121
-
122
- 1. **학습 곡선**: 팀원 모두가 Idris2를 학습해야 함
123
- 2. **도구 체인**: idris2 컴파일러 설치/관리 필요
124
- 3. **통합 복잡도**: TypeScript ↔ Idris2 FFI 오버헤드
125
- 4. **디버깅**: 두 언어 간 스택 트레이스 추적 어려움
126
-
127
- **TypeScript로 충분한 이유**:
128
-
129
- 1. **Discriminated Union**: 상태별 타입 분리 가능
130
- 2. **Zod**: 런타임 검증으로 불변식 강제
131
- 3. **타입 가드**: 조건부 타입 narrowing
132
- 4. **생태계**: 풍부한 라이브러리와 도구
133
-
134
- ## 4. 기존 코드와의 관계
135
-
136
- ### 4.1 types.ts
137
-
138
- 현재 정의된 타입 활용:
139
-
140
- ```typescript
141
- // 기존
142
- export type MatchConfidence = 'high' | 'suggested' | 'none';
143
- export const MATCH_THRESHOLDS = {
144
- minCombinedScore: 0.92,
145
- minGap: 0.03,
146
- suggestionThreshold: 0.75
147
- };
148
-
149
- // 확장
150
- export type EntityType = 'task' | 'condition' | 'artifact';
151
- export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'done' | 'cancelled';
152
- ```
153
-
154
- ### 4.2 canonical-key.ts
155
-
156
- 현재 함수 확장:
157
-
158
- ```typescript
159
- // 기존: 이벤트용 canonical key
160
- export function makeCanonicalKey(title: string, context?: {...}): string;
161
-
162
- // 확장: 엔티티 타입별 canonical key
163
- export function makeEntityCanonicalKey(
164
- entityType: EntityType,
165
- identifier: string,
166
- context?: { project?: string }
167
- ): string {
168
- switch (entityType) {
169
- case 'task':
170
- return `task:${context?.project ?? 'default'}:${normalize(identifier)}`;
171
- case 'condition':
172
- return `cond:${context?.project ?? 'default'}:${normalize(identifier)}`;
173
- case 'artifact':
174
- return makeArtifactKey(identifier);
175
- }
176
- }
177
- ```
178
-
179
- ### 4.3 event-store.ts
180
-
181
- 현재 EventStore 활용:
182
-
183
- ```typescript
184
- // 기존 append 메서드 재활용
185
- // Task 이벤트도 동일하게 append-only로 저장
186
- const event = {
187
- eventType: 'task_created',
188
- sessionId,
189
- content: JSON.stringify(payload),
190
- ...
191
- };
192
- await eventStore.append(event);
193
- ```
194
-
195
- ### 4.4 matcher.ts
196
-
197
- 현재 Matcher 로직 확장:
198
-
199
- ```typescript
200
- // 기존: 이벤트 매칭
201
- export class Matcher {
202
- matchSearchResults(results: SearchResult[]): MatchResult;
203
- }
204
-
205
- // 확장: Task 매칭에도 동일 로직 적용
206
- export class TaskMatcher {
207
- // MATCH_THRESHOLDS 재활용
208
- findSimilar(title: string, project: string): MatchResult;
209
- }
210
- ```
211
-
212
- ## 5. 경계 조건
213
-
214
- ### 5.1 Unknown Blocker 처리
215
-
216
- ```typescript
217
- // Task가 blocked인데 blockedBy가 비어있으면
218
- if (task.status === 'blocked' && blockedByTexts.length === 0) {
219
- // 자동으로 placeholder condition 생성
220
- const placeholder = await createCondition({
221
- text: `Unknown blocker for ${task.title}`,
222
- meta: { auto_placeholder: true }
223
- });
224
- blockers.push({ kind: 'condition', entity_id: placeholder.id });
225
- }
226
- ```
227
-
228
- ### 5.2 상태 전이 거부
229
-
230
- ```typescript
231
- // pending → done 직접 전이 시
232
- if (from === 'pending' && to === 'done') {
233
- // task_transition_rejected 이벤트 발행
234
- await eventStore.append({
235
- eventType: 'task_transition_rejected',
236
- content: JSON.stringify({
237
- task_id: task.id,
238
- from_status: 'pending',
239
- to_status: 'done',
240
- reason: 'Direct transition from pending to done is not allowed'
241
- })
242
- });
243
-
244
- // in_progress로 보정
245
- return 'in_progress';
246
- }
247
- ```
248
-
249
- ### 5.3 Condition → Task 해결
250
-
251
- ```typescript
252
- // 나중에 "API 키 설정됨" condition이 실제 Task로 식별되면
253
- await eventStore.append({
254
- eventType: 'condition_resolved_to',
255
- content: JSON.stringify({
256
- condition_id: 'cond_xyz',
257
- resolved_to: { kind: 'task', entity_id: 'task_abc' }
258
- })
259
- });
260
- ```
261
-
262
- ## 6. 성능 고려사항
263
-
264
- ### 6.1 캐싱
265
-
266
- ```typescript
267
- // Entity 조회 캐시 (LRU)
268
- const entityCache = new LRUCache<string, Entity>({
269
- max: 1000,
270
- ttl: 1000 * 60 * 5 // 5분
271
- });
272
- ```
273
-
274
- ### 6.2 배치 처리
275
-
276
- ```typescript
277
- // Projector는 배치로 이벤트 처리
278
- const BATCH_SIZE = 100;
279
- const events = await eventStore.fetchSince(offset, { limit: BATCH_SIZE });
280
- ```
281
-
282
- ### 6.3 인덱스 활용
283
-
284
- ```sql
285
- -- FTS 검색용
286
- CREATE INDEX idx_entities_search ON entities USING GIN(to_tsvector('english', search_text));
287
-
288
- -- canonical_key 조회용
289
- CREATE INDEX idx_entities_type_key ON entities(entity_type, canonical_key);
290
- ```
291
-
292
- ## 7. 참고 자료
293
-
294
- - **Memo.txt**: AxiomMind Memory Graduation Pipeline 지시서
295
- - **spec.md**: `src/core/types.ts` - 기존 타입 정의
296
- - **AXIOMMIND 원칙**: Principle 5 - Task는 Entity
297
- - **Idris2 개념**: Dependent types, Linear types
@@ -1,301 +0,0 @@
1
- # Task Entity System Implementation Plan
2
-
3
- > **Version**: 1.0.0
4
- > **Status**: Draft
5
- > **Created**: 2026-01-31
6
-
7
- ## Phase 1: 기반 구조 (P0)
8
-
9
- ### 1.1 타입 정의
10
-
11
- **파일**: `src/core/types.ts` 수정
12
-
13
- ```typescript
14
- // 추가할 타입들
15
- export const EntityTypeSchema = z.enum(['task', 'condition', 'artifact']);
16
- export type EntityType = z.infer<typeof EntityTypeSchema>;
17
-
18
- export const TaskStatusSchema = z.enum(['pending', 'in_progress', 'blocked', 'done', 'cancelled']);
19
- export type TaskStatus = z.infer<typeof TaskStatusSchema>;
20
-
21
- export const TaskEventTypeSchema = z.enum([
22
- 'task_created',
23
- 'task_status_changed',
24
- 'task_priority_changed',
25
- 'task_blockers_set',
26
- 'task_transition_rejected'
27
- ]);
28
- ```
29
-
30
- **작업 항목**:
31
- - [ ] EntityType, TaskStatus 스키마 추가
32
- - [ ] TaskEvent 타입 정의
33
- - [ ] BlockerRef 타입 정의
34
- - [ ] TaskState Discriminated Union 정의
35
-
36
- ### 1.2 DB 스키마 추가
37
-
38
- **파일**: `src/core/schema.sql` 수정
39
-
40
- **작업 항목**:
41
- - [ ] entities 테이블 생성
42
- - [ ] entity_aliases 테이블 생성
43
- - [ ] edges 테이블 생성
44
- - [ ] 인덱스 추가
45
-
46
- ### 1.3 Canonical Key 확장
47
-
48
- **파일**: `src/core/canonical-key.ts` 수정
49
-
50
- ```typescript
51
- // 추가할 함수
52
- export function makeEntityCanonicalKey(
53
- entityType: EntityType,
54
- identifier: string,
55
- context?: { project?: string }
56
- ): string;
57
- ```
58
-
59
- **작업 항목**:
60
- - [ ] Task canonical key 함수
61
- - [ ] Condition canonical key 함수
62
- - [ ] Artifact canonical key 함수 (URL, JIRA, GitHub 패턴)
63
-
64
- ## Phase 2: 핵심 컴포넌트 (P0)
65
-
66
- ### 2.1 EntityRepository
67
-
68
- **파일**: `src/core/entity-repo.ts` (신규)
69
-
70
- ```typescript
71
- export class EntityRepository {
72
- constructor(private db: Database);
73
-
74
- // CRUD (Create, Read만 - append-only 철학)
75
- async create(entity: EntityInput): Promise<Entity>;
76
- async findById(entityId: string): Promise<Entity | null>;
77
- async findByCanonicalKey(type: EntityType, key: string): Promise<Entity | null>;
78
-
79
- // 검색
80
- async findSimilar(type: EntityType, searchText: string): Promise<Entity[]>;
81
-
82
- // Alias 관리
83
- async addAlias(entityId: string, alias: string): Promise<void>;
84
- async resolveAlias(type: EntityType, alias: string): Promise<string | null>;
85
-
86
- // 상태 업데이트 (이벤트 발행 후 projector가 호출)
87
- async updateCurrentState(entityId: string, state: EntityState): Promise<void>;
88
- }
89
- ```
90
-
91
- **작업 항목**:
92
- - [ ] EntityRepository 클래스 구현
93
- - [ ] findByCanonicalKey 구현
94
- - [ ] findSimilar 구현 (FTS 활용)
95
- - [ ] alias 관리 메서드 구현
96
-
97
- ### 2.2 TaskMatcher
98
-
99
- **파일**: `src/core/task-matcher.ts` (신규)
100
-
101
- ```typescript
102
- export class TaskMatcher {
103
- constructor(
104
- private entityRepo: EntityRepository,
105
- private vectorStore: VectorStore
106
- );
107
-
108
- async findExact(canonicalKey: string): Promise<Task | null>;
109
- async findSimilar(title: string, project: string): Promise<MatchResult>;
110
- async suggestCandidates(title: string, project: string, limit?: number): Promise<Task[]>;
111
- }
112
- ```
113
-
114
- **작업 항목**:
115
- - [ ] 정확 매칭 (entity_aliases 활용)
116
- - [ ] FTS 기반 유사 매칭
117
- - [ ] Vector 기반 semantic 매칭
118
- - [ ] 점수 계산 (stage weight, status weight, recency)
119
- - [ ] strict 확정 로직 (score >= 0.92, gap >= 0.03)
120
-
121
- ### 2.3 BlockerResolver
122
-
123
- **파일**: `src/core/blocker-resolver.ts` (신규)
124
-
125
- **작업 항목**:
126
- - [ ] URL/JIRA/GitHub 패턴 감지
127
- - [ ] Artifact get-or-create 로직
128
- - [ ] Task 제목 매칭 시도
129
- - [ ] Condition fallback 생성
130
- - [ ] candidates 저장 로직
131
-
132
- ### 2.4 TaskResolver
133
-
134
- **파일**: `src/core/task-resolver.ts` (신규)
135
-
136
- **작업 항목**:
137
- - [ ] Task entry 처리 로직
138
- - [ ] 기존 Task 찾기 (TaskMatcher 활용)
139
- - [ ] 이벤트 발행 로직
140
- - [ ] 상태 전이 검증
141
- - [ ] blockers 정규화 (BlockerResolver 활용)
142
-
143
- ## Phase 3: Projection (P0)
144
-
145
- ### 3.1 TaskProjector
146
-
147
- **파일**: `src/core/task-projector.ts` (신규)
148
-
149
- ```typescript
150
- export class TaskProjector {
151
- constructor(
152
- private eventStore: EventStore,
153
- private entityRepo: EntityRepository,
154
- private edgeRepo: EdgeRepository
155
- );
156
-
157
- async projectIncremental(): Promise<ProjectionResult>;
158
- async rebuild(): Promise<void>;
159
-
160
- private async handleTaskCreated(event: TaskEvent): Promise<void>;
161
- private async handleStatusChanged(event: TaskEvent): Promise<void>;
162
- private async handleBlockersSet(event: TaskEvent): Promise<void>;
163
- }
164
- ```
165
-
166
- **작업 항목**:
167
- - [ ] projection_offsets 관리
168
- - [ ] 증분 이벤트 읽기
169
- - [ ] 이벤트 타입별 핸들러
170
- - [ ] mode=replace 처리 (기존 edge 삭제 + 새 edge 삽입)
171
- - [ ] mode=suggest 처리 (suggested edge만)
172
- - [ ] current_json 갱신
173
-
174
- ### 3.2 EdgeRepository
175
-
176
- **파일**: `src/core/edge-repo.ts` (신규)
177
-
178
- ```typescript
179
- export class EdgeRepository {
180
- async createEdge(edge: EdgeInput): Promise<Edge>;
181
- async findEdges(srcId: string, relType?: string): Promise<Edge[]>;
182
- async deleteEdges(srcId: string, relType: string): Promise<number>;
183
- async replaceEdges(srcId: string, relType: string, newEdges: EdgeInput[]): Promise<void>;
184
- }
185
- ```
186
-
187
- **작업 항목**:
188
- - [ ] Edge CRUD 구현
189
- - [ ] 관계 타입별 조회
190
- - [ ] replace 로직 (트랜잭션)
191
-
192
- ## Phase 4: 통합 (P0)
193
-
194
- ### 4.1 Graduation Pipeline 연동
195
-
196
- **파일**: `src/core/graduation.ts` 수정
197
-
198
- **작업 항목**:
199
- - [ ] Task entry 처리 시 TaskResolver 호출
200
- - [ ] 이벤트 발행 후 TaskProjector 호출
201
- - [ ] evidence edge 생성 로직
202
-
203
- ### 4.2 EventStore 확장
204
-
205
- **파일**: `src/core/event-store.ts` 수정
206
-
207
- **작업 항목**:
208
- - [ ] Task 이벤트 타입 지원
209
- - [ ] fetch_since 메서드 추가 (projector용)
210
- - [ ] replay 메서드 추가 (rebuild용)
211
-
212
- ## Phase 5: CLI 및 조회 (P1)
213
-
214
- ### 5.1 조회 API
215
-
216
- **작업 항목**:
217
- - [ ] list_blocked_tasks()
218
- - [ ] list_tasks_with_only_suggested_blockers()
219
- - [ ] get_task_detail(task_id)
220
- - [ ] v_task_blockers_effective 뷰
221
-
222
- ### 5.2 CLI 커맨드
223
-
224
- **파일**: `src/cli/index.ts` 수정
225
-
226
- **작업 항목**:
227
- - [ ] `cli blocked` - blocked task 목록
228
- - [ ] `cli task show <task_id>` - task 상세
229
- - [ ] `cli tasks --status <status>` - 상태별 목록
230
-
231
- ## 파일 목록
232
-
233
- ### 신규 파일
234
- ```
235
- src/core/entity-repo.ts
236
- src/core/edge-repo.ts
237
- src/core/task-matcher.ts
238
- src/core/blocker-resolver.ts
239
- src/core/task-resolver.ts
240
- src/core/task-projector.ts
241
- ```
242
-
243
- ### 수정 파일
244
- ```
245
- src/core/types.ts
246
- src/core/canonical-key.ts
247
- src/core/event-store.ts
248
- src/core/graduation.ts
249
- src/cli/index.ts
250
- ```
251
-
252
- ## 테스트
253
-
254
- ### 필수 테스트 케이스
255
-
256
- 1. **Task 동일성**
257
- - 같은 제목의 Task가 여러 세션에서 언급되어도 하나의 Entity로 관리
258
-
259
- 2. **상태 전이**
260
- - pending → done 직접 전이 시 에러
261
- - blocked 상태에서 blockers가 비어있으면 에러
262
-
263
- 3. **Idempotency**
264
- - 동일 세션 재처리 시 중복 이벤트 없음
265
- - 동일 edge 중복 생성 없음
266
-
267
- 4. **Blocker 해결**
268
- - URL → Artifact 정상 생성
269
- - Task 제목 매칭 실패 → Condition 생성 + candidates 저장
270
-
271
- ## 의존성 그래프
272
-
273
- ```
274
- types.ts
275
-
276
- ├── entity-repo.ts
277
- │ │
278
- │ ├── task-matcher.ts
279
- │ │
280
- │ └── edge-repo.ts
281
- │ │
282
- │ └── task-projector.ts
283
-
284
- ├── blocker-resolver.ts ─────────┐
285
- │ │
286
- └── task-resolver.ts ◀───────────┘
287
-
288
- └── graduation.ts
289
- ```
290
-
291
- ## 마일스톤
292
-
293
- | 단계 | 완료 기준 |
294
- |------|----------|
295
- | M1 | 타입 정의 + DB 스키마 |
296
- | M2 | EntityRepo + EdgeRepo 동작 |
297
- | M3 | TaskMatcher 동작 (정확 매칭만) |
298
- | M4 | BlockerResolver + TaskResolver 동작 |
299
- | M5 | TaskProjector 동작 (증분 처리) |
300
- | M6 | Graduation 연동 완료 |
301
- | M7 | CLI 조회 커맨드 완료 |