sidegraph 0.10.0__tar.gz → 0.11.1__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.
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/ci.yml +22 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.pre-commit-config.yaml +10 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/AGENTS.md +3 -2
- {sidegraph-0.10.0 → sidegraph-0.11.1}/CHANGELOG.md +258 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/CLAUDE.md +4 -3
- {sidegraph-0.10.0 → sidegraph-0.11.1}/CONTRIBUTING.md +25 -2
- {sidegraph-0.10.0 → sidegraph-0.11.1}/PKG-INFO +8 -7
- {sidegraph-0.10.0 → sidegraph-0.11.1}/README.md +7 -6
- sidegraph-0.11.1/SECURITY.md +197 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/bootstrap.md +55 -11
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/capturing-decisions.md +39 -3
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/ci-cd-maintenance.md +4 -2
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/semantic-docs.md +9 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/troubleshooting.md +4 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/README.md +12 -4
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/cli.md +125 -31
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/git-bindings.md +12 -2
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/hooks.md +7 -2
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/mcp-tools.md +107 -20
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/releasing.md +8 -3
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/stability.md +1 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/store-format.md +38 -8
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/whitepaper/index.md +69 -51
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/pyproject.toml +4 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/apply.py +52 -10
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/catalog.py +17 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/cli.py +278 -42
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/model.py +14 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/planner.py +2 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/scan.py +72 -8
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/capture.py +307 -90
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/cli.py +115 -61
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/doc_import.py +18 -4
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/doctor.py +75 -7
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/hooks.py +42 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/subagent.py +6 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/hot_index.py +8 -0
- sidegraph-0.11.1/src/sidegraph/input_limits.py +215 -0
- sidegraph-0.11.1/src/sidegraph/redaction_scan.py +326 -0
- sidegraph-0.11.1/src/sidegraph/redaction_tokens.py +117 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/server.py +225 -74
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/stats/model.py +2 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/store.py +91 -36
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/store_layout.py +124 -0
- sidegraph-0.11.1/src/sidegraph/validation_errors.py +164 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/verify.py +411 -122
- sidegraph-0.11.1/src/sidegraph/write_boundary.py +138 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/conftest.py +42 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/githooks_support.py +7 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_apply.py +44 -4
- sidegraph-0.11.1/tests/test_bootstrap_scan_regular.py +565 -0
- sidegraph-0.11.1/tests/test_bootstrap_unanchored.py +618 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_propose.py +164 -6
- sidegraph-0.11.1/tests/test_capture_redact.py +469 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_import.py +40 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_stats.py +47 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_unreadable_paths.py +2 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_digest_integrity.py +14 -5
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doc_import.py +69 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor.py +4 -4
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_auto_share.py +137 -0
- sidegraph-0.11.1/tests/test_doctor_unhashable_payload.py +165 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_domains.py +1 -1
- sidegraph-0.11.1/tests/test_entry_point_arguments.py +256 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_flow_profile.py +13 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_bindings_hook.py +117 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_githooks.py +55 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_integrity.py +30 -6
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hot_index.py +8 -1
- sidegraph-0.11.1/tests/test_index_journal_mode.py +268 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_openspec_profile.py +4 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_pilot_kit_corpus_fit.py +50 -12
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_public_hook_launch.py +8 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_ratify_policy.py +92 -29
- sidegraph-0.11.1/tests/test_redaction_scan.py +225 -0
- sidegraph-0.11.1/tests/test_redaction_tokens.py +223 -0
- sidegraph-0.11.1/tests/test_secret_scan_gate.py +223 -0
- sidegraph-0.11.1/tests/test_security_binary_limits.py +53 -0
- sidegraph-0.11.1/tests/test_security_capture_diagnostics.py +225 -0
- sidegraph-0.11.1/tests/test_security_capture_limits.py +132 -0
- sidegraph-0.11.1/tests/test_security_cli_diagnostics.py +69 -0
- sidegraph-0.11.1/tests/test_security_doc_limits.py +134 -0
- sidegraph-0.11.1/tests/test_security_input_limits.py +291 -0
- sidegraph-0.11.1/tests/test_security_mcp_write_diagnostics.py +240 -0
- sidegraph-0.11.1/tests/test_security_numeric_enums.py +154 -0
- sidegraph-0.11.1/tests/test_security_python_shapes.py +234 -0
- sidegraph-0.11.1/tests/test_security_redaction_cursor.py +37 -0
- sidegraph-0.11.1/tests/test_security_redaction_scaling.py +79 -0
- sidegraph-0.11.1/tests/test_security_validation_errors.py +106 -0
- sidegraph-0.11.1/tests/test_security_write_boundary.py +291 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_add_anchors.py +1 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_argument_names.py +1 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_capture.py +2 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_commit_hint.py +1 -3
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_decision_listing.py +4 -1
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_redaction.py +37 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_model.py +18 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_compact.py +256 -0
- sidegraph-0.11.1/tests/test_store_non_file_entries.py +514 -0
- sidegraph-0.11.1/tests/test_verify_git_framing.py +349 -0
- sidegraph-0.11.1/tests/test_verify_git_revisions.py +327 -0
- sidegraph-0.11.1/tests/test_verify_snapshot.py +1692 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_verify_transitions.py +456 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/uv.lock +1 -1
- sidegraph-0.10.0/SECURITY.md +0 -59
- sidegraph-0.10.0/tests/test_capture_redact.py +0 -184
- sidegraph-0.10.0/tests/test_verify_snapshot.py +0 -771
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/CODEOWNERS +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.gitignore +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.gitleaks.toml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/.python-version +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/LICENSE +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/README.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/data-model.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/retrieval.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/claude-code-setup.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/codex-setup.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/installation.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/quickstart.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/retrieval-in-sessions.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/team-workflow.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/integrations/claude-code.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/integrations/codex.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/integrations/graphify.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/llms.txt +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/configuration.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/operations.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bash_paths.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/config.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/integrity.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/retrieval.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/schema.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/sync.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/text_paths.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/__init__.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_anchoring.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_doctor.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_init.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_config.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_integrity.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_config_isolation.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_env.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_launch.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_pretool_records.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_stop.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_wiring_checks.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hot_index_hook.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_import_dry_run_preview.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_importer.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_okf.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_read.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_version.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_annotations.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_domains.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_facts.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_import.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_record_types.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_verify.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_health.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_render.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stop_rearm.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_compact_review.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_domains.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_entities.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_facts.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_meta.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_migration.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_record_types.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_threading.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_subagent_start_manifests.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_run.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_text_paths.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_model.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.10.0 → sidegraph-0.11.1}/tools/check_no_session_links.py +0 -0
|
@@ -28,6 +28,7 @@ jobs:
|
|
|
28
28
|
# leak them.
|
|
29
29
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
30
30
|
with:
|
|
31
|
+
fetch-depth: 0 # committed-history secret scan needs every reachable commit
|
|
31
32
|
persist-credentials: false
|
|
32
33
|
|
|
33
34
|
- name: Install uv
|
|
@@ -49,6 +50,27 @@ jobs:
|
|
|
49
50
|
- name: Run pre-commit checks
|
|
50
51
|
run: uv run pre-commit run --all-files
|
|
51
52
|
|
|
53
|
+
- name: Scan committed history for secrets
|
|
54
|
+
run: |
|
|
55
|
+
test "$(git rev-parse --is-shallow-repository)" = false
|
|
56
|
+
uv run pre-commit run gitleaks-history --hook-stage manual --all-files
|
|
57
|
+
|
|
58
|
+
- name: Exercise secret scanner integration
|
|
59
|
+
env:
|
|
60
|
+
SIDEGRAPH_SECRET_SCAN_INTEGRATION: "1"
|
|
61
|
+
run: |
|
|
62
|
+
uv run pytest tests/test_secret_scan_gate.py -q --junitxml="$RUNNER_TEMP/secret-scan.xml"
|
|
63
|
+
python3 - <<'PY'
|
|
64
|
+
import os
|
|
65
|
+
from pathlib import Path
|
|
66
|
+
from xml.etree import ElementTree
|
|
67
|
+
|
|
68
|
+
report = Path(os.environ["RUNNER_TEMP"]) / "secret-scan.xml"
|
|
69
|
+
suites = list(ElementTree.parse(report).getroot().iter("testsuite"))
|
|
70
|
+
assert sum(int(s.attrib["tests"]) for s in suites) > 0, "no scanner tests ran"
|
|
71
|
+
assert sum(int(s.attrib["skipped"]) for s in suites) == 0, "scanner tests skipped"
|
|
72
|
+
PY
|
|
73
|
+
|
|
52
74
|
test:
|
|
53
75
|
runs-on: ubuntu-latest
|
|
54
76
|
timeout-minutes: 30
|
|
@@ -71,6 +71,16 @@ repos:
|
|
|
71
71
|
rev: v8.30.1
|
|
72
72
|
hooks:
|
|
73
73
|
- id: gitleaks
|
|
74
|
+
# Filename exclusions protect immutable files from formatters, not this scanner:
|
|
75
|
+
# its upstream entry reads the staged Git index without filtered filenames.
|
|
76
|
+
always_run: true
|
|
77
|
+
stages: [pre-commit]
|
|
78
|
+
- id: gitleaks
|
|
79
|
+
alias: gitleaks-history
|
|
80
|
+
name: Detect hardcoded secrets in committed history
|
|
81
|
+
entry: gitleaks git --redact "--log-opts=--diff-merges=first-parent HEAD" --verbose
|
|
82
|
+
always_run: true
|
|
83
|
+
stages: [manual]
|
|
74
84
|
|
|
75
85
|
# Finds GitHub Actions supply-chain/security issues (unpinned actions, script injection via
|
|
76
86
|
# untrusted `${{ }}` template interpolation, excessive `permissions:`) in the workflows that
|
|
@@ -31,8 +31,9 @@ Tests/fixtures: `tests/`; plugin skills/configuration in `plugin/sidegraph/`.
|
|
|
31
31
|
Python 3.13+; `uv`:
|
|
32
32
|
|
|
33
33
|
- `uv sync --locked`: install dependencies.
|
|
34
|
-
- `uv run pytest tests/test_store.py -q`:
|
|
35
|
-
- `uv run pytest -
|
|
34
|
+
- `uv run pytest tests/test_store.py -q`: the touched test file while editing (`-x`, `--lf`).
|
|
35
|
+
- `uv run pytest -m "not slow"`: the broader pre-push check; skips the subprocess-heavy tests, but still takes minutes.
|
|
36
|
+
- `uv run pytest -q`: full suite; run it once before a commit or PR, not while editing. CI runs it again (3.13/3.14).
|
|
36
37
|
- `uv run pre-commit run --all-files`: shared lint/format/type/secret-scanning gate (also
|
|
37
38
|
runs `gitleaks`, `detect-private-key`, `zizmor`, `actionlint`, `check-toml`, and a
|
|
38
39
|
`uv.lock`-in-sync check).
|
|
@@ -7,6 +7,264 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.11.1] — 2026-10-10
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Bootstrap excludes special files and validates one bounded regular descriptor.** FIFO,
|
|
15
|
+
sockets and devices cannot become selected text sources, including through `--include`.
|
|
16
|
+
Available nonblocking/no-follow flags guard final-component replacement; the opened
|
|
17
|
+
descriptor is rechecked before strict incremental UTF-8 validation. Directory aliases
|
|
18
|
+
are rechecked against exclusions. Include retains its size override but observed growth
|
|
19
|
+
past opened size is excluded. Later planner/apply reads and ancestor races retain their
|
|
20
|
+
existing scope.
|
|
21
|
+
|
|
22
|
+
- **Git verification preserves unusual filenames through binary NUL framing.** Verify and
|
|
23
|
+
doctor detect immutable edits and archive deletions at paths containing Unicode, TAB,
|
|
24
|
+
LF, CR, quotes, backslashes or surrounding whitespace. Malformed or unsupported diff
|
|
25
|
+
output is an operational error (exit `1`), never a partial clean report. Shared Git
|
|
26
|
+
callers keep their decoded-text behavior; only diff reads raw pathname bytes.
|
|
27
|
+
|
|
28
|
+
- **Git verification resolves `--against` to one protected, frozen commit ID.** Verify and
|
|
29
|
+
doctor reject option-shaped, empty, NUL-containing, unavailable and non-commit baselines
|
|
30
|
+
operationally (exit `1`). Diff and every baseline record read use the same full SHA-1 or
|
|
31
|
+
SHA-256 ID, so a branch moving between those operations cannot hide an immutable edit.
|
|
32
|
+
There is no raw-ref fallback. Current working-tree reads retain
|
|
33
|
+
their existing concurrency limits.
|
|
34
|
+
|
|
35
|
+
- **Malformed write diagnostics omit raw input and arbitrary failure causes.** Capture
|
|
36
|
+
errors use bounded schema fields/codes; logical MCP writes apply raw admission before
|
|
37
|
+
signature coercion and intercept exceptions before framework warning/error logging.
|
|
38
|
+
Unknown write arguments keep valid parameter help without echoing their names.
|
|
39
|
+
Unsupported registrations fail closed. Partial-write warnings and recovery guidance
|
|
40
|
+
remain truthful; domain/ratify causes are controlled. Read diagnostics and upstream
|
|
41
|
+
FastMCP DEBUG argument tracing retain their existing scope.
|
|
42
|
+
|
|
43
|
+
- **Capture and direct writes reject oversized input before redaction or canonical writes.**
|
|
44
|
+
Limits are 256 KiB UTF-8 per string, 4 MiB admitted strings and 65,536 admitted nodes per
|
|
45
|
+
request, depth 32 and 4,096 nodes per draft, and 100 agent drafts including attached facts.
|
|
46
|
+
Combined decisions/facts share one budget; item violations reject the containing draft,
|
|
47
|
+
while request-wide violations fail before any write. Documents have an independent 8 MiB
|
|
48
|
+
per-file limit with whole-file skips, matching real/dry reports and no total-import cap.
|
|
49
|
+
Import tags and free-text options are bounded separately; input is never silently truncated.
|
|
50
|
+
Raw Python batches use lists/tuples; supported scalar, mapping and model fields are
|
|
51
|
+
inspected. Other opaque Python values (including sets, deques, generators and non-string
|
|
52
|
+
Enum objects) are rejected before Pydantic coercion, without consuming iterators. Numeric
|
|
53
|
+
enums can become strings rather than behave as numbers in Pydantic string fields; only
|
|
54
|
+
string-derived enums keep their measured base-string behavior.
|
|
55
|
+
- **Redaction avoids repeated suffix searches in four known attack families.** Linear
|
|
56
|
+
assignment-key, URL-credential, JWT and private-key-block recognizers preserve matching
|
|
57
|
+
order/counts and the existing conservative quoted-value behavior. This does not claim
|
|
58
|
+
universal regex linearity or complete secret detection. See [security policy](SECURITY.md).
|
|
59
|
+
|
|
60
|
+
- **Secret-bearing tags are redacted before document import stores their slugs.** Capture,
|
|
61
|
+
direct MCP writes and document import share tag normalization. Import reports tag
|
|
62
|
+
substitutions once per batch in real and dry runs, including duplicate raw tags.
|
|
63
|
+
Comma-separated MCP strings are cleaned before splitting; a secret-bearing string with
|
|
64
|
+
commas drops all its tags conservatively. List input keeps explicit boundaries.
|
|
65
|
+
|
|
66
|
+
- **Quoted assignment redaction consumes multiline, triple-quoted and unterminated values.**
|
|
67
|
+
Escaped closers and glued tails stay covered. An unterminated value removes the
|
|
68
|
+
remaining input conservatively if no legal closer is found. An assignment span,
|
|
69
|
+
including URL/card expansion, that would swallow another assignment's key also consumes
|
|
70
|
+
the remaining input and following prose. A multiline quoted span splitting a URL
|
|
71
|
+
credential or checksum-valid grouped card number does so too. Bare values and
|
|
72
|
+
single-line glued tails extend through crossing URL/card matches while otherwise
|
|
73
|
+
preserving later prose. Prior tag entities and Git history remain: review old tags and
|
|
74
|
+
rotate exposed credentials. Unicode letters/digits after a single quote keep it inside
|
|
75
|
+
the value as an apostrophe; an unclosed value removes the remainder.
|
|
76
|
+
|
|
77
|
+
- **Secret scanning covers store-only commits and committed CI history.** The pinned
|
|
78
|
+
Gitleaks hook runs even when changed files are excluded from formatting. A separate manual
|
|
79
|
+
`gitleaks-history` hook scans committed HEAD history, also run by CI with a full checkout.
|
|
80
|
+
Scanner integration tests exercise staged, committed, and removed synthetic secrets.
|
|
81
|
+
|
|
82
|
+
- **Store verification checks the content of newly archived history.** A matching archive ID
|
|
83
|
+
alone no longer permits deletion of a committed hot decision or domain: every archive copy
|
|
84
|
+
must be compactable and a legal transition from the baseline, preserving raw immutable keys.
|
|
85
|
+
The snapshot check also reports nonterminal archive records. Legal supersede/drop followed
|
|
86
|
+
by compaction, older absent `null`/empty defaults, identical merge copies, and crash cleanup
|
|
87
|
+
still pass.
|
|
88
|
+
|
|
89
|
+
### Changed
|
|
90
|
+
|
|
91
|
+
- **Security documentation states the limits explicitly.** The privacy overview describes
|
|
92
|
+
best-effort redaction and writes outside the store. CLI documentation distinguishes
|
|
93
|
+
argument syntax errors from rejected Git baselines and recommends JSON output when
|
|
94
|
+
a terminal cannot encode a reported pathname.
|
|
95
|
+
|
|
96
|
+
## [0.11.0] — 2026-10-09
|
|
97
|
+
|
|
98
|
+
### Changed
|
|
99
|
+
|
|
100
|
+
- **`index.db` no longer creates and deletes its journal in every write transaction.** SQLite's
|
|
101
|
+
default rollback mode (`DELETE`) created `index.db-journal` at the start of each write and
|
|
102
|
+
removed it at the end, and the hooks write on every tool call, so one store produced
|
|
103
|
+
hundreds of thousands of file-system events an hour. Every connection that writes now runs
|
|
104
|
+
`journal_mode=TRUNCATE`: the same rollback journal, locking and crash safety, but the journal
|
|
105
|
+
is emptied rather than deleted, so a 0-byte `index.db-journal` stays beside `index.db`
|
|
106
|
+
(gitignored by `index.db*`, as before). Each transaction still writes, truncates and syncs
|
|
107
|
+
that file, so the events do not vanish: they fall most for back-to-back writes (tests, bulk
|
|
108
|
+
imports: about nine times fewer on the journal) and by about a third for hook traffic.
|
|
109
|
+
Read-only connections still write nothing, and there is normally no `-wal`/`-shm`; an index
|
|
110
|
+
that another connection has pinned in WAL stays in WAL, which Sidegraph tolerates. A crash
|
|
111
|
+
mid-transaction still leaves a non-empty journal that the next writer rolls back.
|
|
112
|
+
|
|
113
|
+
### Fixed
|
|
114
|
+
|
|
115
|
+
- **The `UNANCHORED` line of `sidegraph-bootstrap` now names the graph in use.** It always said
|
|
116
|
+
to run `graphify update .`, which rebuilds only the default graph, so with `--graph` or
|
|
117
|
+
`$SIDEGRAPH_GRAPH` elsewhere the advice could not make the next run write the document. It now
|
|
118
|
+
uses the same step as the `ANCHORS` line: `rebuild the graph at <path> and rerun` for a custom
|
|
119
|
+
graph, `run `graphify update .` and rerun` for the default one.
|
|
120
|
+
- **A fresh `sidegraph-bootstrap` run now lists the store's creation marker as changed.** The
|
|
121
|
+
`CHANGED` lines and `--report` named `format` and `.gitignore` but not the committed
|
|
122
|
+
`stamping_live_since` file the same run created.
|
|
123
|
+
- **`sidegraph-bootstrap` now says what is wrong when a ratified or revived record is out of the
|
|
124
|
+
graph's reach.** For an accepted candidate with no anchor in the current graph whose content
|
|
125
|
+
is already stored (ratified in place, or revived from a rejected record), every rerun used to
|
|
126
|
+
print `ANCHORS incomplete: accepted candidate has unresolved or ambiguous anchors`,
|
|
127
|
+
`PROOF incomplete: selected decision did not surface` and a `RESUME` line that could never
|
|
128
|
+
succeed, and exit 2. The anchors are now judged by whether the
|
|
129
|
+
record still surfaces through production retrieval, the same test as `PROOF`: when it does
|
|
130
|
+
not, the run still exits 2 but prints ``ANCHORS incomplete: stored record <id> for
|
|
131
|
+
<source> has no anchor in the current graph; run `graphify update .` and rerun``, a matching
|
|
132
|
+
`PROOF` reason and a `NEXT` line with that command instead of `RESUME`; once the graph has the
|
|
133
|
+
node, the rerun exits 0. The exact `RESUME` stays when something a resume can fix (a failed
|
|
134
|
+
write, missing host wiring) is also wrong, and with `--graph` the line names the graph to
|
|
135
|
+
rebuild instead. The `--report` file carries the same remedy. A written record with an
|
|
136
|
+
unresolved backticked mention keeps its old message.
|
|
137
|
+
- **A directory named like a record no longer makes the whole store unopenable.** A directory
|
|
138
|
+
(or a dangling or looping symlink) called `.x.json`, or `01ABC.json`, in `decisions/`,
|
|
139
|
+
`facts/`, `domains/`, `entities/` or `initiatives/` (or in `bindings/` under a safe name, or
|
|
140
|
+
`archive/` as `*.jsonl`) crashed every open of the store, so every hook and MCP call failed
|
|
141
|
+
(`IsADirectoryError` for a directory, `Too many levels of symbolic links` for a looping
|
|
142
|
+
link), and a FIFO there blocked the open for ever. The reload now skips any entry that is not
|
|
143
|
+
a regular file before reading it, lists it in the skipped files with the reason `not a
|
|
144
|
+
regular file`, and the startup warning names it; the other records load and the next open
|
|
145
|
+
takes the fast path. `sidegraph-verify` reports such an entry once, as `unsafe-record-id`
|
|
146
|
+
for an unsafe record name and as `parse-error` (`bad-archive-segment` in `archive/`,
|
|
147
|
+
whatever the segment's name) otherwise, and no longer blocks on a FIFO, including
|
|
148
|
+
`--against` when a tracked file was replaced by one. A stale directory or looping symlink
|
|
149
|
+
named `*.tmp` no longer fails the open either. `sidegraph-stats` no longer ends in a
|
|
150
|
+
traceback on a looping link, and no longer reports the index as behind for ever because of a
|
|
151
|
+
dangling symlink. The skip reason for a file with an unsafe name now says `unsafe filename`
|
|
152
|
+
instead of "id 'A' does not match the filename".
|
|
153
|
+
- **`sidegraph-prepare-commit-msg` no longer leaves its candidate block in `git commit -m`
|
|
154
|
+
messages under the `pre-commit` framework.** The framework passes the hook only the message
|
|
155
|
+
file and hands git's source in `PRE_COMMIT_COMMIT_MSG_SOURCE`, so the hook always saw "source
|
|
156
|
+
absent" and wrote its `# Sidegraph: uncomment the trailers…` and `# Sidegraph-Decision: …`
|
|
157
|
+
lines, which `-m` commits keep. With exactly one argument the hook now reads the source from
|
|
158
|
+
that variable (unset or empty means a plain commit); with two or three arguments, as raw git
|
|
159
|
+
passes them, the arguments still win.
|
|
160
|
+
- **The hook entry points answer `--help` instead of running.** `sidegraph-session-start --help`
|
|
161
|
+
ran the SessionStart hook in the current directory and wrote into its `index.db`, and the other
|
|
162
|
+
three hook scripts (`sidegraph-stop`, `sidegraph-pre-tool-use`, `sidegraph-subagent-start`)
|
|
163
|
+
ignored their arguments the same way, while `sidegraph-prepare-commit-msg --help` printed
|
|
164
|
+
nothing and `sidegraph-mcp --help` started the server. Each now prints a short usage text for
|
|
165
|
+
`-h` or `--help` and exits 0 before it reads stdin, opens the store or writes anything. Any
|
|
166
|
+
other argument to a hook script is a usage error on stderr with exit 2. The git hook
|
|
167
|
+
`sidegraph-prepare-commit-msg` stays fail-open: it prints the same error for an unknown option
|
|
168
|
+
or a fourth argument but exits 0 and leaves the message untouched, so `git commit` never fails
|
|
169
|
+
because of a stray `args:` entry; git's one to three positional arguments are unchanged. Hosts call the hook scripts without
|
|
170
|
+
arguments, so nothing a host runs changes.
|
|
171
|
+
- **`sidegraph-bootstrap` now converges when an accepted candidate has no anchor.** A document
|
|
172
|
+
with no backticked symbol and no node in the graph (typically one newer than the last graph
|
|
173
|
+
build) was never written, yet stayed pending: every run, `--resume` included, ended
|
|
174
|
+
`partial-recoverable` or `incomplete` with exit 2 and a `FAILED REF <none>` the operator
|
|
175
|
+
could not act on. Review now flags it with a `no-anchor` warning, and apply skips it by name
|
|
176
|
+
on an `UNANCHORED` line with its source path (`skipped_unanchorable_keys` in the report object)
|
|
177
|
+
and counts it as neither durable nor pending, so it no longer keeps the run partial. A run
|
|
178
|
+
where every approved candidate is skipped this way writes no record and ends as a diagnostic
|
|
179
|
+
that exits 0. It keeps the checks a run with records has, except the anchor and proof ones:
|
|
180
|
+
the store reopens and verifies clean, the host integration is verified, and `--report` is
|
|
181
|
+
written. A missing host integration or a store violation exits 2 instead (`STORE
|
|
182
|
+
incomplete`, with `RESUME`, or `sidegraph-verify` for a violation), as does an anchored
|
|
183
|
+
candidate kept proposed. Run `graphify update .` (or rebuild the `--graph` file) and the next
|
|
184
|
+
run writes it.
|
|
185
|
+
`sidegraph-import` is unchanged.
|
|
186
|
+
- **`sidegraph-verify` now reports a domain whose `parent_id` is not a domain, or whose parent
|
|
187
|
+
chain loops.** The store refuses to write either, but a hand-edited domain with
|
|
188
|
+
`parent_id: "not-a-domain"` passed `sidegraph-verify` and `sidegraph-doctor` with exit 0. A
|
|
189
|
+
`parent_id` that names no domain, hot or archived, is now a `dangling-parent`, and a parent
|
|
190
|
+
chain that comes back to itself (a domain that is its own parent included) is one
|
|
191
|
+
`parent-cycle` per cycle, at the domain with the smallest id on it. A superseded, dropped or
|
|
192
|
+
compacted parent still counts as existing, so a history written through the tools stays
|
|
193
|
+
clean, and a parent held by a file skipped for its name is not reported twice. A non-string
|
|
194
|
+
`parent_id` stays a `parse-error` (a `bad-archive-segment` in an archive segment).
|
|
195
|
+
- **A record directory the process cannot list or search is reported as unreadable, not as
|
|
196
|
+
missing records.** With `decisions/` at mode 000, `sidegraph-verify` printed a
|
|
197
|
+
`dangling-fact-support` for every fact and `--against` an `illegal-deletion` for every
|
|
198
|
+
record, as if the store had been tampered with. `sidegraph-verify` and `sidegraph-doctor` now
|
|
199
|
+
stop with one `store not readable` line naming the directory and exit 1, before any
|
|
200
|
+
cross-reference or deletion check runs. `sidegraph-stats` likewise says `cannot read the
|
|
201
|
+
store index` instead of `no store index` when the store directory cannot be searched, and no
|
|
202
|
+
longer ends in a traceback when a record directory cannot be listed. An empty record
|
|
203
|
+
directory without the search bit is reported the same way.
|
|
204
|
+
- **`sidegraph-verify` reports only `unsafe-record-id` for a record file the store skips for
|
|
205
|
+
its name or id.** A copy such as `decisions/.x.json` was also reported as
|
|
206
|
+
`filename-id-mismatch` and `duplicate-ulid`, and a file with a safe name but an unsafe id as
|
|
207
|
+
`filename-id-mismatch` too, though the store never indexes either. A file with an unsafe
|
|
208
|
+
name that was not valid JSON, not UTF-8 or not an object showed only `parse-error`, and the
|
|
209
|
+
same went for a `bindings/` file that was not a JSON list, so the real problem, the name,
|
|
210
|
+
went unreported. The name is now checked before the content, in every record directory. A
|
|
211
|
+
file skipped for its name no longer counts as a second copy of a record, but a record that
|
|
212
|
+
points at its id is not reported either: renaming the file back is the only fix.
|
|
213
|
+
- **`sidegraph-compact` no longer warns "DIFFERENT content" for a hot file that only lacks
|
|
214
|
+
newer keys.** A decision or domain written before `ratified_at`, `ratified_by` or
|
|
215
|
+
`provenance.commit` existed has no such keys, while its archive line, dumped from the model,
|
|
216
|
+
carries them as `null`. The raw comparison read that as a difference, kept the hot file and
|
|
217
|
+
repeated the warning on every index rebuild and every later compact. The visible damage was
|
|
218
|
+
that `sidegraph-verify` then exited 2 with a `duplicate-ulid` for each kept hot file, so the
|
|
219
|
+
store-lint gate failed after a compact. A key the hot file lacks now matches an explicit
|
|
220
|
+
`null` or an empty list or object in the archive, recursively, as `sidegraph-verify
|
|
221
|
+
--against` already treats it. The match is one-directional: a key only the hot file holds, at
|
|
222
|
+
any depth and whatever its value, still warns and keeps the file, so a field written by a
|
|
223
|
+
newer version is never lost to a compact by an older one.
|
|
224
|
+
- **`sidegraph-doctor` keeps its `auto share` and `auto supersede rate` lines on a hand-edited
|
|
225
|
+
archived record.** An archived decision, a fact or a domain whose `status` was a list or a
|
|
226
|
+
dict made the auto-share tally raise, and doctor swallowed the error and dropped both lines
|
|
227
|
+
without a word. The bad value now counts as not retired and the lines print. Any other error
|
|
228
|
+
in the ratification lines is no longer swallowed.
|
|
229
|
+
- **`sidegraph-verify` no longer crashes on a non-string `supersedes`.** A hand-edited record
|
|
230
|
+
whose `supersedes` was a list or a dict ended the run with a `TypeError` and lost every
|
|
231
|
+
other violation. The bad value is now reported as the violation it is and the run goes on.
|
|
232
|
+
- **`sidegraph-verify` no longer crashes on an unhashable `supports` item, a status in
|
|
233
|
+
`--against`, or the malformed id of a deleted record.** Each used a raw hand-edited value as a
|
|
234
|
+
set member or lookup key; the run died with exit 1 where it should find the violation and exit
|
|
235
|
+
2. A malformed old status in `--against` is now reported as an illegal status jump.
|
|
236
|
+
- **A symlinked store directory now stops `sidegraph-verify` and `sidegraph-doctor` at the
|
|
237
|
+
link.** Verify reported the link but still read through it: `facts -> decisions` linted every
|
|
238
|
+
decision as a fact, a link out of the store linted foreign files, and a linked-out `entities`,
|
|
239
|
+
`decisions` or `archive` made references into it look dangling. Both commands now report the
|
|
240
|
+
`symlinked-store-entry` findings, skip every other check (doctor's advisory checks and
|
|
241
|
+
`--against` included) and print one line saying so in text output; the exit code stays 2. An
|
|
242
|
+
`--against` ref that does not resolve, or a store outside git, is still checked first and exits
|
|
243
|
+
1 without reporting the links. A
|
|
244
|
+
symlinked `format` marker is no longer read, so its target's text cannot reach a CI log. A bindings file with
|
|
245
|
+
an unsafe name no longer also reports its entities as dangling, since the store skips that
|
|
246
|
+
file whole.
|
|
247
|
+
- **`sidegraph-verify` and `sidegraph-doctor` report a store directory they cannot search as
|
|
248
|
+
`store not readable` on every Python.** With the store directory (or a parent) lacking the
|
|
249
|
+
search bit, for example `chmod 000` or `chmod 600 .sidegraph`, Python 3.14 reported
|
|
250
|
+
`unknown-schema-version … format marker missing` or `store directory not found` with exit 2
|
|
251
|
+
or 1, which read as a bad schema version or a missing store; Python 3.13 already printed
|
|
252
|
+
`store not readable (…)` with exit 1. Both commands now look the directory and its `format`
|
|
253
|
+
marker up with `os.stat`/`os.lstat`, which raise on every Python, and take the exit-1 path.
|
|
254
|
+
A directory that is searchable but not listable (`chmod 300`) is still checked normally.
|
|
255
|
+
The MCP `verify_store` tool now raises on 3.14 as it did on 3.13 instead of reporting
|
|
256
|
+
`unknown-schema-version`, and a store path that is a symlink loop reports the OS error
|
|
257
|
+
(`Too many levels of symbolic links`) instead of `store directory not found`, still with
|
|
258
|
+
exit 1.
|
|
259
|
+
- **`sidegraph-doctor` no longer crashes on a list or dict `status` or `entity_id`.** A
|
|
260
|
+
hand-edited decision whose `status` was a list or a dict, or an anchor-set entry whose
|
|
261
|
+
`entity_id` was one, made the dangling-record, unreferenced-entity, expired-open-validity,
|
|
262
|
+
never-surfaced and code-drift checks raise a `TypeError`. The run exited 1 and lost the whole
|
|
263
|
+
report, including the `parse-error` that `sidegraph-verify` found for the same file, and the
|
|
264
|
+
hooks that swallow the error silently switched the code-drift line off for every record. The
|
|
265
|
+
bad value is now skipped by those checks and reported once, by the model check, so the run
|
|
266
|
+
exits 2 with the rest of its findings.
|
|
267
|
+
|
|
10
268
|
## [0.10.0] — 2026-10-04
|
|
11
269
|
|
|
12
270
|
### Added
|
|
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
|
|
|
13
13
|
continuing participant in the project. A core feature must preserve, organize, or deliver
|
|
14
14
|
accumulated project understanding. Document search by itself is not the product.
|
|
15
15
|
|
|
16
|
-
Sidegraph is pre-1.0 (v0.
|
|
16
|
+
Sidegraph is pre-1.0 (v0.11.1) — the full loop (capture, ratification, mistakes-first
|
|
17
17
|
retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
|
|
18
18
|
facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
|
|
19
19
|
a stable release. See
|
|
@@ -98,8 +98,9 @@ See [`docs/concepts/data-model.md`](docs/concepts/data-model.md) for the record
|
|
|
98
98
|
```bash
|
|
99
99
|
uv sync # install deps into .venv
|
|
100
100
|
uv run pre-commit install # once per clone — the lint gate runs before each commit
|
|
101
|
-
uv run pytest
|
|
102
|
-
uv run pytest tests
|
|
101
|
+
uv run pytest tests/test_store.py -q # while editing: the touched file (-x, --lf)
|
|
102
|
+
uv run pytest -m "not slow" # broader pre-push check: skips subprocess-heavy tests, still minutes
|
|
103
|
+
uv run pytest # full suite: once before a commit or PR (CI runs it again)
|
|
103
104
|
uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
|
|
104
105
|
uv run sidegraph-mcp # run the decision MCP server (stdio)
|
|
105
106
|
```
|
|
@@ -20,10 +20,33 @@ consequence for you:
|
|
|
20
20
|
git clone https://github.com/SantyagoSeaman/sidegraph.git && cd sidegraph
|
|
21
21
|
uv sync # runtime + dev dependencies (Python 3.13+)
|
|
22
22
|
uv run pre-commit install # once per clone — the lint gate runs before each commit
|
|
23
|
-
uv run pytest -q
|
|
24
|
-
uv run
|
|
23
|
+
uv run pytest tests/test_store.py -q -x --lf # while editing: the touched file
|
|
24
|
+
uv run pytest -m "not slow" # broader pre-push check: skips subprocess-heavy tests, still takes minutes
|
|
25
|
+
uv run pytest -q # full suite: run before a commit or PR, must be green; CI runs it again
|
|
26
|
+
uv run pre-commit run --all-files # lint + format + types + staged secrets
|
|
25
27
|
```
|
|
26
28
|
|
|
29
|
+
|
|
30
|
+
The Gitleaks commit hook scans staged content even when all changed paths are excluded from
|
|
31
|
+
formatting, including `.sidegraph/`. `--all-files` does not turn it into a committed scan.
|
|
32
|
+
CI additionally scans all history reachable from HEAD with the same pinned scanner:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
uv run pre-commit run gitleaks-history --hook-stage manual --all-files
|
|
36
|
+
SIDEGRAPH_SECRET_SCAN_INTEGRATION=1 uv run pytest tests/test_secret_scan_gate.py -q
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The history scanner includes merge changes and traverses every commit reachable from HEAD.
|
|
40
|
+
Use a full checkout; CI rejects shallow history before scanning.
|
|
41
|
+
|
|
42
|
+
The second command runs real scanner integration tests; they are skipped in ordinary Python
|
|
43
|
+
test runs to avoid implicit scanner installation. The opt-in is read at collection time.
|
|
44
|
+
Findings are redacted. The history command needs a full Git checkout to cover earlier commits.
|
|
45
|
+
|
|
46
|
+
A passing test's `tmp_path` tree is removed; a failing test's is kept for inspection
|
|
47
|
+
(`tmp_path_retention_policy = "failed"` in `pyproject.toml`). Run with
|
|
48
|
+
`-o tmp_path_retention_policy=all` to keep every test's tree.
|
|
49
|
+
|
|
27
50
|
The suite is hermetic to `SIDEGRAPH_*` environment variables: `tests/conftest.py` strips every
|
|
28
51
|
one of them before each test runs, so a variable already set in your shell can never change what
|
|
29
52
|
the suite asserts. A test that needs one set must set it explicitly with `monkeypatch` rather
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.1
|
|
4
4
|
Summary: Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine.
|
|
5
5
|
Project-URL: Homepage, https://github.com/SantyagoSeaman/sidegraph
|
|
6
6
|
Project-URL: Repository, https://github.com/SantyagoSeaman/sidegraph
|
|
@@ -253,17 +253,18 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
253
253
|
|
|
254
254
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
255
255
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
256
|
-
plus a local, gitignored index it can always rebuild.
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
256
|
+
plus a local, gitignored index it can always rebuild. Commands can also write graph-refresh
|
|
257
|
+
hooks and their helper files, repository configuration, reports and visualization output;
|
|
258
|
+
the plugin launch hook can write a cache file under `${XDG_CACHE_HOME:-~/.cache}`.
|
|
259
|
+
[SECURITY.md](SECURITY.md) lists every write.
|
|
260
260
|
**Nothing leaves your machine** —
|
|
261
261
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
262
262
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
263
263
|
session touched afterwards) so you can see which memory was shown and which files
|
|
264
264
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
265
|
-
- **
|
|
266
|
-
|
|
265
|
+
- **Captured text is redacted before storage.** Redaction is best-effort pattern matching;
|
|
266
|
+
review drafts and scan the committed store for secrets. Proposed decisions and facts pass
|
|
267
|
+
this redaction step before they are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
267
268
|
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
268
269
|
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
269
270
|
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|
|
@@ -223,17 +223,18 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
223
223
|
|
|
224
224
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
225
225
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
226
|
-
plus a local, gitignored index it can always rebuild.
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
226
|
+
plus a local, gitignored index it can always rebuild. Commands can also write graph-refresh
|
|
227
|
+
hooks and their helper files, repository configuration, reports and visualization output;
|
|
228
|
+
the plugin launch hook can write a cache file under `${XDG_CACHE_HOME:-~/.cache}`.
|
|
229
|
+
[SECURITY.md](SECURITY.md) lists every write.
|
|
230
230
|
**Nothing leaves your machine** —
|
|
231
231
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
232
232
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
233
233
|
session touched afterwards) so you can see which memory was shown and which files
|
|
234
234
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
235
|
-
- **
|
|
236
|
-
|
|
235
|
+
- **Captured text is redacted before storage.** Redaction is best-effort pattern matching;
|
|
236
|
+
review drafts and scan the committed store for secrets. Proposed decisions and facts pass
|
|
237
|
+
this redaction step before they are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
237
238
|
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
238
239
|
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
239
240
|
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|