kore-memory 2.5.0__tar.gz → 3.0.2__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 (139) hide show
  1. kore_memory-3.0.2/.coveragerc +19 -0
  2. {kore_memory-2.5.0 → kore_memory-3.0.2}/CHANGELOG.md +114 -0
  3. kore_memory-3.0.2/PKG-INFO +822 -0
  4. kore_memory-3.0.2/README.md +773 -0
  5. kore_memory-3.0.2/docs/coding-memory-mode.md +235 -0
  6. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/audit.py +1 -0
  7. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/auth.py +7 -1
  8. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/compressor.py +3 -2
  9. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/config.py +1 -1
  10. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/conflict_detector.py +22 -17
  11. kore_memory-3.0.2/kore_memory/consolidation.py +271 -0
  12. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/context_assembler.py +4 -3
  13. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/database.py +134 -0
  14. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/embedder.py +2 -2
  15. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/events.py +1 -0
  16. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/filesystem_overlay.py +35 -0
  17. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/filesystem_watcher.py +9 -1
  18. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/entities.py +319 -14
  19. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/main.py +105 -11
  20. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/mcp_server.py +103 -11
  21. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/models.py +41 -1
  22. kore_memory-3.0.2/kore_memory/policy_engine.py +228 -0
  23. kore_memory-3.0.2/kore_memory/privacy.py +45 -0
  24. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/ranking.py +50 -8
  25. kore_memory-3.0.2/kore_memory/repository/entity.py +157 -0
  26. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/lifecycle.py +21 -5
  27. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/memory.py +226 -149
  28. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/search.py +277 -22
  29. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/sessions.py +16 -2
  30. kore_memory-3.0.2/kore_memory/structured.py +194 -0
  31. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/templates/dashboard.html +128 -85
  32. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/vector_index.py +11 -0
  33. {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/claude-code/README.md +4 -0
  34. kore_memory-3.0.2/presets/claude-code-coding.md +97 -0
  35. {kore_memory-2.5.0 → kore_memory-3.0.2}/pyproject.toml +13 -2
  36. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/package.json +1 -1
  37. {kore_memory-2.5.0 → kore_memory-3.0.2}/start.sh +3 -0
  38. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_api.py +27 -0
  39. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_conflict_detection.py +20 -15
  40. kore_memory-3.0.2/tests/test_coverage_gaps.py +246 -0
  41. kore_memory-3.0.2/tests/test_m1_graph_entity.py +370 -0
  42. kore_memory-3.0.2/tests/test_m2_structured_memory.py +328 -0
  43. kore_memory-3.0.2/tests/test_m3a_session_consolidation.py +355 -0
  44. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_mcp.py +43 -6
  45. kore_memory-3.0.2/tests/test_policy_engine.py +486 -0
  46. kore_memory-2.5.0/PKG-INFO +0 -803
  47. kore_memory-2.5.0/README.md +0 -754
  48. kore_memory-2.5.0/test_pagination_fix.py +0 -78
  49. {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  50. {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  51. {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  52. {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/benchmark.yml +0 -0
  53. {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/build-sdk.yml +0 -0
  54. {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/ci.yml +0 -0
  55. {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/publish.yml +0 -0
  56. {kore_memory-2.5.0 → kore_memory-3.0.2}/.gitignore +0 -0
  57. {kore_memory-2.5.0 → kore_memory-3.0.2}/CONTRIBUTING.md +0 -0
  58. {kore_memory-2.5.0 → kore_memory-3.0.2}/LICENSE +0 -0
  59. {kore_memory-2.5.0 → kore_memory-3.0.2}/MIGRATION-v0.6.md +0 -0
  60. {kore_memory-2.5.0 → kore_memory-3.0.2}/article-devto.md +0 -0
  61. {kore_memory-2.5.0 → kore_memory-3.0.2}/assets/favicon.svg +0 -0
  62. {kore_memory-2.5.0 → kore_memory-3.0.2}/assets/logo.svg +0 -0
  63. {kore_memory-2.5.0 → kore_memory-3.0.2}/docs/competitive-analysis-2025.md +0 -0
  64. {kore_memory-2.5.0 → kore_memory-3.0.2}/docs/quickstart-v2.1.md +0 -0
  65. {kore_memory-2.5.0 → kore_memory-3.0.2}/docs/v1.0-roadmap.md +0 -0
  66. {kore_memory-2.5.0 → kore_memory-3.0.2}/examples/async_usage.py +0 -0
  67. {kore_memory-2.5.0 → kore_memory-3.0.2}/examples/basic_usage.py +0 -0
  68. {kore_memory-2.5.0 → kore_memory-3.0.2}/examples/langchain_example.py +0 -0
  69. {kore_memory-2.5.0 → kore_memory-3.0.2}/hatch_build.py +0 -0
  70. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore-daemon.sh +0 -0
  71. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/__init__.py +0 -0
  72. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/acl.py +0 -0
  73. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/analytics.py +0 -0
  74. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/auto_tuner.py +0 -0
  75. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/cli.py +0 -0
  76. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/client.py +0 -0
  77. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/dashboard.py +0 -0
  78. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/decay.py +0 -0
  79. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/__init__.py +0 -0
  80. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/crewai.py +0 -0
  81. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/langchain.py +0 -0
  82. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/openai_agents.py +0 -0
  83. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/pydantic_ai.py +0 -0
  84. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/plugins.py +0 -0
  85. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/py.typed +0 -0
  86. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/__init__.py +0 -0
  87. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/graph.py +0 -0
  88. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/scorer.py +0 -0
  89. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/summarizer.py +0 -0
  90. {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/welcome.py +0 -0
  91. {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/claude-code/mcp.json +0 -0
  92. {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/cursor/README.md +0 -0
  93. {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/cursor/mcp.json +0 -0
  94. {kore_memory-2.5.0 → kore_memory-3.0.2}/requirements.txt +0 -0
  95. {kore_memory-2.5.0 → kore_memory-3.0.2}/scripts/assert_benchmarks.py +0 -0
  96. {kore_memory-2.5.0 → kore_memory-3.0.2}/scripts/import_memory.py +0 -0
  97. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/.gitignore +0 -0
  98. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/README.md +0 -0
  99. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/package-lock.json +0 -0
  100. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/client.ts +0 -0
  101. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/errors.ts +0 -0
  102. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/index.ts +0 -0
  103. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/types.ts +0 -0
  104. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tests/client.test.ts +0 -0
  105. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tests/errors.test.ts +0 -0
  106. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tests/helpers.ts +0 -0
  107. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tsconfig.json +0 -0
  108. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tsup.config.ts +0 -0
  109. {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/vitest.config.ts +0 -0
  110. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/__init__.py +0 -0
  111. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/__init__.py +0 -0
  112. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/conftest_bench.py +0 -0
  113. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_a_temporal.json +0 -0
  114. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_b_conflicts.json +0 -0
  115. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_c_coding.json +0 -0
  116. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_d_graph.json +0 -0
  117. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_e_context.json +0 -0
  118. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/loaders.py +0 -0
  119. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/test_benchmarks.py +0 -0
  120. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/conftest.py +0 -0
  121. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_audit.py +0 -0
  122. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_auth_events.py +0 -0
  123. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_auto_tuner.py +0 -0
  124. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_cli.py +0 -0
  125. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_client.py +0 -0
  126. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_client_sync.py +0 -0
  127. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_crewai.py +0 -0
  128. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_dashboard.py +0 -0
  129. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_entities.py +0 -0
  130. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_langchain.py +0 -0
  131. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_ranking_engine.py +0 -0
  132. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_sessions.py +0 -0
  133. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v11_fixes.py +0 -0
  134. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v12_features.py +0 -0
  135. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v21_temporal.py +0 -0
  136. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v2_features.py +0 -0
  137. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_wave3_graph.py +0 -0
  138. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_wave3_overlay.py +0 -0
  139. {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_wave3_watcher.py +0 -0
@@ -0,0 +1,19 @@
1
+ [run]
2
+ source = kore_memory
3
+ omit =
4
+ # Integrations che richiedono dipendenze opzionali (pydantic-ai, openai-agents)
5
+ kore_memory/integrations/pydantic_ai.py
6
+ kore_memory/integrations/openai_agents.py
7
+ # Banner di benvenuto CLI — non coperto da test
8
+ kore_memory/welcome.py
9
+ # Entry point scripts — coperti da test funzionali, non unit
10
+ kore_memory/__main__.py
11
+ # Vector index sqlite-vec — richiede estensione sqlite-vec, testato in test-semantic CI
12
+ kore_memory/vector_index.py
13
+
14
+ [report]
15
+ exclude_lines =
16
+ pragma: no cover
17
+ def __repr__
18
+ if TYPE_CHECKING:
19
+ raise NotImplementedError
@@ -11,6 +11,120 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
 
12
12
  ---
13
13
 
14
+ ## [3.0.2] - 2026-04-28
15
+
16
+ ### Theme: "Hardening & Bug Sweep"
17
+
18
+ Comprehensive bug-fixing release: 24 fixes across backend, dashboard, security, and infrastructure. No breaking changes.
19
+
20
+ ### Fixed — Backend (Critical)
21
+
22
+ - **Data corruption in compressor**: `DELETE FROM memory_relations WHERE source_id = target_id` was unscoped — deleted ALL self-relations globally instead of only the newly merged record. Now scoped to `(new_id, new_id)`.
23
+ - **save_memory_batch bypassed entire pipeline**: Batch save was missing privacy filter, title generation, content_hash, structured extraction (facts/concepts/narrative), entity extraction, conflict detection, dedup, session_id, and all v2.1/M2 fields. Refactored with shared `_prepare_memory()` helper — full parity with single save.
24
+ - **Race condition in dedup (TOCTOU)**: Dedup check and INSERT were in separate transactions. Two concurrent identical saves could both pass the check. Now merged into a single transaction.
25
+ - **ZeroDivisionError in RRF fusion**: Setting `KORE_RRF_W_FTS=0` caused crash when that stream had results. Added `or 1.0` fallback.
26
+ - **search_by_tag returned incomplete data**: Missing `title`, `invalidated_at`, `compressed_into`, and all structured fields in SELECT. `_row_to_record` silently returned nulls.
27
+ - **assert in context_assembler**: Token budget invariant used `assert` (disabled with `python -O`). Replaced with `if/raise ValueError`.
28
+
29
+ ### Fixed — Security
30
+
31
+ - **Auth bypass behind reverse proxy**: `_is_local()` checked only `request.client.host`, which is the proxy's IP (127.0.0.1) when behind nginx/Caddy. Now detects `X-Forwarded-For`/`X-Real-IP` headers and requires API key when proxy is detected.
32
+ - **MCP import no size limit**: Docstring said "max 500" but code passed full list. Added `memories[:500]` truncation.
33
+ - **Search query DoS vector**: `/search` had no `max_length` on query parameter. Added `max_length=1000`.
34
+ - **CSP redundancy**: Removed `'unsafe-inline'` from `script-src` (redundant when nonce is present).
35
+
36
+ ### Fixed — Infrastructure
37
+
38
+ - **VectorIndex memory leak**: Legacy in-memory cache grew unbounded (one entry per agent, all embeddings in RAM). Added LRU eviction with max 20 agents.
39
+ - **Timer leak in filesystem_watcher**: `stop_all()` stopped observers but didn't cancel pending debounce timers. Timers could fire after shutdown, causing DB operations on closed connections.
40
+ - **init_db() at import time in MCP server**: Any `import kore_memory.mcp_server` triggered full DB initialization. Replaced with lazy `_ensure_db()` using double-check locking.
41
+
42
+ ### Fixed — Dashboard
43
+
44
+ - **Tab lost on refresh**: No URL state persistence. Added `location.hash` routing — tab survives refresh and browser back/forward.
45
+ - **Memories page empty for agents without relations**: Default view used `/graph/hubs` (requires relations). Changed to `/search?q=*`.
46
+ - **Relations section permanently broken**: `loadRelations(data.results)` where `/analytics` has no `results` field. Now fetches memories via `/search`.
47
+ - **Graph detail panel permanently broken after X close**: Inline `style.display='none'` overrode CSS class. Fixed to use `classList.remove('open')`.
48
+ - **Graph animation CPU leak**: `requestAnimationFrame` loop ran at 60fps on hidden canvas after navigating away. Now cancelled on page change.
49
+ - **HiDPI mouse coordinates wrong**: `screenToGraph()` used `canvas.width` (physical pixels) instead of `canvas.offsetWidth` (CSS pixels). Hover/drag/click hit wrong nodes on Retina displays.
50
+ - **Edit from graph detail race condition**: `setTimeout(300ms)` guess for API load. Now opens modal directly with node data.
51
+ - **NaN decay display**: `decay_score * 100` crashed on null. Defaults to 1.0.
52
+ - **No pagination indicator**: Added "Showing X of Y" when `has_more` is true.
53
+ - **Edit modal ignored tags**: Tags field was visible but values discarded on save. Now sends tags via API.
54
+ - **Session memories appended duplicates**: Clicking "View" multiple times appended cards. Now replaces existing detail.
55
+ - **Inline event handlers violated CSP**: `onmouseover`/`onmouseout` replaced with CSS `:hover`.
56
+
57
+ ### Added
58
+
59
+ - Test: batch/single save parity test verifying structured fields (title, content_hash, memory_type) are populated identically.
60
+
61
+ ---
62
+
63
+ ## [3.0.0] - 2026-04-15
64
+
65
+ ### Theme: "Cognitive Runtime + Coding Vertical GA"
66
+
67
+ Chiude Wave 3 con il lancio ufficiale del Coding Memory Mode e consolida Graph, Context Engine e Filesystem Watcher in un runtime cognitivo completo.
68
+
69
+ ### Breaking Changes
70
+
71
+ - Nessuna breaking change nelle API REST o MCP rispetto a v2.x
72
+ - `pip install kore-memory` porta tutti i miglioramenti automaticamente
73
+
74
+ ### Migration Guide (v2.2 → v3.0)
75
+
76
+ #### Da v2.2 (Context Engine)
77
+ - Nessuna azione richiesta per API REST e MCP esistenti
78
+ - Nuovo: `ranking_profile: "coding"` in `/context/assemble` e `memory_get_context()`
79
+ - Nuovo: categorie coding (`architectural_decision`, `root_cause`, `runbook`, `regression_note`)
80
+
81
+ #### Da v2.3 (Wave 3 Graph)
82
+ - Nessuna azione richiesta
83
+ - Nuovo: filesystem watcher (`pip install 'kore-memory[watcher]'`)
84
+ - Nuovo: tool MCP `memory_log_root_cause`
85
+
86
+ #### DB pre-esistenti (v1.x)
87
+ - Il sistema applica automaticamente le migrazioni incrementali al primo avvio
88
+ - Backup consigliato: `cp data/memory.db data/memory.db.bak`
89
+
90
+ ### Added
91
+
92
+ #### Coding Memory Mode GA (#030)
93
+ - **`memory_log_root_cause`**: nuovo tool MCP per registrare root cause analysis con `symptom`, `affected_component`, `fix_applied`
94
+ - **`docs/coding-memory-mode.md`**: guida completa setup, workflow, tool table, benchmark, troubleshooting
95
+ - **`presets/claude-code-coding.md`**: snippet CLAUDE.md pronto all'uso per attivare il coding mode
96
+ - **`presets/claude-code/README.md`**: aggiornato con tutti i 4 tool coding
97
+ - Il Coding Memory Mode è ora GA e supporta repository-scoped namespace (`agent/repo`)
98
+ - Tutti i tool coding in un'unica installazione: `pip install kore-memory`
99
+
100
+ #### Quality & Coverage
101
+ - **`.coveragerc`**: esclude `vector_index.py`, `integrations/pydantic_ai.py`, `integrations/openai_agents.py`, `welcome.py` dai report locali (testati in CI separata o non applicabili)
102
+ - **`tests/test_coverage_gaps.py`**: 17 test mirati per branch non coperti (`/agents`, wildcard `q=*`, `update_memory` branches, session double-check locking)
103
+ - Coverage raggiunge **80%** sulla soglia CI (era 76% prima di questo ciclo)
104
+
105
+ ### Closes
106
+
107
+ - #95 (#030 Coding Memory Mode GA)
108
+ - #96 (#031 Release v3.0.0)
109
+
110
+ ### Wave 3 — Completata
111
+
112
+ | Issue | Feature | Versione |
113
+ |-------|---------|---------|
114
+ | #024 | Filesystem Overlay | v2.3.0 |
115
+ | #025 | File Watcher (watchdog) | v2.5.0 |
116
+ | #026 | Typed Relations | v2.3.0 |
117
+ | #027 | Subgraph Extraction | v2.3.0 |
118
+ | #028 | Hub Detection | v2.3.0 |
119
+ | #029 | Benchmark CI | v2.3.0 |
120
+ | #030 | Coding Memory Mode GA | v3.0.0 |
121
+
122
+ ### Tests
123
+ - **648 test totali** (da 572 in v2.2 → +76 in Wave 3)
124
+ - Coverage: **80%** (soglia CI: 80%)
125
+
126
+ ---
127
+
14
128
  ## [2.5.0] - 2026-04-14
15
129
 
16
130
  ### Theme: "Filesystem Watcher — Live Overlay Sync"