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.
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/ci.yml +1 -1
- zettelforge-2.7.0/.github/workflows/stale.yml +47 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.gitignore +13 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/CHANGELOG.md +163 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/CONTRIBUTING.md +43 -0
- zettelforge-2.7.0/CONTRIBUTORS.md +17 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/PKG-INFO +113 -79
- zettelforge-2.7.0/README.md +288 -0
- zettelforge-2.7.0/ROADMAP.md +94 -0
- zettelforge-2.7.0/SCOPING_DOC.md +283 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/config.default.yaml +69 -1
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/THREAT_MODEL.md +7 -5
- zettelforge-2.7.0/docs/explanation/llm-budgets-and-timeouts.md +101 -0
- zettelforge-2.7.0/docs/how-to/build-extensions.md +199 -0
- zettelforge-2.7.0/docs/how-to/configure-sigma-ingestion.md +183 -0
- zettelforge-2.7.0/docs/how-to/configure-yara-ingestion.md +223 -0
- zettelforge-2.7.0/docs/how-to/integrate-with-crewai.md +203 -0
- zettelforge-2.7.0/docs/how-to/integrate-with-langchain.md +210 -0
- zettelforge-2.7.0/docs/how-to/maintain-lancedb.md +82 -0
- zettelforge-2.7.0/docs/how-to/set-up-mcp-server.md +197 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/troubleshoot.md +99 -8
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/upgrade.md +67 -3
- zettelforge-2.7.0/docs/how-to/use-detection-rules.md +191 -0
- zettelforge-2.7.0/docs/how-to/use-web-interface.md +177 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/index.md +4 -2
- zettelforge-2.7.0/docs/marketing/awesome-list-submissions.md +210 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/configuration.md +144 -7
- zettelforge-2.7.0/docs/reference/detection-rules-schema.md +416 -0
- zettelforge-2.7.0/docs/reference/editions.md +257 -0
- zettelforge-2.7.0/docs/reference/entity-indexer-concurrency.md +346 -0
- zettelforge-2.7.0/docs/reference/kg-edge-schema.md +415 -0
- zettelforge-2.7.0/docs/reference/mcp-protocol.md +723 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/module-inventory.md +40 -1
- zettelforge-2.7.0/docs/reference/sigma-schema-reference.md +367 -0
- zettelforge-2.7.0/docs/reference/web-api.md +415 -0
- zettelforge-2.7.0/docs/reference/yara-schema-reference.md +396 -0
- zettelforge-2.7.0/docs/rfcs/RFC-002a-retrieval-plumbing.md +214 -0
- zettelforge-2.7.0/docs/rfcs/RFC-014-content-limits.md +143 -0
- zettelforge-2.7.0/docs/rfcs/RFC-015-zettelforge-web-gui.md +624 -0
- zettelforge-2.7.0/docs/rfcs/RFC-016-osint-layer.md +411 -0
- zettelforge-2.7.0/docs/rfcs/RFC-017-memsad-write-time-defenses.md +402 -0
- zettelforge-2.7.0/examples/crewai_cti_crew.py +162 -0
- zettelforge-2.7.0/examples/cti_analysis.ipynb +381 -0
- zettelforge-2.7.0/examples/ingest_misp.py +467 -0
- zettelforge-2.7.0/examples/quickstart.py +35 -0
- zettelforge-2.7.0/examples/sample_misp_event.json +121 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/mkdocs.yml +26 -9
- zettelforge-2.7.0/pr-body.md +41 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/pyproject.toml +31 -1
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/__init__.py +5 -1
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/config.py +106 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/governance_validator.py +17 -1
- zettelforge-2.7.0/src/zettelforge/integrations/__init__.py +22 -0
- zettelforge-2.7.0/src/zettelforge/integrations/crewai.py +368 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/lance_maintenance.py +8 -8
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/litellm_provider.py +36 -7
- zettelforge-2.7.0/src/zettelforge/memory_defense.py +384 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_manager.py +124 -7
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/ontology.py +5 -0
- zettelforge-2.7.0/src/zettelforge/osint/__init__.py +80 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/__init__.py +5 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/breach/__init__.py +17 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/breach/breach_directory.py +46 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/breach/hibp_collector.py +46 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/__init__.py +25 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/bgp_collector.py +125 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/cert_collector.py +124 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/dns_collector.py +211 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/port_scanner.py +109 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/infrastructure/whois_collector.py +286 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/people/__init__.py +20 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/people/holehe_collector.py +47 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/people/hunter_collector.py +54 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/people/namechk_collector.py +42 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/social/__init__.py +17 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/social/hashtag_tracker.py +46 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/social/twitter_collector.py +49 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/tech/__init__.py +17 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/tech/builtwith_collector.py +53 -0
- zettelforge-2.7.0/src/zettelforge/osint/collectors/tech/wappalyzer_collector.py +56 -0
- zettelforge-2.7.0/src/zettelforge/osint/entity_resolver.py +164 -0
- zettelforge-2.7.0/src/zettelforge/osint/investigation.py +129 -0
- zettelforge-2.7.0/src/zettelforge/osint/ontology.py +472 -0
- zettelforge-2.7.0/src/zettelforge/osint/transform_registry.py +123 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/human_eval_sampler.py +2 -2
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/telemetry_dashboard.py +1 -1
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/telemetry.py +50 -14
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_config.py +27 -0
- zettelforge-2.7.0/tests/test_crewai_integration.py +312 -0
- zettelforge-2.7.0/tests/test_governance.py +125 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_llm_client.py +6 -2
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_llm_providers.py +123 -9
- zettelforge-2.7.0/tests/test_memory_defense.py +90 -0
- zettelforge-2.7.0/tests/test_osint_collectors.py +438 -0
- zettelforge-2.7.0/tests/test_osint_entities.py +281 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_performance.py +7 -3
- zettelforge-2.7.0/tests/test_web_api.py +493 -0
- zettelforge-2.7.0/web/app.py +1005 -0
- zettelforge-2.7.0/web/static/css/design_tokens.css +114 -0
- zettelforge-2.7.0/web/templates/base.html +201 -0
- zettelforge-2.7.0/web/templates/components/remember_panel.html +72 -0
- zettelforge-2.7.0/web/templates/components/result_card.html +98 -0
- zettelforge-2.7.0/web/templates/components/search_bar.html +11 -0
- zettelforge-2.7.0/web/templates/components/synthesis_block.html +58 -0
- zettelforge-2.7.0/web/templates/components/tab_bar.html +42 -0
- zettelforge-2.7.0/web/templates/config_editor.html +799 -0
- zettelforge-2.7.0/web/templates/index.html +279 -0
- zettelforge-2.7.0/web/ui/assets/favicon-16.png +0 -0
- zettelforge-2.7.0/web/ui/assets/favicon-32.png +0 -0
- zettelforge-2.7.0/web/ui/assets/favicon-512.png +0 -0
- zettelforge-2.7.0/web/ui/assets/favicon-apple-touch.png +0 -0
- zettelforge-2.7.0/web/ui/assets/logo.svg +42 -0
- zettelforge-2.7.0/web/ui/assets/threatrecall-lockup.svg +39 -0
- zettelforge-2.7.0/web/ui/assets/zettelforge_architecture.svg +104 -0
- zettelforge-2.7.0/web/ui/colors_and_type.css +286 -0
- zettelforge-2.7.0/web/ui/favicon.svg +33 -0
- zettelforge-2.7.0/web/ui/fonts/Neuropol.otf +0 -0
- zettelforge-2.7.0/web/ui/index.html +55 -0
- zettelforge-2.7.0/web/ui/js/app.js +144 -0
- zettelforge-2.7.0/web/ui/js/components/header.js +95 -0
- zettelforge-2.7.0/web/ui/js/components/result-card.js +69 -0
- zettelforge-2.7.0/web/ui/js/components/sidebar.js +57 -0
- zettelforge-2.7.0/web/ui/js/components/spinner.js +8 -0
- zettelforge-2.7.0/web/ui/js/components/tabs.js +17 -0
- zettelforge-2.7.0/web/ui/js/components/toast.js +35 -0
- zettelforge-2.7.0/web/ui/js/lib/api.js +83 -0
- zettelforge-2.7.0/web/ui/js/lib/state.js +50 -0
- zettelforge-2.7.0/web/ui/js/views/configuration.js +784 -0
- zettelforge-2.7.0/web/ui/js/views/dashboard.js +251 -0
- zettelforge-2.7.0/web/ui/js/views/entities.js +415 -0
- zettelforge-2.7.0/web/ui/js/views/history.js +296 -0
- zettelforge-2.7.0/web/ui/js/views/ingest.js +425 -0
- zettelforge-2.7.0/web/ui/js/views/knowledge-graph.js +606 -0
- zettelforge-2.7.0/web/ui/js/views/logs.js +256 -0
- zettelforge-2.7.0/web/ui/js/views/search.js +358 -0
- zettelforge-2.5.2/README.md +0 -269
- zettelforge-2.5.2/docs/superpowers/research/2026-04-09-ctibench-ragas-benchmarks.md +0 -31
- zettelforge-2.5.2/docs/superpowers/research/2026-04-09-fastembed-local-embeddings.md +0 -460
- zettelforge-2.5.2/docs/superpowers/research/2026-04-09-hybrid-typedb-lancedb-architecture.md +0 -855
- zettelforge-2.5.2/docs/superpowers/research/2026-04-09-local-llm-llama-cpp.md +0 -17
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-anti-aversion-cleanup.md +0 -763
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-causal-graph.md +0 -409
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-ctibench-ate-fix.md +0 -211
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-format-stability.md +0 -1029
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-memory-evolution.md +0 -428
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-merge-consolidation.md +0 -372
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-persistence-semantics.md +0 -422
- zettelforge-2.5.2/docs/superpowers/research/2026-04-15-sqlite-migration.md +0 -636
- zettelforge-2.5.2/docs/superpowers/research/2026-04-17-test-suite-audit.md +0 -178
- zettelforge-2.5.2/docs/superpowers/research/2026-04-24-phase-0.5-attribution-prelim.md +0 -123
- zettelforge-2.5.2/docs/superpowers/research/2026-04-25-graph-retriever-silence.md +0 -117
- zettelforge-2.5.2/docs/superpowers/research/2026-04-25-phase-0.5-attribution.md +0 -230
- zettelforge-2.5.2/docs/superpowers/research/README.md +0 -40
- zettelforge-2.5.2/docs/superpowers/specs/2026-04-15-p1-features-prd.md +0 -990
- zettelforge-2.5.2/examples/quickstart.py +0 -18
- zettelforge-2.5.2/src/zettelforge/integrations/__init__.py +0 -10
- zettelforge-2.5.2/tests/test_governance.py +0 -32
- zettelforge-2.5.2/web/app.py +0 -530
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/CODEOWNERS +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/SECURITY.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/dependabot.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/pull_request_template.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/docs.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/publish.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/.github/workflows/snyk-security.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/ARCHITECTURE.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/CODEOWNERS +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/CODE_OF_CONDUCT.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/Dockerfile +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/GOVERNANCE.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/LICENSE +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/MANIFEST.in +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/SECURITY.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/BENCHMARK_REPORT.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/LOCOMO_BENCHMARK_COMPARISON.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/auto_ralph.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/benchmark_harness.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_benchmark_v2.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_retrieval_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_retrieval_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/cti_v2_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ctibench_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ctibench_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/dataset.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/enterprise-attack.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/evolve_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/evolve_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/graph_test.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/locomo_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/locomo_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/locomo_results_v1.3.0_baseline.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/memoryagentbench.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/memoryagentbench_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/mempalace_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/mempalace_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/naive_memory.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/opencti_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ragas_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ragas_cti_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/ragas_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/results/benchmark_report.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/results/ralph_optimization_log.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/scale_benchmark.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/benchmarks/scale_results.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/config.example.yaml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docker/docker-compose.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/.well-known/security.txt +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/CNAME +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/architecture-diagram.mmd +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/archive/PACKAGE_SUMMARY.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/archive/README.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/archive/SKILL.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/ZettelForge_Architecture.mmd +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/architecture-overview.mmd +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/architecture-read-path.mmd +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/architecture-write-path.mmd +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/cf-analytics.js +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/demo.gif +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-16.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-32.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-512.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-64.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-apple-touch.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon-old.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/favicon.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/logo.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/social-preview.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-lockup-monogram.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-lockup.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-logo-flat.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-logo-philosophy.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-logo.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/threatrecall-mark.png +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/zettelforge_architecture-light.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/assets/zettelforge_architecture.svg +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/brand/brandIdentity.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/brand/colors_and_type.css +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/architecture.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/epistemic-tiers.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/stix-in-zettelforge.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/two-phase-pipeline.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/explanation/zettelkasten-philosophy.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-lancedb.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-opencti.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-pii.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/configure-typedb.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/ingest-news-report.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/integrate-llm-agent.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/migrate-jsonl-to-sqlite.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/query-apt-tools.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/reproduce-benchmarks.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/resolve-aliases.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/run-temporal-query.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/how-to/store-threat-actor.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/human-evaluation-rubric.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/llms.txt +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/narrative/2026-04-16-the-memory-problem.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/overrides/main.html +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/architecture-deep-dive.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/governance-controls.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/memory-manager-api.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/retrieval-policies.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/reference/stix-schema.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-001-conversational-entity-extractor.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-002-universal-llm-provider.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-003-adversarial-review.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-003-read-path-depth-routing.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-007-operational-telemetry.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-009-enrichment-pipeline-v2.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-010-enrichment-hotfix.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-011-local-llm-backend-config.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-012-litellm-unified-provider.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/rfcs/RFC-013-presidio-pii-detection.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/stylesheets/brand-tokens.css +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/stylesheets/extra.css +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/stylesheets/fonts/Neuropol.otf +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/tutorials/01-quickstart.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/docs/tutorials/02-first-cti-report.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/examples/athf_bridge.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/examples/mcp_claude_code.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/governance/controls.yaml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/migrate_jsonl_to_sqlite.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/rebuild_index.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/record-demo.sh +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/typedb-setup.sh +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/zettelforge-rebuild.service +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/scripts/zettelforge-rebuild.timer +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/server.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/skills/claude-code-skill.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/skills/openclaw-skill.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/__main__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/alias_resolver.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/backend_factory.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/blended_retriever.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/cache.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/consolidation.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/demo.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/base.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/consumers.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/detection/explainer.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/edition.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/entity_indexer.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/extensions.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/fact_extractor.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/graph_retriever.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/integrations/langchain_retriever.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/intent_classifier.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/json_parse.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/knowledge_graph.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_client.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/base.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/local_provider.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/mock_provider.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/ollama_provider.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/llm_providers/registry.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/log.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/mcp/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/mcp/__main__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/mcp/server.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_evolver.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_store.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/memory_updater.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/note_constructor.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/note_schema.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/observability.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/ocsf.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/pii_validator.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/retry.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/compact_lance.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/scripts/telemetry_aggregator.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/cli.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/entities.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/ingest.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/parser.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/NOTICE.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/sigma-correlation-rules-schema.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/sigma-detection-rule-schema.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/schemas/sigma-filters-schema.json +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sigma/tags.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/sqlite_backend.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/storage_backend.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/synthesis_generator.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/synthesis_validator.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/vector_memory.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/vector_retriever.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/cccs_metadata.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/cli.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/entities.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/ingest.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/parser.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/CCCS_YARA.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/CCCS_YARA_values.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/NOTICE.md +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/schemas/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/src/zettelforge/yara/tags.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/__init__.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/benchmark_scale.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/conftest.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/cloud_example.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/correlation_example.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/process_creation_example.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/sigma/tagged_example.yml +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/yara/malware_hash.yar +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/yara/technique_loader.yar +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/fixtures/yara/webshell.yar +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_basic.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_blended_retriever.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_causal_extraction.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_consolidation.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_conversational_entities.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_core.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_cti_integration.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_detection_explainer.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_detection_rule_entities.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_edition.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_embedding.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_entity_indexer_races.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_extensions.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_fact_extractor.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_governance_spec_drift.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_graph_retriever.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_human_eval_sampler.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_intent_classifier.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_json_parse.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_kg_edge_schema.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_lance_maintenance.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_langchain_retriever.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_logging_compliance.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_mcp_server.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_memory_evolver.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_memory_updater.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_pii_validator.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_recall_integration.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sigma_entities.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sigma_ingest.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sigma_parser.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sqlite_backend.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_sqlite_integration.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_storage_backend.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_aggregator.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_collector.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_dashboard.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_telemetry_integration.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_temporal_graph.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_two_phase_e2e.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_typedb_client.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_yara_entities.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_yara_ingest.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/tests/test_yara_parser.py +0 -0
- {zettelforge-2.5.2 → zettelforge-2.7.0}/web/auth.py +0 -0
- {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@
|
|
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.*
|