memorytrace 0.4.0__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. {memorytrace-0.4.0 → memorytrace-0.5.0}/PKG-INFO +1 -1
  2. memorytrace-0.5.0/docs/06-reference-comparison/01-overview.md +77 -0
  3. memorytrace-0.5.0/docs/06-reference-comparison/02-architecture-changes.md +208 -0
  4. memorytrace-0.5.0/docs/06-reference-comparison/03-shared-features.md +145 -0
  5. memorytrace-0.5.0/docs/06-reference-comparison/04-new-features.md +198 -0
  6. memorytrace-0.5.0/docs/06-reference-comparison/05-missing-features.md +161 -0
  7. memorytrace-0.5.0/docs/06-reference-comparison/06-risks-and-recommendations.md +140 -0
  8. memorytrace-0.5.0/docs/06-reference-comparison/07-practical-feature-selection.md +179 -0
  9. memorytrace-0.5.0/docs/superpowers/plans/2026-04-16-context-search-handoff-operations.md +1810 -0
  10. memorytrace-0.5.0/docs/superpowers/specs/2026-04-16-context-search-handoff-operations-design.md +634 -0
  11. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/cli/app.py +204 -52
  12. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/engine.py +688 -215
  13. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/integrations/mcp_server.py +152 -18
  14. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/integrations/sdk.py +139 -48
  15. memorytrace-0.5.0/engram/maintenance/review.py +108 -0
  16. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/maintenance/service.py +10 -2
  17. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/__init__.py +4 -4
  18. memorytrace-0.5.0/engram/models/context_pack.py +60 -0
  19. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/fact.py +64 -23
  20. memorytrace-0.5.0/engram/models/operations.py +78 -0
  21. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/search.py +26 -2
  22. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/session.py +10 -9
  23. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/view.py +36 -8
  24. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/search/__init__.py +13 -11
  25. memorytrace-0.5.0/engram/search/contextual.py +278 -0
  26. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/search/fts5_search.py +30 -8
  27. memorytrace-0.5.0/engram/search/planner.py +46 -0
  28. memorytrace-0.5.0/engram/search/reranker.py +68 -0
  29. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/session/brief.py +19 -15
  30. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/session/context.py +78 -29
  31. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/session/manager.py +62 -18
  32. memorytrace-0.5.0/engram/session/transfer.py +308 -0
  33. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/storage/base.py +87 -67
  34. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/storage/migrations.py +33 -5
  35. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/storage/sqlite_store.py +316 -259
  36. {memorytrace-0.4.0 → memorytrace-0.5.0}/pyproject.toml +1 -1
  37. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_cli/test_app.py +167 -54
  38. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_e2e.py +5 -4
  39. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_engine.py +395 -282
  40. memorytrace-0.5.0/tests/test_integrations/test_mcp_server.py +51 -0
  41. memorytrace-0.5.0/tests/test_integrations/test_sdk.py +130 -0
  42. memorytrace-0.5.0/tests/test_maintenance/test_review.py +51 -0
  43. memorytrace-0.5.0/tests/test_search/test_contextual.py +288 -0
  44. memorytrace-0.5.0/tests/test_search/test_planner.py +11 -0
  45. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_session/test_brief.py +35 -17
  46. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_session/test_manager.py +39 -11
  47. memorytrace-0.5.0/tests/test_session/test_transfer.py +387 -0
  48. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_storage/test_migrations.py +93 -72
  49. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_storage/test_sqlite_store.py +81 -21
  50. memorytrace-0.4.0/claude-setup/.claude/agents/evaluator.md +0 -83
  51. memorytrace-0.4.0/claude-setup/.claude/agents/planner.md +0 -50
  52. memorytrace-0.4.0/claude-setup/.claude/agents/researcher.md +0 -19
  53. memorytrace-0.4.0/claude-setup/.claude/agents/security-reviewer.md +0 -36
  54. memorytrace-0.4.0/claude-setup/.claude/hooks/README.md +0 -46
  55. memorytrace-0.4.0/claude-setup/.claude/hooks/on-stop-checkpoint.sh +0 -25
  56. memorytrace-0.4.0/claude-setup/.claude/hooks/on-stop-verify.sh +0 -40
  57. memorytrace-0.4.0/claude-setup/.claude/hooks/post-edit-completeness.sh +0 -55
  58. memorytrace-0.4.0/claude-setup/.claude/hooks/post-edit-lint.sh +0 -34
  59. memorytrace-0.4.0/claude-setup/.claude/hooks/post-edit-robustness.sh +0 -70
  60. memorytrace-0.4.0/claude-setup/.claude/hooks/pre-compact-save.sh +0 -25
  61. memorytrace-0.4.0/claude-setup/.claude/hooks/session-memory-load.sh +0 -35
  62. memorytrace-0.4.0/claude-setup/.claude/hooks/stop-memory-save.sh +0 -52
  63. memorytrace-0.4.0/claude-setup/.claude/rules/harness-design.md +0 -12
  64. memorytrace-0.4.0/claude-setup/.claude/rules/production-robustness.md +0 -85
  65. memorytrace-0.4.0/claude-setup/.claude/settings.json +0 -123
  66. memorytrace-0.4.0/claude-setup/.claude/skills/deploy/SKILL.md +0 -21
  67. memorytrace-0.4.0/claude-setup/.claude/skills/memory-context/SKILL.md +0 -30
  68. memorytrace-0.4.0/claude-setup/.claude/skills/memory-find/SKILL.md +0 -29
  69. memorytrace-0.4.0/claude-setup/.claude/skills/memory-save/SKILL.md +0 -30
  70. memorytrace-0.4.0/claude-setup/.claude/skills/review/SKILL.md +0 -77
  71. memorytrace-0.4.0/claude-setup/.claude/skills/sprint/SKILL.md +0 -62
  72. memorytrace-0.4.0/claude-setup/.claude/skills/thorough/SKILL.md +0 -49
  73. memorytrace-0.4.0/claude-setup/.gitignore +0 -11
  74. memorytrace-0.4.0/claude-setup/CLAUDE.md +0 -141
  75. memorytrace-0.4.0/claude-setup/README.md +0 -62
  76. memorytrace-0.4.0/claude-setup/blog-post.md +0 -199
  77. memorytrace-0.4.0/claude-setup/install.sh +0 -290
  78. memorytrace-0.4.0/engram/search/reranker.py +0 -50
  79. memorytrace-0.4.0/tests/test_integrations/test_mcp_server.py +0 -12
  80. {memorytrace-0.4.0 → memorytrace-0.5.0}/.agents/skills/deploy/SKILL.md +0 -0
  81. {memorytrace-0.4.0 → memorytrace-0.5.0}/.agents/skills/review/SKILL.md +0 -0
  82. {memorytrace-0.4.0 → memorytrace-0.5.0}/.agents/skills/sprint/SKILL.md +0 -0
  83. {memorytrace-0.4.0 → memorytrace-0.5.0}/.claude/skills/deploy/SKILL.md +0 -0
  84. {memorytrace-0.4.0 → memorytrace-0.5.0}/.claude/skills/review/SKILL.md +0 -0
  85. {memorytrace-0.4.0 → memorytrace-0.5.0}/.claude/skills/sprint/SKILL.md +0 -0
  86. {memorytrace-0.4.0 → memorytrace-0.5.0}/.claude/workspace/evaluation.md +0 -0
  87. {memorytrace-0.4.0 → memorytrace-0.5.0}/.gitignore +0 -0
  88. {memorytrace-0.4.0 → memorytrace-0.5.0}/AGENTS.md +0 -0
  89. {memorytrace-0.4.0 → memorytrace-0.5.0}/CLAUDE.md +0 -0
  90. {memorytrace-0.4.0 → memorytrace-0.5.0}/LICENSE +0 -0
  91. {memorytrace-0.4.0 → memorytrace-0.5.0}/README.md +0 -0
  92. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/01-project-analysis/04-directory-structure.md +0 -0
  93. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/01-project-analysis/05-cli-commands.md +0 -0
  94. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/01-project-analysis/09-setup-guide.md +0 -0
  95. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/02-problem-analysis/14-engram-code-review-2026-04-12.md +0 -0
  96. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/02-problem-analysis/15-engram-code-review-followup-2026-04-12.md +0 -0
  97. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/02-problem-analysis/16-engram-code-review-round3-2026-04-12.md +0 -0
  98. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/02-problem-analysis/17-engram-code-review-round4-and-korean-ner-plan-2026-04-12.md +0 -0
  99. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/02-problem-analysis/18-engram-cli-ux-issues-2026-04-13.md +0 -0
  100. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/03-improvement-plan/23-engram-next-capabilities-roadmap-2026-04-16.md +0 -0
  101. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/04-usage-guide/01-quickstart.md +0 -0
  102. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/04-usage-guide/02-claude-code-setup.md +0 -0
  103. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/05-windows-compatibility/windows-encoding.md +0 -0
  104. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/README.md +0 -0
  105. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-backlinks-decisions-maintenance.md +0 -0
  106. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-entity-governance.md +0 -0
  107. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-follow-up-task-recommendations.md +0 -0
  108. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-freshness-verification.md +0 -0
  109. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-goal-aware-retrieval-reranking.md +0 -0
  110. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-governance-split-merge-recommendations.md +0 -0
  111. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-phase0-provenance-trace.md +0 -0
  112. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-projection-reranking-phase1.md +0 -0
  113. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-retention-recommendations.md +0 -0
  114. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/plans/2026-04-16-scoped-memory-job-runner.md +0 -0
  115. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-backlinks-decisions-maintenance-design.md +0 -0
  116. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-entity-governance-design.md +0 -0
  117. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-follow-up-task-recommendations-design.md +0 -0
  118. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-freshness-verification-design.md +0 -0
  119. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-governance-split-merge-recommendations-design.md +0 -0
  120. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-phase0-provenance-trace-design.md +0 -0
  121. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-projection-reranking-phase1-design.md +0 -0
  122. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-retention-recommendations-design.md +0 -0
  123. {memorytrace-0.4.0 → memorytrace-0.5.0}/docs/superpowers/specs/2026-04-16-scoped-memory-job-runner-design.md +0 -0
  124. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/__init__.py +0 -0
  125. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/__main__.py +0 -0
  126. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/cli/__init__.py +0 -0
  127. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/cli/formatters.py +0 -0
  128. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/cli/simple.py +0 -0
  129. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/config.py +0 -0
  130. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/debug/__init__.py +0 -0
  131. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/debug/service.py +0 -0
  132. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/decisions/__init__.py +0 -0
  133. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/decisions/service.py +0 -0
  134. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/exceptions.py +0 -0
  135. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/explanations/__init__.py +0 -0
  136. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/explanations/builder.py +0 -0
  137. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/__init__.py +0 -0
  138. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/base.py +0 -0
  139. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/llm_extractor.py +0 -0
  140. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/ner/__init__.py +0 -0
  141. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/ner/cjk.py +0 -0
  142. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/ner/english.py +0 -0
  143. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/ner/korean.py +0 -0
  144. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/extraction/regex_extractor.py +0 -0
  145. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/freshness/__init__.py +0 -0
  146. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/freshness/service.py +0 -0
  147. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/governance/__init__.py +0 -0
  148. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/governance/service.py +0 -0
  149. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/intake/__init__.py +0 -0
  150. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/intake/service.py +0 -0
  151. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/integrations/__init__.py +0 -0
  152. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/jobs/__init__.py +0 -0
  153. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/jobs/service.py +0 -0
  154. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/maintenance/__init__.py +0 -0
  155. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/brief.py +0 -0
  156. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/debug.py +0 -0
  157. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/decision.py +0 -0
  158. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/entity.py +0 -0
  159. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/explanation.py +0 -0
  160. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/governance.py +0 -0
  161. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/health.py +0 -0
  162. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/intake.py +0 -0
  163. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/job.py +0 -0
  164. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/maintenance.py +0 -0
  165. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/memory_type.py +0 -0
  166. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/quality.py +0 -0
  167. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/reference.py +0 -0
  168. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/relation.py +0 -0
  169. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/retention.py +0 -0
  170. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/scope.py +0 -0
  171. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/snapshot.py +0 -0
  172. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/source.py +0 -0
  173. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/models/verification.py +0 -0
  174. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/__init__.py +0 -0
  175. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/confidence.py +0 -0
  176. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/conflict.py +0 -0
  177. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/decay.py +0 -0
  178. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/decay_policy.py +0 -0
  179. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/diagnostics.py +0 -0
  180. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/gate.py +0 -0
  181. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/quality/pii.py +0 -0
  182. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/recommendations/__init__.py +0 -0
  183. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/recommendations/service.py +0 -0
  184. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/references/__init__.py +0 -0
  185. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/references/service.py +0 -0
  186. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/retention/__init__.py +0 -0
  187. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/retention/service.py +0 -0
  188. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/safety/__init__.py +0 -0
  189. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/safety/paths.py +0 -0
  190. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/scopes/__init__.py +0 -0
  191. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/scopes/service.py +0 -0
  192. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/search/base.py +0 -0
  193. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/search/hybrid.py +0 -0
  194. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/search/semantic.py +0 -0
  195. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/search/tokenizer.py +0 -0
  196. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/session/__init__.py +0 -0
  197. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/session/working_memory.py +0 -0
  198. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/snapshots/__init__.py +0 -0
  199. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/snapshots/service.py +0 -0
  200. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/storage/__init__.py +0 -0
  201. {memorytrace-0.4.0 → memorytrace-0.5.0}/engram/storage/markdown_export.py +0 -0
  202. {memorytrace-0.4.0 → memorytrace-0.5.0}/mem +0 -0
  203. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/__init__.py +0 -0
  204. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/conftest.py +0 -0
  205. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/fixtures/__init__.py +0 -0
  206. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/fixtures/explanation_scenarios.py +0 -0
  207. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/fixtures/retrieval_scenarios.py +0 -0
  208. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_cli/__init__.py +0 -0
  209. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_cli/test_entrypoints.py +0 -0
  210. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_debug/__init__.py +0 -0
  211. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_debug/test_service.py +0 -0
  212. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_decisions/__init__.py +0 -0
  213. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_decisions/test_service.py +0 -0
  214. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_engine_security.py +0 -0
  215. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_explanations/test_builder.py +0 -0
  216. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_extraction/__init__.py +0 -0
  217. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_extraction/test_llm_extractor.py +0 -0
  218. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_extraction/test_ner/__init__.py +0 -0
  219. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_extraction/test_ner/test_english.py +0 -0
  220. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_extraction/test_ner/test_korean.py +0 -0
  221. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_extraction/test_regex_extractor.py +0 -0
  222. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_freshness/test_service.py +0 -0
  223. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_governance/test_entity_governance.py +0 -0
  224. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_intake/__init__.py +0 -0
  225. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_intake/test_security.py +0 -0
  226. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_intake/test_service.py +0 -0
  227. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_integrations/__init__.py +0 -0
  228. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_jobs/__init__.py +0 -0
  229. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_jobs/test_service.py +0 -0
  230. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_logic_round4.py +0 -0
  231. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_logic_round5.py +0 -0
  232. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_logic_round6.py +0 -0
  233. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_maintenance/__init__.py +0 -0
  234. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_maintenance/test_service.py +0 -0
  235. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_perf_round7.py +0 -0
  236. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_perf_round8.py +0 -0
  237. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_perf_round9.py +0 -0
  238. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_quality/__init__.py +0 -0
  239. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_quality/test_confidence.py +0 -0
  240. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_quality/test_conflict.py +0 -0
  241. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_quality/test_diagnostics.py +0 -0
  242. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_quality/test_gate.py +0 -0
  243. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_quality/test_memory_type.py +0 -0
  244. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_quality/test_pii.py +0 -0
  245. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_references/__init__.py +0 -0
  246. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_references/test_service.py +0 -0
  247. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_retention/test_retention_service.py +0 -0
  248. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_scopes/__init__.py +0 -0
  249. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_scopes/test_service.py +0 -0
  250. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_search/__init__.py +0 -0
  251. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_search/test_fts5_search.py +0 -0
  252. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_search/test_reranker.py +0 -0
  253. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_search/test_semantic.py +0 -0
  254. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_search/test_tokenizer.py +0 -0
  255. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_security_round3.py +0 -0
  256. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_session/__init__.py +0 -0
  257. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_session/test_working_memory.py +0 -0
  258. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_snapshots/__init__.py +0 -0
  259. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_snapshots/test_security.py +0 -0
  260. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_snapshots/test_service.py +0 -0
  261. {memorytrace-0.4.0 → memorytrace-0.5.0}/tests/test_storage/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memorytrace
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: AI agent memory system with SQLite+FTS5, MCP integration, and quality gates
5
5
  Project-URL: Homepage, https://github.com/aop60003/default
6
6
  Project-URL: Issues, https://github.com/aop60003/default/issues
@@ -0,0 +1,77 @@
1
+ # ?? ?? vs Engram 비교 분석
2
+
3
+ > **원격**: ?? ???? ????? (?? ?? ??)
4
+ > **로컬**: Engram (v0.3.1, PyPI: `memorytrace`)
5
+ > **분석일**: 2026-04-16
6
+
7
+ ## 프로젝트 개요
8
+
9
+ | 관점 | ?? ?? | Engram |
10
+ |------|----------|--------|
11
+ | **한줄 요약** | Zero-dependency compound knowledge system for AI agents | AI 에이전트를 위한 지속적·구조적·신뢰할 수 있는 메모리 시스템 |
12
+ | **코어 구조** | 단일 클래스 모놀리스 (`core.py` ~4,362줄) | 모듈형 아키텍처 (models/storage/search/quality/session/cli + 12개 feature service) |
13
+ | **저장소** | Plain Markdown 파일 (디렉토리 기반) | SQLite + FTS5 (+ 선택적 Markdown 내보내기) |
14
+ | **검색** | difflib + IDF + fuzzy (stdlib) | FTS5 BM25 + Reranker + 선택적 시맨틱 |
15
+ | **의존성** | Zero (stdlib only) | Zero core (LLM/semantic은 optional extras) |
16
+ | **에이전트 통합** | CLI + Python SDK | MCP 서버 + CLI + Python SDK |
17
+ | **출력 방식** | `print()` 직접 출력 | 구조화된 객체 반환 (core에 print 없음) |
18
+ | **스키마 관리** | 없음 (파일 기반) | 11단계 마이그레이션 시스템 |
19
+ | **언어 지원** | EN/KR/CN/JP NER | EN/KR/CN/JP NER (한국어 문맥 기반으로 개선) |
20
+ | **테스트** | 7개 파일 | 30+ 파일, 기능별 디렉토리 분리 |
21
+ | **라이선스** | MIT | MIT |
22
+
23
+ ## 디렉토리 구조 비교
24
+
25
+ ### ?? ??
26
+
27
+ ```
28
+ src/reference/
29
+ ├── __init__.py
30
+ ├── core.py # ~4,362줄, 전체 로직이 하나의 클래스에 집중
31
+ ├── cli.py # ~600줄, argparse CLI 래퍼
32
+ ├── stopwords.json # ~813줄 (KR/CN/JP 불용어)
33
+ └── templates/
34
+ ├── RESOLVER.md # MECE 분류 결정 트리
35
+ └── TEMPLATES.md # 엔티티/회사 페이지 템플릿
36
+ ```
37
+
38
+ ### Engram
39
+
40
+ ```
41
+ engram/
42
+ ├── models/ # 20개 순수 데이터클래스 (entity, fact, source, relation, session, ...)
43
+ ├── storage/ # SQLite+FTS5 백엔드 + 마이그레이션 (v1~v11) + Markdown 내보내기
44
+ ├── search/ # FTS5 BM25 + 시맨틱 + 하이브리드 + 리랭커 + 토크나이저
45
+ ├── extraction/ # regex NER (EN/KR/CJK) + LLM 추출기
46
+ ├── quality/ # confidence, conflict, decay, PII, diagnostics, gate
47
+ ├── session/ # manager, brief, context, working_memory
48
+ ├── cli/ # app.py, formatters.py, simple.py
49
+ ├── integrations/ # MCP 서버 + Python SDK
50
+ ├── safety/ # 경로 안전성 검증
51
+ ├── debug/ # 가설 기반 디버그 서비스
52
+ ├── decisions/ # 의사결정 추적 서비스
53
+ ├── explanations/ # 프로비넌스 추적 빌더
54
+ ├── intake/ # 단계적 쓰기 파이프라인
55
+ ├── maintenance/ # 유지보수 실행 기록
56
+ ├── references/ # 백링크 프로젝션
57
+ ├── snapshots/ # 시점 백업 + 시간여행 쿼리
58
+ ├── freshness/ # 신선도 검증 (미커밋)
59
+ ├── governance/ # 엔티티 거버넌스 (미커밋)
60
+ ├── jobs/ # 작업 큐 (미커밋)
61
+ ├── recommendations/ # 추천 서비스 (미커밋)
62
+ ├── retention/ # 보존 정책 (미커밋)
63
+ └── scopes/ # 스코프 메모리 (미커밋)
64
+ ```
65
+
66
+ ## 문서 구성
67
+
68
+ | 문서 | 내용 |
69
+ |------|------|
70
+ | [01-overview.md](./01-overview.md) | 프로젝트 개요 및 구조 비교 (이 문서) |
71
+ | [02-architecture-changes.md](./02-architecture-changes.md) | 핵심 아키텍처 변경 분석 (저장소, 모듈화, 검색, 품질 게이트, MCP) |
72
+ | [03-shared-features.md](./03-shared-features.md) | 공유 기능 비교 (양쪽 모두 존재하는 기능의 구현 차이) |
73
+ | [04-new-features.md](./04-new-features.md) | Engram 신규 기능 유효성 분석 (6개 신규 기능) |
74
+ | [05-missing-features.md](./05-missing-features.md) | ?? ??에만 존재하는 기능 (Engram 누락 분석) |
75
+ | [06-risks-and-recommendations.md](./06-risks-and-recommendations.md) | 리스크, 개선 권고, 결론 |
76
+ | [07-practical-feature-selection.md](./07-practical-feature-selection.md) | Engram에 실질적으로 필요한 기능만 다시 추린 결론 문서 |
77
+
@@ -0,0 +1,208 @@
1
+ # 핵심 아키텍처 변경 분석
2
+
3
+ ?? ?? → Engram 전환에서 발생한 5가지 핵심 아키텍처 변경을 분석한다.
4
+
5
+ ---
6
+
7
+ ## 1. 저장소: Markdown 파일 → SQLite+FTS5
8
+
9
+ ### 변경 내용
10
+
11
+ ?? ??는 디렉토리 기반 Markdown 파일에 모든 데이터를 저장한다. 엔티티는 `entities/`, `live-notes/` 디렉토리에, 의사결정은 `decisions/`에, 세션 이벤트는 `sessions/`에 JSONL로 기록된다.
12
+
13
+ Engram은 SQLite 단일 파일에 20+ 테이블로 구조화된 스키마를 사용한다. WAL 모드, 외래키 강제, busy_timeout 5000ms가 적용되며, 선택적으로 Markdown 내보내기(`MarkdownExporter`)를 지원한다.
14
+
15
+ ### 평가
16
+
17
+ | 항목 | 평가 |
18
+ |------|------|
19
+ | **유효성** | **유효함** — ACID 트랜잭션, 원자적 쓰기, 서브밀리초 쿼리, FTS5 전문 검색 지원 |
20
+ | **필요성** | **필수** — FTS5 전문 검색, 충돌 검사의 원자적 처리, 동시 접근은 파일 기반으로 불가능 |
21
+ | **품질** | **보통** |
22
+
23
+ ### 구현 상세
24
+
25
+ **강점**:
26
+ - `threading.local()` 기반 thread-local 연결로 SQLite 스레딩 이슈 방지
27
+ - 모든 쓰기 작업에 명시적 rollback 처리
28
+ - 파일 생성 시 `0o600` 권한 설정 (보안 위생)
29
+ - FTS5 인덱스가 entity name, type, facts, state, summary, relation targets를 포괄
30
+ - 노트 중복 검출에 SHA-256 해시 컬럼 + 인덱스 사용
31
+
32
+ **우려점**:
33
+ - `sqlite_store.py`가 2,113줄 — 20+ 테이블의 CRUD를 하나의 클래스에서 처리하는 God Object
34
+ - `_SCHEMA_SQL` 상수와 마이그레이션이 동일 스키마를 별도 관리하는 이중진실(dual-truth) 문제
35
+ - `_row_to_fact()`가 `"scope_id" in row.keys()` 같은 마이그레이션 상태 인식 코드를 포함 (누수 추상화)
36
+
37
+ ### 트레이드오프
38
+
39
+ | 관점 | Markdown (?? ??) | SQLite (Engram) |
40
+ |------|---------------------|-----------------|
41
+ | 가독성 | 사람이 직접 파일 탐색기로 열람 가능 | CLI/API 통해서만 접근 (Markdown 내보내기 선택적) |
42
+ | Git 추적 | 파일별 diff/blame 자연스러움 | 바이너리 파일이라 diff 불가 |
43
+ | 쿼리 성능 | 파일 스캔 필요 (O(N)) | 인덱스 기반 서브밀리초 (O(log N)) |
44
+ | 트랜잭션 | 없음 (부분 쓰기 가능) | ACID 보장 |
45
+ | 동시 접근 | 파일 잠금 필요 | WAL 모드로 동시 읽기/쓰기 지원 |
46
+
47
+ ---
48
+
49
+ ## 2. 모놀리스 → 모듈형 아키텍처
50
+
51
+ ### 변경 내용
52
+
53
+ ?? ??는 `?? ??` 단일 클래스(~4,362줄)에 모든 기능을 포함한다.
54
+
55
+ Engram은 `MemoryEngine`(~1,922줄)이 15+ 서비스를 조합하는 Facade 패턴을 사용한다. `StorageBackend` Protocol로 인터페이스를 추상화했다.
56
+
57
+ ### 평가
58
+
59
+ | 항목 | 평가 |
60
+ |------|------|
61
+ | **유효성** | **유효함** — Protocol 기반 인터페이스 추상화, 의존성 주입 패턴 적용 |
62
+ | **필요성** | **부분적** — 코어(storage/search/quality/session) 분리는 필수. Feature service 증식은 과잉 위험 |
63
+ | **품질** | **보통** |
64
+
65
+ ### 구현 상세
66
+
67
+ **강점**:
68
+ - `StorageBackend` Protocol에 `@runtime_checkable` 적용 → 테스트 시 mock 백엔드 사용 가능
69
+ - `__init__`에서 모든 서비스를 명시적 DI로 생성 (전역 상태, 서비스 로케이터 없음)
70
+ - 추출기와 Markdown 내보내기는 lazy 초기화 → LLM 의존성 불필요 시 로딩 안 함
71
+ - 검색 엔진 graceful degradation: hybrid → semantic → FTS5
72
+
73
+ **우려점**:
74
+ - `engine.py` 1,922줄, 70+ public 메서드 — 여전히 God Class
75
+ - 일부 서비스는 eager 생성(`__init__`), 일부는 lazy 생성(호출 시 `_maintenance_service()`) → 비일관
76
+ - `models/` 패키지에 20개 파일 — `view.py`, `brief.py`, `explanation.py` 같은 얇은 래퍼는 서비스와 co-locate 가능
77
+
78
+ ---
79
+
80
+ ## 3. 검색: difflib+regex → FTS5 BM25+Reranker
81
+
82
+ ### 변경 내용
83
+
84
+ ?? ??는 stdlib 기반 검색을 사용한다:
85
+ - 정확 매칭: 파일명/내용 substring 검색
86
+ - IDF 가중 토큰 스코어링: 희소 토큰에 높은 점수
87
+ - Fuzzy 매칭: `difflib.SequenceMatcher`
88
+ - Phrase 보너스, 제목 보너스, 최신성 보너스
89
+
90
+ Engram은 SQLite FTS5 기반 검색을 사용한다:
91
+ - BM25 스코어링 (컬럼별 가중치)
92
+ - CJK/한국어 토크나이저
93
+ - 세션 컨텍스트 기반 리랭킹
94
+ - 선택적 시맨틱/하이브리드 검색
95
+
96
+ ### 평가
97
+
98
+ | 항목 | 평가 |
99
+ |------|------|
100
+ | **유효성** | **유효함** — FTS5 BM25는 TF-IDF 포화, 문서 길이 정규화를 기본 지원 |
101
+ | **필요성** | **필수** — 규모 있는 메모리 시스템에 적절한 전문 검색은 필수 |
102
+ | **품질** | **우수** |
103
+
104
+ ### BM25 컬럼 가중치
105
+
106
+ ```python
107
+ _BM25_WEIGHTS = (0.0, 10.0, 1.0, 3.0, 2.0, 5.0)
108
+ # entity_id: 0, entity_name: 10, entity_type: 1, fact_text: 3, state_text: 2, summary: 5
109
+ ```
110
+
111
+ 엔티티 이름(10x)에 최고 가중치, 요약(5x), 팩트 텍스트(3x) 순서.
112
+
113
+ ### 리랭킹 부스트
114
+
115
+ | 조건 | 부스트 |
116
+ |------|--------|
117
+ | 세션에서 활성 엔티티 | +0.6 |
118
+ | 최근 접근 엔티티 | +0.2 |
119
+ | 선호 엔티티 | +0.4 |
120
+ | 목표 타입 선호 (예: meeting_prep → person) | +0.25 |
121
+
122
+ ### 검색 파이프라인 (Engram)
123
+
124
+ ```
125
+ 쿼리 → 토크나이저(CJK 지원) → FTS5 BM25 → 신선도 페널티 적용 →
126
+ 스코프 필터링 → 보존 정책 필터링 → 세션 리랭킹 → 프로비넌스 추적 → 결과 반환
127
+ ```
128
+
129
+ ---
130
+
131
+ ## 4. Quality Gate 도입
132
+
133
+ ### 변경 내용
134
+
135
+ ?? ??에는 쓰기 경로에 품질 검증이 없다. Engram은 5단계 `QualityGate`를 모든 쓰기 경로에 적용한다.
136
+
137
+ ### 평가
138
+
139
+ | 항목 | 평가 |
140
+ |------|------|
141
+ | **유효성** | **유효함** — PII 마스킹, 중복 검출, 충돌 감지가 실질적 문제 해결 |
142
+ | **필요성** | **필수** (PII/중복) / **Nice-to-have** (전체 진단 스위트) |
143
+ | **품질** | **우수** |
144
+
145
+ ### 5단계 파이프라인
146
+
147
+ ```
148
+ 1. 신뢰도 스코어링
149
+ base_trust(source_type) × source_confidence × extraction_multiplier
150
+ source: direct_speech=0.95, document=0.90, API=0.85
151
+ extraction: LLM=1.0, manual=1.0, regex=0.7
152
+
153
+ 2. 메모리 타입 분류
154
+ predicate 키워드 기반 IDENTITY/PREFERENCE/EPISODIC/TRANSIENT 자동 분류
155
+
156
+ 3. PII 탐지 및 마스킹
157
+ - 신용카드 (Luhn 알고리즘 검증)
158
+ - 주민등록번호, SSN
159
+ - API 키, 이메일
160
+ - 한국 전화번호, 한국 주민등록번호
161
+ 마스킹 결과: [credit_card:19chars] (원본 PII 절대 저장 안 함)
162
+
163
+ 4. 중복 검출
164
+ 동일 entity + predicate + object (정규화, 대소문자/관사 제거)
165
+
166
+ 5. 충돌 검출
167
+ 동일 entity + predicate, 다른 object → 신뢰도 차이 기반 자동 해소
168
+ - supersede: 새 팩트 신뢰도 ≫ 기존
169
+ - keep_old: 기존 신뢰도 ≫ 새 팩트
170
+ - manual_review: 신뢰도 차이 작음
171
+ ```
172
+
173
+ ---
174
+
175
+ ## 5. MCP 통합
176
+
177
+ ### 변경 내용
178
+
179
+ ?? ??는 CLI와 Python SDK만 제공한다. Engram은 MCP(Model Context Protocol) 서버를 추가하여 Claude Code와 네이티브 통합한다.
180
+
181
+ ### 평가
182
+
183
+ | 항목 | 평가 |
184
+ |------|------|
185
+ | **유효성** | **유효함** — MCP는 Claude Code의 네이티브 통합 프로토콜 |
186
+ | **필요성** | **필수** — MCP 없으면 에이전트가 CLI로 셸아웃 해야 함 |
187
+ | **품질** | **보통** — 기본 CRUD는 커버하나 확장 여지 있음 |
188
+
189
+ ### 제공 MCP 도구 (7개)
190
+
191
+ | 도구 | 기능 |
192
+ |------|------|
193
+ | `memory_search` | BM25 검색 (토큰 버짓 제한) |
194
+ | `memory_store` | 정보 저장 (source type, confidence) |
195
+ | `memory_get_entity` | 엔티티 조회 + 팩트 |
196
+ | `memory_list_entities` | 필터링된 엔티티 목록 |
197
+ | `memory_session_start` | 세션 시작 + 컨텍스트 |
198
+ | `memory_session_end` | 세션 종료 + 요약 |
199
+ | `memory_resolve_conflict` | 충돌 해소 |
200
+
201
+ ### 누락된 MCP 도구 (확장 권고)
202
+
203
+ - `memory_health` — 진단/헬스체크
204
+ - `memory_maintenance` — 유지보수 실행
205
+ - `memory_brief` — 엔티티/세션 브리프
206
+ - `memory_governance` — 거버넌스 후보 조회/해소
207
+ - `memory_retention` — 보존 정책 관리
208
+
@@ -0,0 +1,145 @@
1
+ # 공유 기능 비교
2
+
3
+ 양쪽 모두 존재하는 9개 핵심 기능의 구현 차이를 비교한다.
4
+
5
+ ---
6
+
7
+ ## 1. 엔티티 관리
8
+
9
+ | 관점 | ?? ?? | Engram |
10
+ |------|----------|--------|
11
+ | 저장 | Markdown 파일 (entities/, live-notes/) | SQLite `entities` 테이블 |
12
+ | 상태 관리 | 마크다운 섹션 파싱 | 구조화된 `EntityState` (role, affiliation, location, email, custom) |
13
+ | 계층(Tier) | core/recall/archival | 동일 — `Tier` enum |
14
+ | 별칭 | 없음 | `aliases` 리스트 + `get_entity_by_name()` 별칭 해소 |
15
+ | 병합 | 없음 | `merge_entities()` — 팩트/관계/별칭/상태 전체 이전 |
16
+ | 압축 | 없음 | `compact_entity()` — predicate별 최선 팩트만 보존 |
17
+ | 브리프 | `brief()` — 마크다운 요약 | `EntityBrief` — 상위 팩트, 관련 엔티티, 최근 노트, 세션, 미해결 충돌 합성 |
18
+ | 접근 추적 | 없음 | `touch()` 접근 카운트 + 타임스탬프 |
19
+
20
+ **판정**: **대폭 개선** — SQL 쿼리가 파일 스캔 대체, 엔티티 병합/압축은 진정한 운영 기능.
21
+
22
+ ---
23
+
24
+ ## 2. NER/추출
25
+
26
+ | 관점 | ?? ?? | Engram |
27
+ |------|----------|--------|
28
+ | 구조 | `core.py` 내 인라인 | 모듈형 (`extraction/regex_extractor.py`, `ner/english.py`, `ner/korean.py`, `ner/cjk.py`) |
29
+ | 영어 NER | Title Case 이름 (2-3 단어) | 동일 + 조직 접미사, 블록리스트 확장 |
30
+ | 한국어 NER | 한글 2-4자 + 성씨 시작 | **문맥 기반**: 이름+존칭, 소개 패턴, 2음절+조사, 3음절+상위10 성씨. 90+ 성씨 |
31
+ | CJK NER | 중국 100성씨, 일본 85성씨 | 동일 접근 |
32
+ | 불용어 | `stopwords.json` (813항목) | 언어별 모듈 내 `frozenset`/`tuple` |
33
+ | 팩트 추출 | `extract_facts_registry()` | `regex_extractor.py` — 팩트 + 관계 통합 추출 |
34
+ | LLM 추출 | 없음 | `llm_extractor.py` — 선택적 플러그인 |
35
+ | 인터페이스 | 없음 | `Extractor` Protocol — 백엔드 교체 가능 |
36
+
37
+ **판정**: **개선** — 특히 한국어 NER이 "모든 2-4자 한글"에서 "문맥 증거 기반"으로 정밀도 대폭 향상.
38
+
39
+ ---
40
+
41
+ ## 3. 충돌 검출
42
+
43
+ | 관점 | ?? ?? | Engram |
44
+ |------|----------|--------|
45
+ | 탐지 | 동일 엔티티의 모순 팩트 | 동일 entity + predicate + 다른 object |
46
+ | 해소 전략 | newest, confidence, keep-both, prompt | accept_new, keep_old, merge (양쪽 보존) |
47
+ | 자동 해소 | 없음 | 신뢰도 차이 기반 자동 해소 (임계값 설정 가능) |
48
+ | 영속화 | 메모리 내 + `CONFLICTS.md` | SQLite `conflicts` 테이블 |
49
+ | 변증법 합성 | 모순을 합성된 관점으로 통합 | **없음** — merge는 양쪽을 그대로 보존 |
50
+ | 대화형 해소 | `prompt` 전략 (사용자에게 질문) | **없음** |
51
+
52
+ **판정**: **동등~개선** — 자동 해소와 영속화는 개선. 변증법 합성과 대화형 해소는 상실.
53
+
54
+ ---
55
+
56
+ ## 4. 디버그 서비스
57
+
58
+ | 관점 | ?? ?? | Engram |
59
+ |------|----------|--------|
60
+ | 워크플로우 | OBSERVE → HYPOTHESIZE → EXPERIMENT → CONCLUDE | 동일 (start → hypothesis → evidence → conclude) |
61
+ | 저장 | `debug/` 디렉토리에 Markdown 파일 | SQLite 3개 테이블 (`debug_sessions`, `debug_hypotheses`, `debug_evidence`) |
62
+ | 가설 상태 | open/confirmed/rejected | 동일 + abandoned |
63
+ | 증거 분류 | 없음 (텍스트만) | supports/contradicts/neutral |
64
+ | PII 마스킹 | 없음 | 모든 텍스트 필드에 PII 마스킹 |
65
+ | 검색 | `search_rejected_hypotheses()` | `search_hypotheses()` (전체 검색 가능) |
66
+ | 2-fail 경고 | 2번 기각 후 자동 경고 | 없음 (별도 구현 필요 시 추가 가능) |
67
+
68
+ **판정**: **개선** — SQL 영속화, PII 마스킹, 증거 분류, 검색 가능한 가설 이력.
69
+
70
+ ---
71
+
72
+ ## 5. 스냅샷 / 시간여행
73
+
74
+ | 관점 | ?? ?? | Engram |
75
+ |------|----------|--------|
76
+ | 스냅샷 생성 | 매니페스트 (해시, 크기, 요약, 섹션, 팩트, 링크) | `sqlite3.Connection.backup()` + gzip 압축 |
77
+ | 스냅샷 내 검색 | 없음 (매니페스트만) | 스냅샷 DB를 읽기 전용 열어 FTS5 검색 |
78
+ | 시간여행 | `time_travel(query, date)` — 임의 시점 쿼리 | `search_at(snapshot_id, query)` — 스냅샷 ID 필요 |
79
+ | 엔티티 이력 | `snapshot_entity(name)` — 스냅샷 간 엔티티 추적 | `get_entity_at(snapshot_id, name)` |
80
+ | 스냅샷 비교 | `snapshot_diff()` | `diff(a_id, b_id)` — 엔티티/팩트/노트 delta |
81
+ | 보안 | 없음 | `0o600` 파일 권한, 경로 순회 공격 방지 |
82
+
83
+ **판정**: **개선** — 실제 DB 백업, 스냅샷 내 FTS5 검색, 보안 강화. 다만 임의 시점 쿼리 대신 명시적 스냅샷 ID가 필요하여 워크플로우가 약간 무거움.
84
+
85
+ ---
86
+
87
+ ## 6. 세션 / 작업 메모리
88
+
89
+ | 관점 | ?? ?? | Engram |
90
+ |------|----------|--------|
91
+ | 세션 관리 | JSONL 이벤트 로그 | `SessionManager` — 시작/종료, 엔티티 접근/수정 추적, 이벤트 로깅 |
92
+ | 작업 메모리 | 채널/태스크/에이전트별 컨텍스트 | `WorkingMemory` — 활성 엔티티(최대 50), 최근 쿼리(최대 20), 인메모리 |
93
+ | 채널 컨텍스트 | `channel_save/load/update()` 영속 | **없음** — WorkingMemory는 세션 종료 시 소멸 |
94
+ | 태스크 관리 | `task_start/update/complete/delegate()` | **없음** (별도 태스크 서비스 없음) |
95
+ | 에이전트 핸드오프 | `agent_handoff()` — 에이전트 간 메모리 이전 | **없음** |
96
+ | 컨텍스트 캐리오버 | 이전 1개 세션 | 최근 5개 세션 엔티티 접근 이력 집계 |
97
+ | PII 마스킹 | 없음 | 세션 이벤트에 PII 마스킹 |
98
+ | 스코프 | 없음 | `scope_id` 기반 네임스페이스 격리 |
99
+
100
+ **판정**: **단일 에이전트는 개선** — 풍부한 컨텍스트 캐리오버, PII 마스킹, 스코프. **멀티 에이전트는 후퇴** — 핸드오프와 채널 영속 컨텍스트 누락.
101
+
102
+ ---
103
+
104
+ ## 7. 의사결정 추적
105
+
106
+ | 관점 | ?? ?? | Engram |
107
+ |------|----------|--------|
108
+ | 추출 | `distill_decisions()` — 키워드 스캔 | `DecisionService` — 노트/세션/디버그 결론 스캔 |
109
+ | 키워드 | 영어만 ("decided to", "we will", ...) | 이중언어 — 영어 + 한국어 ("결정", "하기로", "채택", "보류") |
110
+ | 상태 | 없음 | ACTIVE / DRAFT (보류/draft/consider 키워드 기반) |
111
+ | 영속화 | `decisions/` 디렉토리 Markdown | SQLite `decisions` 테이블 + SHA-256 핑거프린트 |
112
+ | 엔티티 링크 | 없음 | `ReferenceService.match_entity_ids()` 자동 링크 |
113
+ | 드리프트 감지 | 없음 | `projection_drift()` — 인덱싱 안 된 의사결정 소스 식별 |
114
+ | 검증 | 없음 | 신선도 서비스 연계 (`verification_status`, `verification_due_at`) |
115
+
116
+ **판정**: **대폭 개선** — 영속화, 이중언어, 엔티티 링크, 드리프트 감지, 검증 연계.
117
+
118
+ ---
119
+
120
+ ## 8. 헬스/진단
121
+
122
+ | 관점 | ?? ?? | Engram |
123
+ |------|----------|--------|
124
+ | 메트릭 수 | 5개 assertion | 8개 메트릭 |
125
+ | 메트릭 목록 | (비공개 5개 체크) | 미해결 충돌, 소스 커버리지, 노후 팩트 비율, 검증 백로그, 노후 의사결정, 거버넌스 백로그, 고아 엔티티, 프로젝션 드리프트 |
126
+ | 등급 | 알파벳 (A/B/C/D) | 가중 복합 점수 + 알파벳 (A/B/C/D) |
127
+ | 실행 가능한 항목 | 없음 | `OpenLoop` — 종류, 심각도, 제목, 상세, 대상 ID, 권장 CLI 명령 |
128
+ | 출력 | 터미널 텍스트 | `HealthReport.to_agent_context()` — 에이전트 소비용 Markdown |
129
+
130
+ **판정**: **대폭 개선** — 8개 메트릭, 실행 가능한 OpenLoop, 에이전트 소비용 출력.
131
+
132
+ ---
133
+
134
+ ## 9. 메모리 타입
135
+
136
+ | 관점 | ?? ?? | Engram |
137
+ |------|----------|--------|
138
+ | 타입 수 | 8종 | 4종 |
139
+ | 타입 목록 | identity, belief, preference, relationship, skill, episodic, routine, transient | IDENTITY, PREFERENCE, EPISODIC, TRANSIENT |
140
+ | 분류 방식 | `classify_memory_type()` | `classify_predicate()`, `classify_fact()` — 키워드 기반 |
141
+ | 감쇠 연동 | 타입별 차등 감쇠 (상수) | 타입별 지수 감쇠 (반감기: IDENTITY 365일, PREFERENCE 180일, EPISODIC 30일, TRANSIENT 7일) |
142
+ | 재분류 | 없음 | `reclassify_facts()` — 소급 재분류 |
143
+
144
+ **판정**: **의도적 트레이드오프** — "4개 버킷으로 'identity는 잊지 말고 / 어제 기분은 빨리 폐기'를 표현하기에 충분. LLM 없이 분류 문제를 만들지 않는다." ?? ??의 8종은 라벨만 존재하고 차등 행동을 구동하지 않았으나, Engram의 4종은 각각 감쇠율을 직접 결정한다.
145
+
@@ -0,0 +1,198 @@
1
+ # Engram 신규 기능 유효성 분석
2
+
3
+ Engram에만 존재하는 6개 신규 기능(미커밋 상태)의 유효성, 필요성, 품질을 분석한다.
4
+
5
+ ---
6
+
7
+ ## 종합 판정
8
+
9
+ ```
10
+ ┌──────────────────────┬───────────┬───────────┬─────────┬─────────────────────────────────┐
11
+ │ 기능 │ 유효한가? │ 필요한가? │ 유용성 │ 판정 │
12
+ ├──────────────────────┼───────────┼───────────┼─────────┼─────────────────────────────────┤
13
+ │ Freshness │ ✅ Yes │ ✅ Yes │ 4/5 │ KEEP — 검색 신뢰도 핵심 │
14
+ │ Entity Governance │ ✅ Yes │ ✅ Yes │ 4/5 │ KEEP — NER 중복 해소 필수 │
15
+ │ Retention Policies │ ✅ Yes │ ✅ Yes │ 4/5 │ KEEP — 감쇠/압축 보완 필수 │
16
+ │ Scoped Memory │ ✅ Yes │ ✅ Yes │ 4/5 │ KEEP — 멀티컨텍스트 필수 │
17
+ │ Job Runner │ ✅ Yes │ ⚠️ Not yet│ 3/5 │ DEFER — 비동기 미활용 │
18
+ │ Recommendations │ ⚠️ Partial│ ❌ No │ 2/5 │ DEFER — 시그널 재집계, 테스트 無 │
19
+ └──────────────────────┴───────────┴───────────┴─────────┴─────────────────────────────────┘
20
+ ```
21
+
22
+ ---
23
+
24
+ ## 1. Freshness Verification (신선도 검증) — KEEP
25
+
26
+ **파일**: `engram/freshness/service.py` (302줄), `engram/models/verification.py` (79줄)
27
+ **테스트**: `tests/test_freshness/test_service.py` (2/2 통과)
28
+
29
+ ### 기능
30
+
31
+ 팩트와 의사결정의 신선도를 추적하는 검증 생명주기를 관리한다.
32
+
33
+ ```
34
+ 팩트/의사결정 저장 → verification_due_at 설정 (메모리 타입별 감쇠 정책 기반)
35
+ → 검색 시 만료 여부 확인 → 만료 시 VerificationRequest 자동 생성
36
+ → 해소: VERIFIED (재검증), STALE, RETRACTED, SUPERSEDED
37
+ ```
38
+
39
+ - 검색 시 만료된 팩트에 **-0.30 점수 페널티** 자동 적용
40
+ - "verify on read" 패턴: 전체 스캔 대신 검색 시점에 lazy하게 만료 감지
41
+ - 요청 중복 방지: `find_open_verification_request()`로 동일 대상 재요청 방지
42
+
43
+ ### 유효성 분석
44
+
45
+ **필요한 이유**: 장기 메모리에서 팩트 노후화는 불가피하다. 누군가의 직책이 바뀌거나, 프로젝트가 방향을 전환하거나, 의사결정이 번복된다. 신선도 추적 없이는 에이전트가 오래된 정보를 현재 사실처럼 자신 있게 제시한다.
46
+
47
+ **설계 품질**: 평가(순수 로직 `FreshnessAssessment`)와 변경(요청 생성/해소)이 깔끔하게 분리되어 있다. `DecayPolicy`의 메모리 타입별 반감기를 재사용하므로 별도 설정 불필요.
48
+
49
+ ---
50
+
51
+ ## 2. Entity Governance (엔티티 거버넌스) — KEEP
52
+
53
+ **파일**: `engram/governance/service.py` (288줄), `engram/models/governance.py` (65줄)
54
+ **테스트**: `tests/test_governance/test_entity_governance.py` (4/4 통과)
55
+
56
+ ### 기능
57
+
58
+ 엔티티 중복을 탐지하고 해소하는 거버넌스 워크플로우를 제공한다.
59
+
60
+ ```
61
+ generate_candidates() → O(n²) 페어와이즈 비교
62
+ ├─ MERGE: 정규화 이름 일치 또는 별칭 교차 매칭
63
+ ├─ ALIAS: 한쪽이 다른 쪽의 별칭 후보
64
+ └─ SPLIT: 동일 엔티티에 모순 속성 (role, affiliation, location, email)
65
+
66
+ resolve_candidate()
67
+ ├─ approve → merge: merge_entities_by_id() 실행, 중복 alias 후보 자동 취소
68
+ ├─ approve → alias: 별칭 추가
69
+ └─ reject → 후보 기각
70
+ ```
71
+
72
+ - 핑거프린트 기반 멱등 업서트: 동일 후보 재생성 방지
73
+ - `limit=5000` 엔티티로 O(n²) 바운드
74
+
75
+ ### 유효성 분석
76
+
77
+ **필요한 이유**: NER 기반 시스템에서 "Simon Kim" vs "S. Kim" vs "김시몬" 중복은 예견된 고빈도 문제다. Split 탐지("CTO"와 "HR Manager"를 동시에 가진 엔티티 = 동명이인 혼재)도 실질적 가치가 있다.
78
+
79
+ **설계 품질**: `merge_fn` 콜백을 통한 느슨한 결합, 병합 후 중복 alias 후보 자동 정리 등 라이프사이클을 잘 고려한 설계.
80
+
81
+ ---
82
+
83
+ ## 3. Job Runner (작업 큐) — DEFER
84
+
85
+ **파일**: `engram/jobs/service.py` (65줄), `engram/models/job.py` (27줄)
86
+ **테스트**: `tests/test_jobs/test_service.py` (3/3 통과)
87
+
88
+ ### 기능
89
+
90
+ SQLite 기반 영속 작업 큐. enqueue → lease → execute → mark_failed/complete.
91
+
92
+ ```
93
+ enqueue(job_type, payload, max_attempts)
94
+ → lease(owner) — 원자적 작업 할당
95
+ → mark_failed() — 재시도 (max_attempts 미달) 또는 dead_letter
96
+ ```
97
+
98
+ 지원 작업 타입: `index_source`, `rebuild_references`, `rebuild_decisions`, `rebuild_projections`, `maintenance_run`
99
+
100
+ ### 유효성 분석
101
+
102
+ **문제점**: 현재 `engine.py`에서 enqueue 후 **즉시 동기 실행**한다:
103
+ ```python
104
+ # store() 메서드 내부
105
+ self._job_runner.enqueue("index_source", ...) # 작업 등록
106
+ self._index_source(note_id) # 바로 실행
107
+ ```
108
+
109
+ 실질적으로 `jobs` 테이블은 실행 로그일 뿐 진정한 비동기 큐가 아니다. `run_jobs()` API는 존재하지만 호출하는 자동 스케줄러가 없다.
110
+
111
+ **보류 사유**: 백그라운드 데몬이나 cron 기반 스케줄러가 도입될 때까지 불필요한 스키마 복잡도(테이블 + 인덱스)만 추가한다. 구현 자체는 깔끔하므로 코드를 유지하되 활성화는 보류.
112
+
113
+ ---
114
+
115
+ ## 4. Recommendations (추천 서비스) — DEFER
116
+
117
+ **파일**: `engram/recommendations/service.py` (448줄), 모델은 `engram/models/retention.py`에 혼입
118
+ **테스트**: **없음**
119
+
120
+ ### 기능
121
+
122
+ 4가지 추천을 현재 상태로부터 계산한다:
123
+
124
+ | 추천 종류 | 소스 |
125
+ |----------|------|
126
+ | `STALE_DECISION` | verification_due_at 경과 + 열린 요청 없는 의사결정 |
127
+ | `OPEN_LOOP_ESCALATION` | 반복 OpenLoop (2+회 = warning, 3+ = critical) + 노후 (7+일) |
128
+ | `MERGE_RECOMMENDATION` | 열린 merge 거버넌스 후보 + 보존 정책 충돌 감지 |
129
+ | `FOLLOW_UP_TASK` | 노후 검증 요청(3+일), 거버넌스 후보, critical 반복 OpenLoop |
130
+
131
+ ### 유효성 분석
132
+
133
+ **문제점**:
134
+ 1. **새 정보 없음**: freshness, governance, maintenance 시그널을 재집계하는 간접 레이어. 각 서비스 API로 직접 접근 가능한 정보만 다시 포장.
135
+ 2. **비효율적 조회**: `get_recommendation(id)`이 전체 목록(limit=200)을 재계산 후 선형 스캔.
136
+ 3. **로직 중복**: `_stale_decision_recommendations()`가 freshness 평가 로직을 재구현.
137
+ 4. **모델 위치**: `RecommendationView`가 `models/retention.py`에 혼입 (구조적 냄새).
138
+ 5. **테스트 없음**.
139
+
140
+ **보류 사유**: MCP "what should I do?" 엔드포인트 같은 명확한 소비자가 생길 때까지 부가가치 없음.
141
+
142
+ ---
143
+
144
+ ## 5. Retention Policies (보존 정책) — KEEP
145
+
146
+ **파일**: `engram/retention/service.py` (122줄), `engram/models/retention.py` (92줄)
147
+ **테스트**: `tests/test_retention/test_retention_service.py` (2/2 통과)
148
+
149
+ ### 기능
150
+
151
+ 대상별(entity/fact/decision/note/session) 보존 정책을 관리한다.
152
+
153
+ | 정책 타입 | 효과 |
154
+ |----------|------|
155
+ | `PIN` | 감쇠/삭제 대상에서 영구 제외 |
156
+ | `TTL` | 지정 시점 이후 만료 |
157
+ | `ARCHIVE_ONLY` | 기본 검색에서 숨김 (명시적 조회만 가능) |
158
+ | `NEVER_SUMMARIZE` | 압축/요약 대상에서 제외 (원문 보존) |
159
+
160
+ ### 유효성 분석
161
+
162
+ **필요한 이유**: 감쇠와 압축을 수행하는 메모리 시스템에서 "이것만은 절대 잊지 마라" (PIN), "검색에서 숨기되 삭제하지 마라" (ARCHIVE_ONLY), "요약으로 뭉개지 마라" (NEVER_SUMMARIZE)는 자연스러운 요구사항이다.
163
+
164
+ **설계 품질**: 매우 깔끔. 얇고 타입 안전한 래퍼. `is_pinned()`, `is_archive_only()`, `get_ttl()` 같은 편의 메서드가 engine 전체에서 참조됨. 검색 결과 필터링(`_apply_retention_to_search_result`), 브리프 필터링에 깊이 통합됨.
165
+
166
+ ---
167
+
168
+ ## 6. Scoped Memory (스코프 메모리) — KEEP
169
+
170
+ **파일**: `engram/scopes/service.py` (77줄), `engram/models/scope.py` (41줄)
171
+ **테스트**: `tests/test_scopes/test_service.py` (2/2 통과)
172
+
173
+ ### 기능
174
+
175
+ 계층적 네임스페이스로 메모리를 분리한다.
176
+
177
+ ```
178
+ global
179
+ └── workspace: "company-a"
180
+ ├── project: "engram"
181
+ │ ├── channel: "dev-chat"
182
+ │ └── task: "migration-v11"
183
+ └── project: "other-project"
184
+ └── agent: "reviewer-bot"
185
+ ```
186
+
187
+ - `create(name, kind, parent_id)` — 경로 자동 구축, "/" 금지 (경로 주입 방지)
188
+ - `resolve_selection(ScopeSelection)` → `ResolvedScope` (허용 scope ID 목록)
189
+ - `include_ancestors`: 상위 스코프 팩트 상속
190
+ - `include_global`: 전역 팩트 포함
191
+ - `fallback_scope_ids`: 대체 스코프
192
+
193
+ ### 유효성 분석
194
+
195
+ **필요한 이유**: 멀티 프로젝트/멀티 에이전트 환경에서 "project-alpha의 팩트가 project-beta 검색에 나오면 안 된다"는 기본 요구사항. 계층 구조(workspace > project > channel > task)는 개발 작업 조직 방식에 자연스럽게 매핑.
196
+
197
+ **설계 품질**: 최소주의적이고 잘 설계됨. 77줄 서비스 + 41줄 모델. `ScopeSelection` → `ResolvedScope` 패턴으로 호출자가 원하는 것을 선언하면 서비스가 해소. store, search, sessions에 모두 `scope_id` 통합.
198
+