zettelforge 2.5.2__tar.gz → 2.7.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 (418) hide show
  1. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/ci.yml +1 -1
  2. zettelforge-2.7.0/.github/workflows/stale.yml +47 -0
  3. {zettelforge-2.5.2 → zettelforge-2.7.0}/.gitignore +13 -0
  4. {zettelforge-2.5.2 → zettelforge-2.7.0}/CHANGELOG.md +163 -0
  5. {zettelforge-2.5.2 → zettelforge-2.7.0}/CONTRIBUTING.md +43 -0
  6. zettelforge-2.7.0/CONTRIBUTORS.md +17 -0
  7. {zettelforge-2.5.2 → zettelforge-2.7.0}/PKG-INFO +113 -79
  8. zettelforge-2.7.0/README.md +288 -0
  9. zettelforge-2.7.0/ROADMAP.md +94 -0
  10. zettelforge-2.7.0/SCOPING_DOC.md +283 -0
  11. {zettelforge-2.5.2 → zettelforge-2.7.0}/config.default.yaml +69 -1
  12. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/THREAT_MODEL.md +7 -5
  13. zettelforge-2.7.0/docs/explanation/llm-budgets-and-timeouts.md +101 -0
  14. zettelforge-2.7.0/docs/how-to/build-extensions.md +199 -0
  15. zettelforge-2.7.0/docs/how-to/configure-sigma-ingestion.md +183 -0
  16. zettelforge-2.7.0/docs/how-to/configure-yara-ingestion.md +223 -0
  17. zettelforge-2.7.0/docs/how-to/integrate-with-crewai.md +203 -0
  18. zettelforge-2.7.0/docs/how-to/integrate-with-langchain.md +210 -0
  19. zettelforge-2.7.0/docs/how-to/maintain-lancedb.md +82 -0
  20. zettelforge-2.7.0/docs/how-to/set-up-mcp-server.md +197 -0
  21. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/troubleshoot.md +99 -8
  22. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/upgrade.md +67 -3
  23. zettelforge-2.7.0/docs/how-to/use-detection-rules.md +191 -0
  24. zettelforge-2.7.0/docs/how-to/use-web-interface.md +177 -0
  25. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/index.md +4 -2
  26. zettelforge-2.7.0/docs/marketing/awesome-list-submissions.md +210 -0
  27. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/configuration.md +144 -7
  28. zettelforge-2.7.0/docs/reference/detection-rules-schema.md +416 -0
  29. zettelforge-2.7.0/docs/reference/editions.md +257 -0
  30. zettelforge-2.7.0/docs/reference/entity-indexer-concurrency.md +346 -0
  31. zettelforge-2.7.0/docs/reference/kg-edge-schema.md +415 -0
  32. zettelforge-2.7.0/docs/reference/mcp-protocol.md +723 -0
  33. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/module-inventory.md +40 -1
  34. zettelforge-2.7.0/docs/reference/sigma-schema-reference.md +367 -0
  35. zettelforge-2.7.0/docs/reference/web-api.md +415 -0
  36. zettelforge-2.7.0/docs/reference/yara-schema-reference.md +396 -0
  37. zettelforge-2.7.0/docs/rfcs/RFC-002a-retrieval-plumbing.md +214 -0
  38. zettelforge-2.7.0/docs/rfcs/RFC-014-content-limits.md +143 -0
  39. zettelforge-2.7.0/docs/rfcs/RFC-015-zettelforge-web-gui.md +624 -0
  40. zettelforge-2.7.0/docs/rfcs/RFC-016-osint-layer.md +411 -0
  41. zettelforge-2.7.0/docs/rfcs/RFC-017-memsad-write-time-defenses.md +402 -0
  42. zettelforge-2.7.0/examples/crewai_cti_crew.py +162 -0
  43. zettelforge-2.7.0/examples/cti_analysis.ipynb +381 -0
  44. zettelforge-2.7.0/examples/ingest_misp.py +467 -0
  45. zettelforge-2.7.0/examples/quickstart.py +35 -0
  46. zettelforge-2.7.0/examples/sample_misp_event.json +121 -0
  47. {zettelforge-2.5.2 → zettelforge-2.7.0}/mkdocs.yml +26 -9
  48. zettelforge-2.7.0/pr-body.md +41 -0
  49. {zettelforge-2.5.2 → zettelforge-2.7.0}/pyproject.toml +31 -1
  50. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/__init__.py +5 -1
  51. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/config.py +106 -0
  52. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/governance_validator.py +17 -1
  53. zettelforge-2.7.0/src/zettelforge/integrations/__init__.py +22 -0
  54. zettelforge-2.7.0/src/zettelforge/integrations/crewai.py +368 -0
  55. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/lance_maintenance.py +8 -8
  56. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/litellm_provider.py +36 -7
  57. zettelforge-2.7.0/src/zettelforge/memory_defense.py +384 -0
  58. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_manager.py +124 -7
  59. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/ontology.py +5 -0
  60. zettelforge-2.7.0/src/zettelforge/osint/__init__.py +80 -0
  61. zettelforge-2.7.0/src/zettelforge/osint/collectors/__init__.py +5 -0
  62. zettelforge-2.7.0/src/zettelforge/osint/collectors/breach/__init__.py +17 -0
  63. zettelforge-2.7.0/src/zettelforge/osint/collectors/breach/breach_directory.py +46 -0
  64. zettelforge-2.7.0/src/zettelforge/osint/collectors/breach/hibp_collector.py +46 -0
  65. zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/__init__.py +25 -0
  66. zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/bgp_collector.py +125 -0
  67. zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/cert_collector.py +124 -0
  68. zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/dns_collector.py +211 -0
  69. zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/port_scanner.py +109 -0
  70. zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/whois_collector.py +286 -0
  71. zettelforge-2.7.0/src/zettelforge/osint/collectors/people/__init__.py +20 -0
  72. zettelforge-2.7.0/src/zettelforge/osint/collectors/people/holehe_collector.py +47 -0
  73. zettelforge-2.7.0/src/zettelforge/osint/collectors/people/hunter_collector.py +54 -0
  74. zettelforge-2.7.0/src/zettelforge/osint/collectors/people/namechk_collector.py +42 -0
  75. zettelforge-2.7.0/src/zettelforge/osint/collectors/social/__init__.py +17 -0
  76. zettelforge-2.7.0/src/zettelforge/osint/collectors/social/hashtag_tracker.py +46 -0
  77. zettelforge-2.7.0/src/zettelforge/osint/collectors/social/twitter_collector.py +49 -0
  78. zettelforge-2.7.0/src/zettelforge/osint/collectors/tech/__init__.py +17 -0
  79. zettelforge-2.7.0/src/zettelforge/osint/collectors/tech/builtwith_collector.py +53 -0
  80. zettelforge-2.7.0/src/zettelforge/osint/collectors/tech/wappalyzer_collector.py +56 -0
  81. zettelforge-2.7.0/src/zettelforge/osint/entity_resolver.py +164 -0
  82. zettelforge-2.7.0/src/zettelforge/osint/investigation.py +129 -0
  83. zettelforge-2.7.0/src/zettelforge/osint/ontology.py +472 -0
  84. zettelforge-2.7.0/src/zettelforge/osint/transform_registry.py +123 -0
  85. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/human_eval_sampler.py +2 -2
  86. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/telemetry_dashboard.py +1 -1
  87. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/telemetry.py +50 -14
  88. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_config.py +27 -0
  89. zettelforge-2.7.0/tests/test_crewai_integration.py +312 -0
  90. zettelforge-2.7.0/tests/test_governance.py +125 -0
  91. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_llm_client.py +6 -2
  92. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_llm_providers.py +123 -9
  93. zettelforge-2.7.0/tests/test_memory_defense.py +90 -0
  94. zettelforge-2.7.0/tests/test_osint_collectors.py +438 -0
  95. zettelforge-2.7.0/tests/test_osint_entities.py +281 -0
  96. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_performance.py +7 -3
  97. zettelforge-2.7.0/tests/test_web_api.py +493 -0
  98. zettelforge-2.7.0/web/app.py +1005 -0
  99. zettelforge-2.7.0/web/static/css/design_tokens.css +114 -0
  100. zettelforge-2.7.0/web/templates/base.html +201 -0
  101. zettelforge-2.7.0/web/templates/components/remember_panel.html +72 -0
  102. zettelforge-2.7.0/web/templates/components/result_card.html +98 -0
  103. zettelforge-2.7.0/web/templates/components/search_bar.html +11 -0
  104. zettelforge-2.7.0/web/templates/components/synthesis_block.html +58 -0
  105. zettelforge-2.7.0/web/templates/components/tab_bar.html +42 -0
  106. zettelforge-2.7.0/web/templates/config_editor.html +799 -0
  107. zettelforge-2.7.0/web/templates/index.html +279 -0
  108. zettelforge-2.7.0/web/ui/assets/favicon-16.png +0 -0
  109. zettelforge-2.7.0/web/ui/assets/favicon-32.png +0 -0
  110. zettelforge-2.7.0/web/ui/assets/favicon-512.png +0 -0
  111. zettelforge-2.7.0/web/ui/assets/favicon-apple-touch.png +0 -0
  112. zettelforge-2.7.0/web/ui/assets/logo.svg +42 -0
  113. zettelforge-2.7.0/web/ui/assets/threatrecall-lockup.svg +39 -0
  114. zettelforge-2.7.0/web/ui/assets/zettelforge_architecture.svg +104 -0
  115. zettelforge-2.7.0/web/ui/colors_and_type.css +286 -0
  116. zettelforge-2.7.0/web/ui/favicon.svg +33 -0
  117. zettelforge-2.7.0/web/ui/fonts/Neuropol.otf +0 -0
  118. zettelforge-2.7.0/web/ui/index.html +55 -0
  119. zettelforge-2.7.0/web/ui/js/app.js +144 -0
  120. zettelforge-2.7.0/web/ui/js/components/header.js +95 -0
  121. zettelforge-2.7.0/web/ui/js/components/result-card.js +69 -0
  122. zettelforge-2.7.0/web/ui/js/components/sidebar.js +57 -0
  123. zettelforge-2.7.0/web/ui/js/components/spinner.js +8 -0
  124. zettelforge-2.7.0/web/ui/js/components/tabs.js +17 -0
  125. zettelforge-2.7.0/web/ui/js/components/toast.js +35 -0
  126. zettelforge-2.7.0/web/ui/js/lib/api.js +83 -0
  127. zettelforge-2.7.0/web/ui/js/lib/state.js +50 -0
  128. zettelforge-2.7.0/web/ui/js/views/configuration.js +784 -0
  129. zettelforge-2.7.0/web/ui/js/views/dashboard.js +251 -0
  130. zettelforge-2.7.0/web/ui/js/views/entities.js +415 -0
  131. zettelforge-2.7.0/web/ui/js/views/history.js +296 -0
  132. zettelforge-2.7.0/web/ui/js/views/ingest.js +425 -0
  133. zettelforge-2.7.0/web/ui/js/views/knowledge-graph.js +606 -0
  134. zettelforge-2.7.0/web/ui/js/views/logs.js +256 -0
  135. zettelforge-2.7.0/web/ui/js/views/search.js +358 -0
  136. zettelforge-2.5.2/README.md +0 -269
  137. zettelforge-2.5.2/docs/superpowers/research/2026-04-09-ctibench-ragas-benchmarks.md +0 -31
  138. zettelforge-2.5.2/docs/superpowers/research/2026-04-09-fastembed-local-embeddings.md +0 -460
  139. zettelforge-2.5.2/docs/superpowers/research/2026-04-09-hybrid-typedb-lancedb-architecture.md +0 -855
  140. zettelforge-2.5.2/docs/superpowers/research/2026-04-09-local-llm-llama-cpp.md +0 -17
  141. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-anti-aversion-cleanup.md +0 -763
  142. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-causal-graph.md +0 -409
  143. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-ctibench-ate-fix.md +0 -211
  144. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-format-stability.md +0 -1029
  145. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-memory-evolution.md +0 -428
  146. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-merge-consolidation.md +0 -372
  147. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-persistence-semantics.md +0 -422
  148. zettelforge-2.5.2/docs/superpowers/research/2026-04-15-sqlite-migration.md +0 -636
  149. zettelforge-2.5.2/docs/superpowers/research/2026-04-17-test-suite-audit.md +0 -178
  150. zettelforge-2.5.2/docs/superpowers/research/2026-04-24-phase-0.5-attribution-prelim.md +0 -123
  151. zettelforge-2.5.2/docs/superpowers/research/2026-04-25-graph-retriever-silence.md +0 -117
  152. zettelforge-2.5.2/docs/superpowers/research/2026-04-25-phase-0.5-attribution.md +0 -230
  153. zettelforge-2.5.2/docs/superpowers/research/README.md +0 -40
  154. zettelforge-2.5.2/docs/superpowers/specs/2026-04-15-p1-features-prd.md +0 -990
  155. zettelforge-2.5.2/examples/quickstart.py +0 -18
  156. zettelforge-2.5.2/src/zettelforge/integrations/__init__.py +0 -10
  157. zettelforge-2.5.2/tests/test_governance.py +0 -32
  158. zettelforge-2.5.2/web/app.py +0 -530
  159. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/CODEOWNERS +0 -0
  160. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  161. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  162. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/SECURITY.md +0 -0
  163. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/dependabot.yml +0 -0
  164. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/pull_request_template.md +0 -0
  165. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/docs.yml +0 -0
  166. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/publish.yml +0 -0
  167. {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/snyk-security.yml +0 -0
  168. {zettelforge-2.5.2 → zettelforge-2.7.0}/ARCHITECTURE.md +0 -0
  169. {zettelforge-2.5.2 → zettelforge-2.7.0}/CODEOWNERS +0 -0
  170. {zettelforge-2.5.2 → zettelforge-2.7.0}/CODE_OF_CONDUCT.md +0 -0
  171. {zettelforge-2.5.2 → zettelforge-2.7.0}/Dockerfile +0 -0
  172. {zettelforge-2.5.2 → zettelforge-2.7.0}/GOVERNANCE.md +0 -0
  173. {zettelforge-2.5.2 → zettelforge-2.7.0}/LICENSE +0 -0
  174. {zettelforge-2.5.2 → zettelforge-2.7.0}/MANIFEST.in +0 -0
  175. {zettelforge-2.5.2 → zettelforge-2.7.0}/SECURITY.md +0 -0
  176. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/BENCHMARK_REPORT.md +0 -0
  177. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/LOCOMO_BENCHMARK_COMPARISON.md +0 -0
  178. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/auto_ralph.py +0 -0
  179. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/benchmark_harness.py +0 -0
  180. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_benchmark_v2.py +0 -0
  181. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_retrieval_benchmark.py +0 -0
  182. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_retrieval_results.json +0 -0
  183. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_v2_results.json +0 -0
  184. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ctibench_benchmark.py +0 -0
  185. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ctibench_results.json +0 -0
  186. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/dataset.json +0 -0
  187. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/enterprise-attack.json +0 -0
  188. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/evolve_benchmark.py +0 -0
  189. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/evolve_results.json +0 -0
  190. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/graph_test.py +0 -0
  191. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/locomo_benchmark.py +0 -0
  192. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/locomo_results.json +0 -0
  193. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/locomo_results_v1.3.0_baseline.json +0 -0
  194. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/memoryagentbench.py +0 -0
  195. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/memoryagentbench_results.json +0 -0
  196. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/mempalace_benchmark.py +0 -0
  197. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/mempalace_results.json +0 -0
  198. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/naive_memory.py +0 -0
  199. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/opencti_benchmark.py +0 -0
  200. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ragas_benchmark.py +0 -0
  201. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ragas_cti_results.json +0 -0
  202. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ragas_results.json +0 -0
  203. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/results/benchmark_report.md +0 -0
  204. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/results/ralph_optimization_log.json +0 -0
  205. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/scale_benchmark.py +0 -0
  206. {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/scale_results.json +0 -0
  207. {zettelforge-2.5.2 → zettelforge-2.7.0}/config.example.yaml +0 -0
  208. {zettelforge-2.5.2 → zettelforge-2.7.0}/docker/docker-compose.yml +0 -0
  209. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/.well-known/security.txt +0 -0
  210. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/CNAME +0 -0
  211. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/architecture-diagram.mmd +0 -0
  212. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/archive/PACKAGE_SUMMARY.md +0 -0
  213. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/archive/README.md +0 -0
  214. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/archive/SKILL.md +0 -0
  215. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/ZettelForge_Architecture.mmd +0 -0
  216. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/architecture-overview.mmd +0 -0
  217. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/architecture-read-path.mmd +0 -0
  218. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/architecture-write-path.mmd +0 -0
  219. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/cf-analytics.js +0 -0
  220. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/demo.gif +0 -0
  221. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-16.png +0 -0
  222. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-32.png +0 -0
  223. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-512.png +0 -0
  224. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-64.png +0 -0
  225. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-apple-touch.png +0 -0
  226. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-old.svg +0 -0
  227. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon.svg +0 -0
  228. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/logo.svg +0 -0
  229. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/social-preview.png +0 -0
  230. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-lockup-monogram.svg +0 -0
  231. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-lockup.svg +0 -0
  232. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-logo-flat.svg +0 -0
  233. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-logo-philosophy.md +0 -0
  234. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-logo.png +0 -0
  235. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-mark.png +0 -0
  236. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/zettelforge_architecture-light.svg +0 -0
  237. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/zettelforge_architecture.svg +0 -0
  238. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/brand/brandIdentity.md +0 -0
  239. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/brand/colors_and_type.css +0 -0
  240. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/architecture.md +0 -0
  241. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/epistemic-tiers.md +0 -0
  242. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/stix-in-zettelforge.md +0 -0
  243. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/two-phase-pipeline.md +0 -0
  244. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/zettelkasten-philosophy.md +0 -0
  245. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-lancedb.md +0 -0
  246. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-opencti.md +0 -0
  247. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-pii.md +0 -0
  248. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-typedb.md +0 -0
  249. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/ingest-news-report.md +0 -0
  250. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/integrate-llm-agent.md +0 -0
  251. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/migrate-jsonl-to-sqlite.md +0 -0
  252. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/query-apt-tools.md +0 -0
  253. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/reproduce-benchmarks.md +0 -0
  254. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/resolve-aliases.md +0 -0
  255. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/run-temporal-query.md +0 -0
  256. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/store-threat-actor.md +0 -0
  257. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/human-evaluation-rubric.md +0 -0
  258. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/llms.txt +0 -0
  259. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/narrative/2026-04-16-the-memory-problem.md +0 -0
  260. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/overrides/main.html +0 -0
  261. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/architecture-deep-dive.md +0 -0
  262. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/governance-controls.md +0 -0
  263. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/memory-manager-api.md +0 -0
  264. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/retrieval-policies.md +0 -0
  265. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/stix-schema.md +0 -0
  266. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-001-conversational-entity-extractor.md +0 -0
  267. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-002-universal-llm-provider.md +0 -0
  268. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-003-adversarial-review.md +0 -0
  269. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-003-read-path-depth-routing.md +0 -0
  270. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-007-operational-telemetry.md +0 -0
  271. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-009-enrichment-pipeline-v2.md +0 -0
  272. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-010-enrichment-hotfix.md +0 -0
  273. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-011-local-llm-backend-config.md +0 -0
  274. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-012-litellm-unified-provider.md +0 -0
  275. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-013-presidio-pii-detection.md +0 -0
  276. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/stylesheets/brand-tokens.css +0 -0
  277. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/stylesheets/extra.css +0 -0
  278. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/stylesheets/fonts/Neuropol.otf +0 -0
  279. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/tutorials/01-quickstart.md +0 -0
  280. {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/tutorials/02-first-cti-report.md +0 -0
  281. {zettelforge-2.5.2 → zettelforge-2.7.0}/examples/athf_bridge.py +0 -0
  282. {zettelforge-2.5.2 → zettelforge-2.7.0}/examples/mcp_claude_code.md +0 -0
  283. {zettelforge-2.5.2 → zettelforge-2.7.0}/governance/controls.yaml +0 -0
  284. {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/migrate_jsonl_to_sqlite.py +0 -0
  285. {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/rebuild_index.py +0 -0
  286. {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/record-demo.sh +0 -0
  287. {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/typedb-setup.sh +0 -0
  288. {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/zettelforge-rebuild.service +0 -0
  289. {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/zettelforge-rebuild.timer +0 -0
  290. {zettelforge-2.5.2 → zettelforge-2.7.0}/server.json +0 -0
  291. {zettelforge-2.5.2 → zettelforge-2.7.0}/skills/claude-code-skill.md +0 -0
  292. {zettelforge-2.5.2 → zettelforge-2.7.0}/skills/openclaw-skill.md +0 -0
  293. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/__main__.py +0 -0
  294. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/alias_resolver.py +0 -0
  295. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/backend_factory.py +0 -0
  296. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/blended_retriever.py +0 -0
  297. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/cache.py +0 -0
  298. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/consolidation.py +0 -0
  299. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/demo.py +0 -0
  300. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/__init__.py +0 -0
  301. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/base.py +0 -0
  302. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/consumers.py +0 -0
  303. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/explainer.py +0 -0
  304. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/edition.py +0 -0
  305. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/entity_indexer.py +0 -0
  306. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/extensions.py +0 -0
  307. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/fact_extractor.py +0 -0
  308. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/graph_retriever.py +0 -0
  309. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/integrations/langchain_retriever.py +0 -0
  310. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/intent_classifier.py +0 -0
  311. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/json_parse.py +0 -0
  312. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/knowledge_graph.py +0 -0
  313. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_client.py +0 -0
  314. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/__init__.py +0 -0
  315. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/base.py +0 -0
  316. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/local_provider.py +0 -0
  317. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/mock_provider.py +0 -0
  318. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/ollama_provider.py +0 -0
  319. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/registry.py +0 -0
  320. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/log.py +0 -0
  321. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/mcp/__init__.py +0 -0
  322. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/mcp/__main__.py +0 -0
  323. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/mcp/server.py +0 -0
  324. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_evolver.py +0 -0
  325. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_store.py +0 -0
  326. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_updater.py +0 -0
  327. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/note_constructor.py +0 -0
  328. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/note_schema.py +0 -0
  329. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/observability.py +0 -0
  330. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/ocsf.py +0 -0
  331. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/pii_validator.py +0 -0
  332. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/retry.py +0 -0
  333. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/compact_lance.py +0 -0
  334. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/telemetry_aggregator.py +0 -0
  335. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/__init__.py +0 -0
  336. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/cli.py +0 -0
  337. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/entities.py +0 -0
  338. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/ingest.py +0 -0
  339. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/parser.py +0 -0
  340. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/NOTICE.md +0 -0
  341. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/__init__.py +0 -0
  342. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/sigma-correlation-rules-schema.json +0 -0
  343. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/sigma-detection-rule-schema.json +0 -0
  344. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/sigma-filters-schema.json +0 -0
  345. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/tags.py +0 -0
  346. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sqlite_backend.py +0 -0
  347. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/storage_backend.py +0 -0
  348. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/synthesis_generator.py +0 -0
  349. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/synthesis_validator.py +0 -0
  350. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/vector_memory.py +0 -0
  351. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/vector_retriever.py +0 -0
  352. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/__init__.py +0 -0
  353. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/cccs_metadata.py +0 -0
  354. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/cli.py +0 -0
  355. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/entities.py +0 -0
  356. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/ingest.py +0 -0
  357. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/parser.py +0 -0
  358. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/CCCS_YARA.yml +0 -0
  359. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/CCCS_YARA_values.yml +0 -0
  360. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/NOTICE.md +0 -0
  361. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/__init__.py +0 -0
  362. {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/tags.py +0 -0
  363. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/__init__.py +0 -0
  364. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/benchmark_scale.py +0 -0
  365. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/conftest.py +0 -0
  366. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/cloud_example.yml +0 -0
  367. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/correlation_example.yml +0 -0
  368. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/process_creation_example.yml +0 -0
  369. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/tagged_example.yml +0 -0
  370. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/yara/malware_hash.yar +0 -0
  371. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/yara/technique_loader.yar +0 -0
  372. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/yara/webshell.yar +0 -0
  373. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_basic.py +0 -0
  374. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_blended_retriever.py +0 -0
  375. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_causal_extraction.py +0 -0
  376. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_consolidation.py +0 -0
  377. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_conversational_entities.py +0 -0
  378. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_core.py +0 -0
  379. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_cti_integration.py +0 -0
  380. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_detection_explainer.py +0 -0
  381. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_detection_rule_entities.py +0 -0
  382. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_edition.py +0 -0
  383. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_embedding.py +0 -0
  384. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_entity_indexer_races.py +0 -0
  385. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_extensions.py +0 -0
  386. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_fact_extractor.py +0 -0
  387. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_governance_spec_drift.py +0 -0
  388. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_graph_retriever.py +0 -0
  389. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_human_eval_sampler.py +0 -0
  390. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_intent_classifier.py +0 -0
  391. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_json_parse.py +0 -0
  392. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_kg_edge_schema.py +0 -0
  393. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_lance_maintenance.py +0 -0
  394. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_langchain_retriever.py +0 -0
  395. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_logging_compliance.py +0 -0
  396. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_mcp_server.py +0 -0
  397. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_memory_evolver.py +0 -0
  398. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_memory_updater.py +0 -0
  399. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_pii_validator.py +0 -0
  400. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_recall_integration.py +0 -0
  401. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sigma_entities.py +0 -0
  402. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sigma_ingest.py +0 -0
  403. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sigma_parser.py +0 -0
  404. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sqlite_backend.py +0 -0
  405. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sqlite_integration.py +0 -0
  406. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_storage_backend.py +0 -0
  407. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_aggregator.py +0 -0
  408. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_collector.py +0 -0
  409. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_dashboard.py +0 -0
  410. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_integration.py +0 -0
  411. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_temporal_graph.py +0 -0
  412. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_two_phase_e2e.py +0 -0
  413. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_typedb_client.py +0 -0
  414. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_yara_entities.py +0 -0
  415. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_yara_ingest.py +0 -0
  416. {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_yara_parser.py +0 -0
  417. {zettelforge-2.5.2 → zettelforge-2.7.0}/web/auth.py +0 -0
  418. {zettelforge-2.5.2 → zettelforge-2.7.0}/web/mcp_server.py +0 -0
@@ -102,7 +102,7 @@ jobs:
102
102
 
103
103
  - name: Upload coverage
104
104
  if: matrix.python-version == '3.12'
105
- uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2
105
+ uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354
106
106
  with:
107
107
  file: ./coverage.xml
108
108
  fail_ci_if_error: false
@@ -0,0 +1,47 @@
1
+ name: Stale issue and PR management
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 9 * * 1" # Every Monday at 09:00 UTC
6
+
7
+ permissions:
8
+ issues: write
9
+ pull-requests: write
10
+
11
+ jobs:
12
+ stale:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/stale@v10
16
+ with:
17
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
18
+
19
+ # Issues
20
+ stale-issue-message: >
21
+ This issue has been inactive for 60 days. It will be closed
22
+ in 14 days unless there is new activity. If this is still
23
+ relevant, please comment to keep it open.
24
+ close-issue-message: >
25
+ This issue has been automatically closed after 14 days of
26
+ inactivity. It can be reopened at any time.
27
+ days-before-issue-stale: 60
28
+ days-before-issue-close: 14
29
+ stale-issue-label: stale
30
+ exempt-issue-labels: "p0,planned,help wanted,good first issue"
31
+
32
+ # PRs
33
+ stale-pr-message: >
34
+ This pull request has been inactive for 60 days. It will be
35
+ closed in 14 days unless there is new activity.
36
+ close-pr-message: >
37
+ This pull request has been automatically closed after 14 days
38
+ of inactivity.
39
+ days-before-pr-stale: 60
40
+ days-before-pr-close: 14
41
+ stale-pr-label: stale
42
+ exempt-pr-labels: "draft,work-in-progress"
43
+
44
+ # General
45
+ operations-per-run: 100
46
+ remove-stale-when-updated: true
47
+ delete-branch: false
@@ -12,6 +12,17 @@ tasks/
12
12
  docs/.ralph/
13
13
  agentsync.md
14
14
 
15
+ # Internal research/specs/plans — workspace scratch that contains
16
+ # unredacted incident detail, customer references, and intermediate
17
+ # reasoning. Kept on disk for the maintainer; not published.
18
+ docs/superpowers/
19
+
20
+ # Claude Code session artifacts — agent worktrees, transcripts, and
21
+ # scratch state created by the maintainer's local tooling. Belt-and-
22
+ # suspenders: these were never tracked, but listing them prevents an
23
+ # accidental `git add -A` from sweeping them in.
24
+ .claude/
25
+
15
26
  # MkDocs build output (regenerated from docs/)
16
27
  site/
17
28
 
@@ -28,6 +39,8 @@ downloads/
28
39
  eggs/
29
40
  .eggs/
30
41
  lib/
42
+ !web/ui/js/lib/
43
+ !web/ui/js/lib/*.js
31
44
  lib64/
32
45
  parts/
33
46
  sdist/
@@ -6,6 +6,169 @@ Versioning follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.7.0] - 2026-05-26
10
+
11
+ Security and OSINT release. Adds the RFC-016 OSINT layer and the first
12
+ SEC-011 / MemSAD-inspired write-time memory-poisoning defense. No data
13
+ migration is required. The new memory defense ships in audit mode by default.
14
+
15
+ ### Added
16
+
17
+ - **OSINT layer scaffold and Phase 1 collectors** (RFC-016). Adds
18
+ `zettelforge.osint` with infrastructure, breach, people, social, and
19
+ technology collector packages; OSINT ontology and relation extensions;
20
+ entity canonicalization helpers; collector registry; and tests covering
21
+ DNS, WHOIS, certificates, BGP, ports, breach, people, social, and tech
22
+ collector contracts. Optional runtime dependencies are available with
23
+ `pip install zettelforge[osint]`.
24
+ - **Write-time memory anomaly defense** (SEC-011 / MemSAD). New
25
+ `MemoryAnomalyGate` scores candidate notes before persistence using
26
+ MemSAD-style max/mean embedding similarity against recent domain
27
+ calibration notes plus character n-gram Jensen-Shannon divergence to
28
+ reduce synonym/paraphrase evasion. Config lives under
29
+ `governance.memory_defense`; default mode is `audit`, with `block` and
30
+ `quarantine` available once a deployment has a clean calibration corpus.
31
+ - **Quarantine path for rejected memory writes.** In `quarantine` mode,
32
+ flagged notes are written to JSONL forensic quarantine and are not exposed
33
+ to recall, entity lookup, LanceDB, or graph traversal.
34
+ - **CrewAI integration** (issue #40). New optional extra
35
+ `pip install zettelforge[crewai]` exposes `ZettelForgeRecallTool`,
36
+ `ZettelForgeRememberTool`, and `ZettelForgeSynthesizeTool` as CrewAI
37
+ `BaseTool` subclasses. CTI-focused crews can now use ZettelForge as a
38
+ drop-in alternative to CrewAI's existing Mem0 memory tools, with
39
+ per-tool description copy aimed at routing the LLM to the right tool
40
+ (recall for lookups, remember for findings, synthesize for final answers).
41
+ See `examples/crewai_cti_crew.py` for a runnable two-agent demo.
42
+ Tests gated on `pytest.importorskip("crewai")`; 11 pass against
43
+ crewai 1.14.x.
44
+
45
+ ### Changed
46
+
47
+ - **Telemetry attribution compatibility.** `caller` is now supported in
48
+ telemetry events while the previous `actor` field and method arguments
49
+ remain backward-compatible for existing dashboards and tests.
50
+ - **Real LLM integration and performance tests are explicit opt-in.**
51
+ Set `ZETTELFORGE_RUN_LLM_INTEGRATION=1` or
52
+ `ZETTELFORGE_RUN_PERFORMANCE_TESTS=1` to run environment-sensitive suites.
53
+ The default regression suite is now deterministic on machines without
54
+ local LLM credentials or dedicated benchmark hardware.
55
+
56
+ ### Tests
57
+
58
+ - Added focused memory-defense tests for insufficient calibration, audit-mode
59
+ anomaly detection, and quarantine writes.
60
+ - Default regression gate: `742 passed, 13 skipped`.
61
+
62
+ ## [2.6.2] - 2026-04-27
63
+
64
+ UI/UX release. Fixes the `/config` page so the Apply button actually works
65
+ and surfaces enum-style settings as dropdowns instead of free-text inputs.
66
+ No data migration. No config changes. No API contract changes.
67
+
68
+ ### Fixed
69
+
70
+ - **`/config` "Save Changes" button is no longer dead.** The Quick Settings
71
+ panel called `saveConfigForm()` and `reloadConfig()` — neither function
72
+ was defined anywhere, so the button silently no-op'd and the panel
73
+ rendered "Loading schema..." forever. Replaced with a real form-based
74
+ editor whose Apply button PUTs a nested payload to `/api/config` and
75
+ reloads from server on success.
76
+
77
+ ### Added
78
+
79
+ - **Form-based config editor with dropdowns.** `/config` now renders a
80
+ grouped settings form alongside the YAML editor. Known enum fields
81
+ (`backend`, `embedding.provider`, `llm.provider`, `llm.local_backend`,
82
+ `logging.level`, `synthesis.default_format`, `governance.pii.action`)
83
+ render as `<select>` controls instead of free-text inputs. Restart-
84
+ required leaves get a "restart required" badge sourced from the same
85
+ set the server uses, so the UI warning is never out of sync with the
86
+ server's classification.
87
+ - **Pending-changes counter and Revert button.** The form tracks dirty
88
+ fields by dotted path, builds a single nested payload on Apply, and
89
+ shows `N pending change(s) (M need restart)` next to the buttons.
90
+ - **YAML editor accepts both YAML and JSON** (was JSON-only despite the
91
+ label) and skips redacted `***` secrets so they aren't PUT back as
92
+ literal strings.
93
+
94
+ ### Tests
95
+
96
+ - 4 new tests in `tests/test_web_api.py`: dropdown enum round-trip for
97
+ `logging.level` (restart-required) and `synthesis.default_format` (live);
98
+ multi-section nested payload from a single Apply; and a regression guard
99
+ on the `/config` HTML structure (form tab, dropdown enum declarations,
100
+ restart-leaf flags, and proof the dead `saveConfigForm`/`reloadConfig`
101
+ handlers are gone). 28 passed, 2 skipped (was 24 + 2).
102
+
103
+ ## [2.6.1] - 2026-04-25
104
+
105
+ Hotfix release. Resolves three blockers found in code review of the
106
+ RFC-015 web GUI shipped in v2.6.0. No data migration. No config changes.
107
+
108
+ ### Fixed
109
+
110
+ - **`/config` HTML page now renders.** `_to_dict` was defined as a closure
111
+ inside `get_config_endpoint`, so every render of `/config` raised
112
+ `NameError`, was silently swallowed by a bare `except`, and left the
113
+ YAML body blank on initial server-side render. Promoted to a module-level
114
+ `_config_to_dict` helper used by both routes. (PR #131)
115
+ - **`PUT /api/config` correctly reports nested restart-required fields.**
116
+ The check compared top-level payload keys against a set of dotted-path
117
+ fields, so payloads like `{"embedding": {"provider": "x"}}` were
118
+ reported as `applied: ["embedding"]`, `pending_restart: []`, telling
119
+ operators a restart-required change had taken effect when it had not.
120
+ Added `_flatten_keys` to walk nested payloads to dotted leaf paths;
121
+ `applied` and `pending_restart` now contain accurate dotted paths.
122
+ (PR #131)
123
+ - **`/config` HTML route is now auth-gated.** `/api/config` was protected,
124
+ but the HTML shell (and once the `_to_dict` bug was fixed, its
125
+ server-rendered YAML body) was reachable without an API key. Added
126
+ `Depends(require_api_guard)` and made the YAML body redact secrets
127
+ before serialization. (PR #131)
128
+
129
+ ### Tests
130
+
131
+ - Added four regression tests in `tests/test_web_api.py` covering all
132
+ three fixes. 24 passed, 2 skipped (was 20 + 2).
133
+
134
+ ## [2.6.0] - 2026-04-25
135
+
136
+ Feature release. Adds configurable content-size limits for DoS mitigation
137
+ (RFC-014) and moves per-call-site LLM token budgets out of hardcoded
138
+ literals into `LLMConfig`, making them overridable at deploy time.
139
+
140
+ ### Added
141
+
142
+ - **Configurable content size limits** (`GovernanceConfig.limits.max_content_length`,
143
+ default 50 MB). `remember()` calls with content exceeding the limit are
144
+ rejected with a clear error message. Set to `0` to disable the check.
145
+ Environment override: `ZETTELFORGE_LIMITS_MAX_CONTENT_LENGTH`.
146
+ (RFC-014, PR #123)
147
+ - **Per-call-site `max_tokens` budgets configurable via `LLMConfig`**.
148
+ Five new fields: `max_tokens_causal` (8000), `max_tokens_synthesis` (2500),
149
+ `max_tokens_fact` (2500), `max_tokens_ner` (2500), `max_tokens_evolution` (2500).
150
+ Defaults match v2.5.2 values. No behavioral change for existing configs.
151
+ (PR #126, issue #125)
152
+
153
+ ### Changed
154
+
155
+ - **Docs: config reconciliation for v2.5.2** — `config.default.yaml` gained
156
+ the `lance:` section (RFC-009 Phase 1.5), `docs/reference/configuration.md`
157
+ now covers all v2.5.2 knobs (`lance`, `pii`, per-call-site budgets), and
158
+ `docs/explanation/llm-budgets-and-timeouts.md` explains the reasoning-model
159
+ token-budget tradeoffs. (PR #126)
160
+ - **`_apply_yaml()` now handles `lance:` section** — previously the
161
+ `lance.cleanup_interval_minutes` and `lance.cleanup_older_than_seconds` YAML
162
+ knobs were silently ignored (regression from RFC-009 Phase 1.5 landing in
163
+ v2.4.x without the `_apply_yaml` branch). (PR #126, code review finding)
164
+
165
+ ### Internal
166
+
167
+ - **Removed `docs/superpowers/` from version control**. The directory holds
168
+ workspace scratch — internal research and notes with unredacted incident
169
+ detail. 18 files (7319 lines) untracked. No published content lost.
170
+ (PR #128)
171
+
9
172
  ## [2.5.2] - 2026-04-25
10
173
 
11
174
  Hotfix release. Restores end-to-end functionality of synthesis, causal
@@ -37,6 +37,49 @@ If your contribution needs TypeDB or OpenCTI, open an issue to discuss.
37
37
  We keep the extension boundary clear so contributors know their work
38
38
  will always remain open source.
39
39
 
40
+ ### For major features: Start with an RFC
41
+
42
+ If you're proposing a significant new feature (new subsystem, new backend,
43
+ breaking API change), open an RFC before writing code. RFCs live in
44
+ `docs/rfcs/` and follow the template from the existing RFCs in that
45
+ directory. Open a Discussion first to socialize the idea, then file a
46
+ draft RFC as a PR. This prevents wasted effort on work that won't be
47
+ accepted.
48
+
49
+ See [ROADMAP.md](ROADMAP.md) for the current priorities and what's
50
+ planned for upcoming releases.
51
+
52
+ ### Good first issues
53
+
54
+ Issues tagged [good first issue](https://github.com/rolandpg/zettelforge/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
55
+ have structured acceptance criteria in the issue body. Check the issue
56
+ for: which files to edit, test expectations, and example input/output.
57
+ If an issue is unclear, ask in the issue comments.
58
+
59
+ ## Issue triage
60
+
61
+ This project is maintained by a solo developer (per GOV-006). Here is
62
+ what you can expect:
63
+
64
+ - **New issues**: triaged within 7 days. You will get a response (even
65
+ if it's "not planned, closing").
66
+ - **Bug reports**: severity assessed within 7 days. P0 (crash, data
67
+ loss, security) gets a same-day response.
68
+ - **Feature requests**: tagged with `enhancement` on creation. The
69
+ maintainer will add `planned`, `deferred`, or `won't fix` within 7
70
+ days.
71
+ - **PR reviews**: first review within 14 days of submission. Smaller
72
+ PRs get reviewed faster.
73
+ - **Stale issues**: issues with no activity for 60 days are tagged
74
+ `stale` and closed after 14 more days without response. This keeps
75
+ the tracker manageable for a solo maintainer.
76
+
77
+ ## Contributor recognition
78
+
79
+ Every contributor is listed in [CONTRIBUTORS.md](CONTRIBUTORS.md),
80
+ regardless of contribution size. If you submit a PR that gets merged,
81
+ you will be added. If your name is missing, open a PR.
82
+
40
83
  ## Code Style
41
84
 
42
85
  - Follow PEP 8
@@ -0,0 +1,17 @@
1
+ # Contributors
2
+
3
+ Thank you to everyone who has contributed to ZettelForge.
4
+
5
+ ## Maintainers
6
+
7
+ - **Patrick G. Roland II** — creator and lead maintainer
8
+
9
+ ## Contributors
10
+
11
+ This file tracks individuals who have contributed code, documentation, design, or other improvements. The maintainer updates it with each release.
12
+
13
+ If you have contributed and your name is missing, please open a PR or issue.
14
+
15
+ ---
16
+
17
+ *This project uses a "thank you, next" acknowledgment model. All contributors are listed regardless of contribution size. A typo fix counts.*