sidegraph 0.9.0__tar.gz → 0.11.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.
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.agents/plugins/marketplace.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.claude-plugin/marketplace.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/AGENTS.md +3 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/CHANGELOG.md +276 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/CLAUDE.md +4 -3
- {sidegraph-0.9.0 → sidegraph-0.11.0}/CONTRIBUTING.md +7 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/PKG-INFO +22 -9
- {sidegraph-0.9.0 → sidegraph-0.11.0}/README.md +21 -8
- {sidegraph-0.9.0 → sidegraph-0.11.0}/SECURITY.md +15 -4
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/mind-model.md +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/retrieval.md +50 -11
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/bootstrap.md +41 -10
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/claude-code-setup.md +17 -4
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/codex-setup.md +7 -4
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/installation.md +9 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/quickstart.md +20 -3
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/capturing-decisions.md +9 -7
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/ci-cd-maintenance.md +4 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/retrieval-in-sessions.md +67 -16
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/semantic-docs.md +2 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/team-workflow.md +11 -4
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/troubleshooting.md +7 -3
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/integrations/claude-code.md +36 -18
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/integrations/codex.md +41 -15
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/llms.txt +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/README.md +12 -4
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/cli.md +104 -56
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/configuration.md +2 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/git-bindings.md +12 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/hooks.md +59 -12
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/mcp-tools.md +210 -27
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/operations.md +12 -4
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/releasing.md +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/stability.md +2 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/store-format.md +25 -8
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/whitepaper/index.md +69 -51
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/check-plan/SKILL.md +7 -3
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/explain-why/SKILL.md +8 -6
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +6 -5
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +10 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +6 -2
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/setup/SKILL.md +21 -6
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +3 -3
- {sidegraph-0.9.0 → sidegraph-0.11.0}/pyproject.toml +4 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/apply.py +61 -15
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/catalog.py +17 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/cli.py +278 -42
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/model.py +14 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/planner.py +2 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/cli.py +123 -66
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/doc_import.py +230 -50
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/doctor.py +75 -7
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/hooks.py +42 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/subagent.py +6 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/hot_index.py +8 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/importer.py +52 -3
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/retrieval.py +19 -6
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/server.py +692 -59
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/stats/model.py +2 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/store.py +122 -36
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/store_layout.py +124 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/verify.py +275 -92
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/conftest.py +42 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/githooks_support.py +7 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_apply.py +88 -4
- sidegraph-0.11.0/tests/test_bootstrap_unanchored.py +618 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_stats.py +47 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_unreadable_paths.py +2 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_digest_integrity.py +14 -5
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doc_import.py +69 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_docs_claims.py +35 -9
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor.py +4 -4
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_auto_share.py +137 -0
- sidegraph-0.11.0/tests/test_doctor_unhashable_payload.py +165 -0
- sidegraph-0.11.0/tests/test_entry_point_arguments.py +256 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_flow_profile.py +21 -1
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_bindings_hook.py +117 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_githooks.py +55 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_integrity.py +30 -6
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hot_index.py +8 -1
- sidegraph-0.11.0/tests/test_import_dry_run_preview.py +619 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_importer.py +1 -0
- sidegraph-0.11.0/tests/test_index_journal_mode.py +268 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_openspec_profile.py +4 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_pilot_kit_corpus_fit.py +50 -12
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_public_hook_launch.py +8 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_ratify_policy.py +59 -14
- sidegraph-0.11.0/tests/test_server_annotations.py +86 -0
- sidegraph-0.11.0/tests/test_server_argument_names.py +275 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_borrowed_graph.py +98 -0
- sidegraph-0.11.0/tests/test_server_decision_listing.py +776 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_mcp_smoke.py +10 -2
- sidegraph-0.11.0/tests/test_server_record_types.py +177 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_model.py +18 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_compact.py +256 -0
- sidegraph-0.11.0/tests/test_store_non_file_entries.py +514 -0
- sidegraph-0.11.0/tests/test_store_record_types.py +77 -0
- sidegraph-0.11.0/tests/test_verify_snapshot.py +1668 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_verify_transitions.py +120 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/uv.lock +1 -1
- sidegraph-0.9.0/tests/test_verify_snapshot.py +0 -771
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.gitignore +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.gitleaks.toml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/.python-version +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/LICENSE +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/README.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/data-model.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/integrations/graphify.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bash_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/capture.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/config.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/schema.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/sync.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/text_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_doctor.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_config.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_config_isolation.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_launch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_pretool_records.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_stop.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_wiring_checks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hot_index_hook.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_okf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_render.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stop_rearm.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_compact_review.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_subagent_start_manifests.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_text_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.11.0}/tools/check_no_session_links.py +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"source": "local",
|
|
9
9
|
"path": "./plugin/sidegraph"
|
|
10
10
|
},
|
|
11
|
-
"description": "Durable decision/lessons memory over your code graph — captured in-session,
|
|
11
|
+
"description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors."
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
{
|
|
7
7
|
"name": "sidegraph",
|
|
8
8
|
"source": "./plugin/sidegraph",
|
|
9
|
-
"description": "Durable decision/lessons memory over your code graph — captured in-session,
|
|
9
|
+
"description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors.",
|
|
10
10
|
"homepage": "https://github.com/SantyagoSeaman/sidegraph"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
@@ -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,282 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.11.0] — 2026-10-09
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **`index.db` no longer creates and deletes its journal in every write transaction.** SQLite's
|
|
15
|
+
default rollback mode (`DELETE`) created `index.db-journal` at the start of each write and
|
|
16
|
+
removed it at the end, and the hooks write on every tool call, so one store produced
|
|
17
|
+
hundreds of thousands of file-system events an hour. Every connection that writes now runs
|
|
18
|
+
`journal_mode=TRUNCATE`: the same rollback journal, locking and crash safety, but the journal
|
|
19
|
+
is emptied rather than deleted, so a 0-byte `index.db-journal` stays beside `index.db`
|
|
20
|
+
(gitignored by `index.db*`, as before). Each transaction still writes, truncates and syncs
|
|
21
|
+
that file, so the events do not vanish: they fall most for back-to-back writes (tests, bulk
|
|
22
|
+
imports: about nine times fewer on the journal) and by about a third for hook traffic.
|
|
23
|
+
Read-only connections still write nothing, and there is normally no `-wal`/`-shm`; an index
|
|
24
|
+
that another connection has pinned in WAL stays in WAL, which Sidegraph tolerates. A crash
|
|
25
|
+
mid-transaction still leaves a non-empty journal that the next writer rolls back.
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- **The `UNANCHORED` line of `sidegraph-bootstrap` now names the graph in use.** It always said
|
|
30
|
+
to run `graphify update .`, which rebuilds only the default graph, so with `--graph` or
|
|
31
|
+
`$SIDEGRAPH_GRAPH` elsewhere the advice could not make the next run write the document. It now
|
|
32
|
+
uses the same step as the `ANCHORS` line: `rebuild the graph at <path> and rerun` for a custom
|
|
33
|
+
graph, `run `graphify update .` and rerun` for the default one.
|
|
34
|
+
- **A fresh `sidegraph-bootstrap` run now lists the store's creation marker as changed.** The
|
|
35
|
+
`CHANGED` lines and `--report` named `format` and `.gitignore` but not the committed
|
|
36
|
+
`stamping_live_since` file the same run created.
|
|
37
|
+
- **`sidegraph-bootstrap` now says what is wrong when a ratified or revived record is out of the
|
|
38
|
+
graph's reach.** For an accepted candidate with no anchor in the current graph whose content
|
|
39
|
+
is already stored (ratified in place, or revived from a rejected record), every rerun used to
|
|
40
|
+
print `ANCHORS incomplete: accepted candidate has unresolved or ambiguous anchors`,
|
|
41
|
+
`PROOF incomplete: selected decision did not surface` and a `RESUME` line that could never
|
|
42
|
+
succeed, and exit 2. The anchors are now judged by whether the
|
|
43
|
+
record still surfaces through production retrieval, the same test as `PROOF`: when it does
|
|
44
|
+
not, the run still exits 2 but prints ``ANCHORS incomplete: stored record <id> for
|
|
45
|
+
<source> has no anchor in the current graph; run `graphify update .` and rerun``, a matching
|
|
46
|
+
`PROOF` reason and a `NEXT` line with that command instead of `RESUME`; once the graph has the
|
|
47
|
+
node, the rerun exits 0. The exact `RESUME` stays when something a resume can fix (a failed
|
|
48
|
+
write, missing host wiring) is also wrong, and with `--graph` the line names the graph to
|
|
49
|
+
rebuild instead. The `--report` file carries the same remedy. A written record with an
|
|
50
|
+
unresolved backticked mention keeps its old message.
|
|
51
|
+
- **A directory named like a record no longer makes the whole store unopenable.** A directory
|
|
52
|
+
(or a dangling or looping symlink) called `.x.json`, or `01ABC.json`, in `decisions/`,
|
|
53
|
+
`facts/`, `domains/`, `entities/` or `initiatives/` (or in `bindings/` under a safe name, or
|
|
54
|
+
`archive/` as `*.jsonl`) crashed every open of the store, so every hook and MCP call failed
|
|
55
|
+
(`IsADirectoryError` for a directory, `Too many levels of symbolic links` for a looping
|
|
56
|
+
link), and a FIFO there blocked the open for ever. The reload now skips any entry that is not
|
|
57
|
+
a regular file before reading it, lists it in the skipped files with the reason `not a
|
|
58
|
+
regular file`, and the startup warning names it; the other records load and the next open
|
|
59
|
+
takes the fast path. `sidegraph-verify` reports such an entry once, as `unsafe-record-id`
|
|
60
|
+
for an unsafe record name and as `parse-error` (`bad-archive-segment` in `archive/`,
|
|
61
|
+
whatever the segment's name) otherwise, and no longer blocks on a FIFO, including
|
|
62
|
+
`--against` when a tracked file was replaced by one. A stale directory or looping symlink
|
|
63
|
+
named `*.tmp` no longer fails the open either. `sidegraph-stats` no longer ends in a
|
|
64
|
+
traceback on a looping link, and no longer reports the index as behind for ever because of a
|
|
65
|
+
dangling symlink. The skip reason for a file with an unsafe name now says `unsafe filename`
|
|
66
|
+
instead of "id 'A' does not match the filename".
|
|
67
|
+
- **`sidegraph-prepare-commit-msg` no longer leaves its candidate block in `git commit -m`
|
|
68
|
+
messages under the `pre-commit` framework.** The framework passes the hook only the message
|
|
69
|
+
file and hands git's source in `PRE_COMMIT_COMMIT_MSG_SOURCE`, so the hook always saw "source
|
|
70
|
+
absent" and wrote its `# Sidegraph: uncomment the trailers…` and `# Sidegraph-Decision: …`
|
|
71
|
+
lines, which `-m` commits keep. With exactly one argument the hook now reads the source from
|
|
72
|
+
that variable (unset or empty means a plain commit); with two or three arguments, as raw git
|
|
73
|
+
passes them, the arguments still win.
|
|
74
|
+
- **The hook entry points answer `--help` instead of running.** `sidegraph-session-start --help`
|
|
75
|
+
ran the SessionStart hook in the current directory and wrote into its `index.db`, and the other
|
|
76
|
+
three hook scripts (`sidegraph-stop`, `sidegraph-pre-tool-use`, `sidegraph-subagent-start`)
|
|
77
|
+
ignored their arguments the same way, while `sidegraph-prepare-commit-msg --help` printed
|
|
78
|
+
nothing and `sidegraph-mcp --help` started the server. Each now prints a short usage text for
|
|
79
|
+
`-h` or `--help` and exits 0 before it reads stdin, opens the store or writes anything. Any
|
|
80
|
+
other argument to a hook script is a usage error on stderr with exit 2. The git hook
|
|
81
|
+
`sidegraph-prepare-commit-msg` stays fail-open: it prints the same error for an unknown option
|
|
82
|
+
or a fourth argument but exits 0 and leaves the message untouched, so `git commit` never fails
|
|
83
|
+
because of a stray `args:` entry; git's one to three positional arguments are unchanged. Hosts call the hook scripts without
|
|
84
|
+
arguments, so nothing a host runs changes.
|
|
85
|
+
- **`sidegraph-bootstrap` now converges when an accepted candidate has no anchor.** A document
|
|
86
|
+
with no backticked symbol and no node in the graph (typically one newer than the last graph
|
|
87
|
+
build) was never written, yet stayed pending: every run, `--resume` included, ended
|
|
88
|
+
`partial-recoverable` or `incomplete` with exit 2 and a `FAILED REF <none>` the operator
|
|
89
|
+
could not act on. Review now flags it with a `no-anchor` warning, and apply skips it by name
|
|
90
|
+
on an `UNANCHORED` line with its source path (`skipped_unanchorable_keys` in the report object)
|
|
91
|
+
and counts it as neither durable nor pending, so it no longer keeps the run partial. A run
|
|
92
|
+
where every approved candidate is skipped this way writes no record and ends as a diagnostic
|
|
93
|
+
that exits 0. It keeps the checks a run with records has, except the anchor and proof ones:
|
|
94
|
+
the store reopens and verifies clean, the host integration is verified, and `--report` is
|
|
95
|
+
written. A missing host integration or a store violation exits 2 instead (`STORE
|
|
96
|
+
incomplete`, with `RESUME`, or `sidegraph-verify` for a violation), as does an anchored
|
|
97
|
+
candidate kept proposed. Run `graphify update .` (or rebuild the `--graph` file) and the next
|
|
98
|
+
run writes it.
|
|
99
|
+
`sidegraph-import` is unchanged.
|
|
100
|
+
- **`sidegraph-verify` now reports a domain whose `parent_id` is not a domain, or whose parent
|
|
101
|
+
chain loops.** The store refuses to write either, but a hand-edited domain with
|
|
102
|
+
`parent_id: "not-a-domain"` passed `sidegraph-verify` and `sidegraph-doctor` with exit 0. A
|
|
103
|
+
`parent_id` that names no domain, hot or archived, is now a `dangling-parent`, and a parent
|
|
104
|
+
chain that comes back to itself (a domain that is its own parent included) is one
|
|
105
|
+
`parent-cycle` per cycle, at the domain with the smallest id on it. A superseded, dropped or
|
|
106
|
+
compacted parent still counts as existing, so a history written through the tools stays
|
|
107
|
+
clean, and a parent held by a file skipped for its name is not reported twice. A non-string
|
|
108
|
+
`parent_id` stays a `parse-error` (a `bad-archive-segment` in an archive segment).
|
|
109
|
+
- **A record directory the process cannot list or search is reported as unreadable, not as
|
|
110
|
+
missing records.** With `decisions/` at mode 000, `sidegraph-verify` printed a
|
|
111
|
+
`dangling-fact-support` for every fact and `--against` an `illegal-deletion` for every
|
|
112
|
+
record, as if the store had been tampered with. `sidegraph-verify` and `sidegraph-doctor` now
|
|
113
|
+
stop with one `store not readable` line naming the directory and exit 1, before any
|
|
114
|
+
cross-reference or deletion check runs. `sidegraph-stats` likewise says `cannot read the
|
|
115
|
+
store index` instead of `no store index` when the store directory cannot be searched, and no
|
|
116
|
+
longer ends in a traceback when a record directory cannot be listed. An empty record
|
|
117
|
+
directory without the search bit is reported the same way.
|
|
118
|
+
- **`sidegraph-verify` reports only `unsafe-record-id` for a record file the store skips for
|
|
119
|
+
its name or id.** A copy such as `decisions/.x.json` was also reported as
|
|
120
|
+
`filename-id-mismatch` and `duplicate-ulid`, and a file with a safe name but an unsafe id as
|
|
121
|
+
`filename-id-mismatch` too, though the store never indexes either. A file with an unsafe
|
|
122
|
+
name that was not valid JSON, not UTF-8 or not an object showed only `parse-error`, and the
|
|
123
|
+
same went for a `bindings/` file that was not a JSON list, so the real problem, the name,
|
|
124
|
+
went unreported. The name is now checked before the content, in every record directory. A
|
|
125
|
+
file skipped for its name no longer counts as a second copy of a record, but a record that
|
|
126
|
+
points at its id is not reported either: renaming the file back is the only fix.
|
|
127
|
+
- **`sidegraph-compact` no longer warns "DIFFERENT content" for a hot file that only lacks
|
|
128
|
+
newer keys.** A decision or domain written before `ratified_at`, `ratified_by` or
|
|
129
|
+
`provenance.commit` existed has no such keys, while its archive line, dumped from the model,
|
|
130
|
+
carries them as `null`. The raw comparison read that as a difference, kept the hot file and
|
|
131
|
+
repeated the warning on every index rebuild and every later compact. The visible damage was
|
|
132
|
+
that `sidegraph-verify` then exited 2 with a `duplicate-ulid` for each kept hot file, so the
|
|
133
|
+
store-lint gate failed after a compact. A key the hot file lacks now matches an explicit
|
|
134
|
+
`null` or an empty list or object in the archive, recursively, as `sidegraph-verify
|
|
135
|
+
--against` already treats it. The match is one-directional: a key only the hot file holds, at
|
|
136
|
+
any depth and whatever its value, still warns and keeps the file, so a field written by a
|
|
137
|
+
newer version is never lost to a compact by an older one.
|
|
138
|
+
- **`sidegraph-doctor` keeps its `auto share` and `auto supersede rate` lines on a hand-edited
|
|
139
|
+
archived record.** An archived decision, a fact or a domain whose `status` was a list or a
|
|
140
|
+
dict made the auto-share tally raise, and doctor swallowed the error and dropped both lines
|
|
141
|
+
without a word. The bad value now counts as not retired and the lines print. Any other error
|
|
142
|
+
in the ratification lines is no longer swallowed.
|
|
143
|
+
- **`sidegraph-verify` no longer crashes on a non-string `supersedes`.** A hand-edited record
|
|
144
|
+
whose `supersedes` was a list or a dict ended the run with a `TypeError` and lost every
|
|
145
|
+
other violation. The bad value is now reported as the violation it is and the run goes on.
|
|
146
|
+
- **`sidegraph-verify` no longer crashes on an unhashable `supports` item, a status in
|
|
147
|
+
`--against`, or the malformed id of a deleted record.** Each used a raw hand-edited value as a
|
|
148
|
+
set member or lookup key; the run died with exit 1 where it should find the violation and exit
|
|
149
|
+
2. A malformed old status in `--against` is now reported as an illegal status jump.
|
|
150
|
+
- **A symlinked store directory now stops `sidegraph-verify` and `sidegraph-doctor` at the
|
|
151
|
+
link.** Verify reported the link but still read through it: `facts -> decisions` linted every
|
|
152
|
+
decision as a fact, a link out of the store linted foreign files, and a linked-out `entities`,
|
|
153
|
+
`decisions` or `archive` made references into it look dangling. Both commands now report the
|
|
154
|
+
`symlinked-store-entry` findings, skip every other check (doctor's advisory checks and
|
|
155
|
+
`--against` included) and print one line saying so in text output; the exit code stays 2. An
|
|
156
|
+
`--against` ref that does not resolve, or a store outside git, is still checked first and exits
|
|
157
|
+
1 without reporting the links. A
|
|
158
|
+
symlinked `format` marker is no longer read, so its target's text cannot reach a CI log. A bindings file with
|
|
159
|
+
an unsafe name no longer also reports its entities as dangling, since the store skips that
|
|
160
|
+
file whole.
|
|
161
|
+
- **`sidegraph-verify` and `sidegraph-doctor` report a store directory they cannot search as
|
|
162
|
+
`store not readable` on every Python.** With the store directory (or a parent) lacking the
|
|
163
|
+
search bit, for example `chmod 000` or `chmod 600 .sidegraph`, Python 3.14 reported
|
|
164
|
+
`unknown-schema-version … format marker missing` or `store directory not found` with exit 2
|
|
165
|
+
or 1, which read as a bad schema version or a missing store; Python 3.13 already printed
|
|
166
|
+
`store not readable (…)` with exit 1. Both commands now look the directory and its `format`
|
|
167
|
+
marker up with `os.stat`/`os.lstat`, which raise on every Python, and take the exit-1 path.
|
|
168
|
+
A directory that is searchable but not listable (`chmod 300`) is still checked normally.
|
|
169
|
+
The MCP `verify_store` tool now raises on 3.14 as it did on 3.13 instead of reporting
|
|
170
|
+
`unknown-schema-version`, and a store path that is a symlink loop reports the OS error
|
|
171
|
+
(`Too many levels of symbolic links`) instead of `store directory not found`, still with
|
|
172
|
+
exit 1.
|
|
173
|
+
- **`sidegraph-doctor` no longer crashes on a list or dict `status` or `entity_id`.** A
|
|
174
|
+
hand-edited decision whose `status` was a list or a dict, or an anchor-set entry whose
|
|
175
|
+
`entity_id` was one, made the dangling-record, unreferenced-entity, expired-open-validity,
|
|
176
|
+
never-surfaced and code-drift checks raise a `TypeError`. The run exited 1 and lost the whole
|
|
177
|
+
report, including the `parse-error` that `sidegraph-verify` found for the same file, and the
|
|
178
|
+
hooks that swallow the error silently switched the code-drift line off for every record. The
|
|
179
|
+
bad value is now skipped by those checks and reported once, by the model check, so the run
|
|
180
|
+
exits 2 with the rest of its findings.
|
|
181
|
+
|
|
182
|
+
## [0.10.0] — 2026-10-04
|
|
183
|
+
|
|
184
|
+
### Added
|
|
185
|
+
|
|
186
|
+
- **Every MCP tool now carries annotations, so a host's auto-reviewer stops rejecting memory
|
|
187
|
+
reads.** In the field, Codex's auto-reviewer rejected 20 `get_task_context` calls, and each
|
|
188
|
+
one lost memory for that step: an unannotated tool takes the MCP defaults (destructive,
|
|
189
|
+
open-world), and the review's verdict then depends on the prompt. The seven tools that never
|
|
190
|
+
change a tracked file are read-only; the other 17 are non-destructive, closed-world local
|
|
191
|
+
writes. No tool sends anything off the machine and none deletes a record. A test runs the
|
|
192
|
+
read-only tools on a store where a lazy sync would adopt a moved symbol, and fails if one of
|
|
193
|
+
them changes a tracked file, so the annotation cannot drift from what the tool does. See the
|
|
194
|
+
[reference](docs/reference/mcp-tools.md#annotations) and the
|
|
195
|
+
[Codex page](docs/integrations/codex.md#the-auto-reviewer-and-memory-reads).
|
|
196
|
+
- **The seed tools accept the argument names agents try, and every tool names its parameters in
|
|
197
|
+
an error.** `get_task_context`, `query_structure` and `query_decisions` accept `paths` (as
|
|
198
|
+
`files`) and `seeds`; each seed goes to `files` when it looks like a path and to `entities`
|
|
199
|
+
otherwise. `task` is refused with a line saying there is no free-text query. Any other
|
|
200
|
+
unknown argument, on any tool, is an error that names it and lists the tool's real parameters;
|
|
201
|
+
FastMCP's own error named the argument but not the parameters.
|
|
202
|
+
|
|
203
|
+
### Changed
|
|
204
|
+
|
|
205
|
+
- **`retrieve_decisions` no longer returns the whole store.** One call returned a full dump of
|
|
206
|
+
every visible decision: about 143,000 tokens on a store of 260 records, more than a host would
|
|
207
|
+
show, and in a field report most agents passed `include_superseded: true` and then either
|
|
208
|
+
printed the dump or filtered it by hand. The call now has two answers.
|
|
209
|
+
- With no narrowing filter it returns an **overview**: the total, counts by status and kind
|
|
210
|
+
(superseded and rejected records included, so the counts say that history exists), and the
|
|
211
|
+
newest records as compact rows (`id`, `kind`, `status`, `title`, `valid_from`).
|
|
212
|
+
- With a narrowing filter it returns **full records**, gotchas and lessons first and newest
|
|
213
|
+
first, cut at `limit` (default 25, at most 100) or `budget_chars` (default 24,000, at most
|
|
214
|
+
60,000), whichever comes first. A `hint` says what cut the list, or why it is empty.
|
|
215
|
+
- The filters are new arguments, and they combine with AND: `status` and `kind` (a string or a
|
|
216
|
+
list), `files`, `query` (every word must occur in the record's text) and `ids` (exact record
|
|
217
|
+
ids, superseded ones too). `include_superseded` keeps its meaning: it widens the overview's
|
|
218
|
+
`newest` and a filtered call that has no `status`.
|
|
219
|
+
- `files` are read the way `get_task_context` reads them: a basename, a suffix, a directory or
|
|
220
|
+
a letter-case slip works. `unresolved_files` lists, for each path nothing could read (at most
|
|
221
|
+
ten, with `unresolved_omitted` counting the rest), why (`ambiguous`, `directory-too-large`,
|
|
222
|
+
`not-in-graph` or `no-graph`) and the candidates to pass instead.
|
|
223
|
+
- **The return type changed from a list to a JSON object, sent once as a single text block
|
|
224
|
+
with no structured copy**, so `budget_chars` is the real cost on every host. A client that
|
|
225
|
+
read the list now reads `decisions` of a filtered answer. The proposal policy is unchanged
|
|
226
|
+
and applies to every shape.
|
|
227
|
+
- The `check-plan`, `explain-why`, `triage-drift` and `heal-anchors` skills now call it with a
|
|
228
|
+
filter, and a test fails if a skill calls it without one. See the
|
|
229
|
+
[reference](docs/reference/mcp-tools.md#retrieve_decisions).
|
|
230
|
+
|
|
231
|
+
### Fixed
|
|
232
|
+
|
|
233
|
+
- **A fault converting a reviewed item in `sidegraph-bootstrap` now prints the RESUME line.** The
|
|
234
|
+
conversion of each reviewed item, and the check that its ref still matches the candidate,
|
|
235
|
+
ran outside the per-item error handling. A fault there, after an earlier item had been
|
|
236
|
+
written, left `apply_review` without a report: an `AssertionError` ended the run as a
|
|
237
|
+
traceback, a `ValueError` was reported as a failure before anything was written, and neither
|
|
238
|
+
printed `RESUME`, though canonical files were already on disk. The fault now takes the path a
|
|
239
|
+
write error takes: the run stops, reports `partial-recoverable` with the durable candidates and
|
|
240
|
+
the failing ref, and prints the resume command. A fault on the first item, before anything is
|
|
241
|
+
written, now exits 2 with `STORE incomplete`, the failing ref and the resume command, where a
|
|
242
|
+
`ValueError` used to exit 1 with an `ERROR` line; the terminal shows the failing ref and not the
|
|
243
|
+
reason.
|
|
244
|
+
- **`sidegraph-import --dry-run` now says what auto-ratification would do.** Both import paths
|
|
245
|
+
decided auto-ratification only after a real write, so under a non-`manual`
|
|
246
|
+
`SIDEGRAPH_RATIFY_POLICY` a dry run could not show which records a real run would land
|
|
247
|
+
accepted without a human: on one fixture it reported 0 where the real run auto-ratified 2. The
|
|
248
|
+
dry run now runs the same eligibility gate on the record the write would produce and reports
|
|
249
|
+
the result in a new `would_auto_ratify` field on `ImportReport` and `DocImportReport`, and as
|
|
250
|
+
`auto_ratify_eligible` on each dry-run item. `auto_ratified` keeps its meaning, transitions
|
|
251
|
+
that actually happened, so it stays 0 in a dry run.
|
|
252
|
+
- **Behaviour change:** under a non-`manual` policy the summary line gains `would
|
|
253
|
+
auto-ratify M` before `(skipped:` and an eligible item line ends with ` [auto]`. Under
|
|
254
|
+
`manual` both are unchanged. A dry run still never carries the real run's `auto-ratified K`.
|
|
255
|
+
- The count is eligibility, not a guarantee: a real run's transition can still fail, for
|
|
256
|
+
example on a race or a refused cascade.
|
|
257
|
+
- A key repeated within one run no longer counts twice in the dry run. Two rationales with the
|
|
258
|
+
same title in one file count once. A document ref met more than once (one file named twice, a
|
|
259
|
+
directory plus a file inside it, or a live and an archived copy that a profile maps to one
|
|
260
|
+
ref) is classified against the records the earlier copies would have left there, as the real
|
|
261
|
+
run sees them: an identical repeat is skipped, a differing one supersedes, and a copy after a
|
|
262
|
+
`rejected` first copy is a fresh write. Two rare shapes can still differ in the
|
|
263
|
+
`superseded`/`skipped` split, not in the eligibility count where checked: a ref met three
|
|
264
|
+
times with the first content returning, under an auto policy, and a repeat with no anchor of
|
|
265
|
+
its own.
|
|
266
|
+
- **`find_entity` no longer calls a dangling record a decision.** Each binding was labelled
|
|
267
|
+
`fact` if a fact lookup found it and `decision` otherwise, so a binding whose record exists in
|
|
268
|
+
neither table (a record file removed by hand, or lost in a merge) came back as a decision that
|
|
269
|
+
`get_decision` could not fetch, and each binding cost a query of its own. The types of all of an
|
|
270
|
+
entity's bindings now come from one read of the index, and a binding with no record reports
|
|
271
|
+
`record_type: "unknown"`. The value is additive: a client that handles `decision` and `fact`
|
|
272
|
+
is unaffected. `get_entity_history` uses the same read and still skips such a binding. See the
|
|
273
|
+
[reference](docs/reference/mcp-tools.md#find_entity).
|
|
274
|
+
- **A document status like `should not be rejected` no longer lands `rejected`.** The check for
|
|
275
|
+
a turned-down status saw a negation only as `not` and one space directly before the word, so
|
|
276
|
+
`should not be rejected`, `not rejected` (two spaces), `never rejected` and `isn't rejected`
|
|
277
|
+
all read as rejections, and a false `rejected` lands closed and invisible to retrieval. A
|
|
278
|
+
negation is now `not`, `never` or a word ending `n't` within the three words before the word in
|
|
279
|
+
the same clause. A clause ends at `,` `;` `.` `:`, a pipe, a slash, an em or en dash, or a spaced
|
|
280
|
+
hyphen or `->`, so `not reviewed, rejected`, `Not accepted — rejected` and `Won't do / rejected`
|
|
281
|
+
still read as rejections, as does `not rejected, rejected`. A conjunction does not end a
|
|
282
|
+
clause: `Not adopted and rejected` reads as negated, and lands accepted unless `--propose` or
|
|
283
|
+
a draft marker sends it to the ratification queue. See the
|
|
284
|
+
[reference](docs/reference/cli.md#sidegraph-import).
|
|
285
|
+
|
|
10
286
|
## [0.9.0] — 2026-10-04
|
|
11
287
|
|
|
12
288
|
### 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.0) — 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,16 @@ 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
|
|
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
|
|
24
26
|
uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
|
|
25
27
|
```
|
|
26
28
|
|
|
29
|
+
A passing test's `tmp_path` tree is removed; a failing test's is kept for inspection
|
|
30
|
+
(`tmp_path_retention_policy = "failed"` in `pyproject.toml`). Run with
|
|
31
|
+
`-o tmp_path_retention_policy=all` to keep every test's tree.
|
|
32
|
+
|
|
27
33
|
The suite is hermetic to `SIDEGRAPH_*` environment variables: `tests/conftest.py` strips every
|
|
28
34
|
one of them before each test runs, so a variable already set in your shell can never change what
|
|
29
35
|
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.0
|
|
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
|
|
@@ -82,7 +82,9 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
# 3. Install the CLIs + MCP server, then bootstrap the store in your repo
|
|
85
|
-
# (creates .sidegraph/, prints setup instructions)
|
|
85
|
+
# (creates .sidegraph/, prints setup instructions). In a terminal it also asks
|
|
86
|
+
# whether to install a git hook that rebuilds the code graph after each commit,
|
|
87
|
+
# merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
|
|
86
88
|
uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
|
|
87
89
|
sidegraph-init
|
|
88
90
|
|
|
@@ -172,6 +174,10 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
172
174
|
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
173
175
|
```
|
|
174
176
|
|
|
177
|
+
Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
|
|
178
|
+
subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
|
|
179
|
+
subagent that decision memory exists and how to ask it.
|
|
180
|
+
|
|
175
181
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
176
182
|
dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
|
|
177
183
|
graph is disposable — the engine regenerates it from source at any moment. The memory must
|
|
@@ -215,7 +221,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
|
|
|
215
221
|
| `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
|
|
216
222
|
| `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
|
|
217
223
|
| `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
|
|
218
|
-
| `retrieve_decisions` / `list_facts` |
|
|
224
|
+
| `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
|
|
219
225
|
| `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
|
|
220
226
|
| `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
|
|
221
227
|
| `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
|
|
@@ -247,16 +253,22 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
247
253
|
|
|
248
254
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
249
255
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
250
|
-
plus a local, gitignored index it can always rebuild.
|
|
256
|
+
plus a local, gitignored index it can always rebuild. Two things sit outside the store:
|
|
257
|
+
the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
|
|
258
|
+
three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
|
|
259
|
+
`${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
|
|
260
|
+
**Nothing leaves your machine** —
|
|
251
261
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
252
262
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
253
263
|
session touched afterwards) so you can see which memory was shown and which files
|
|
254
264
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
255
265
|
- **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
|
|
256
|
-
are stored. A ratification gate controls
|
|
257
|
-
`
|
|
258
|
-
|
|
259
|
-
|
|
266
|
+
are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
267
|
+
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
268
|
+
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
269
|
+
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|
|
270
|
+
at write time with a stamp that says so: lessons, gotchas, and standalone facts under
|
|
271
|
+
`auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
|
|
260
272
|
- **Nothing is silently rewritten.** The store is append-only; every change of mind is
|
|
261
273
|
recorded as a supersession with its reason.
|
|
262
274
|
|
|
@@ -269,7 +281,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
|
|
|
269
281
|
domains and retrieval still works, but symbol-level anchors, communities, and moved-code
|
|
270
282
|
resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
|
|
271
283
|
Everything the engine produces is derived and regenerated on every rebuild; everything
|
|
272
|
-
Sidegraph stores is deliberate
|
|
284
|
+
Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
|
|
285
|
+
person, or by the opt-in policy). **Own the memory, rent the graph.**
|
|
273
286
|
|
|
274
287
|
## Status
|
|
275
288
|
|
|
@@ -52,7 +52,9 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
# 3. Install the CLIs + MCP server, then bootstrap the store in your repo
|
|
55
|
-
# (creates .sidegraph/, prints setup instructions)
|
|
55
|
+
# (creates .sidegraph/, prints setup instructions). In a terminal it also asks
|
|
56
|
+
# whether to install a git hook that rebuilds the code graph after each commit,
|
|
57
|
+
# merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
|
|
56
58
|
uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
|
|
57
59
|
sidegraph-init
|
|
58
60
|
|
|
@@ -142,6 +144,10 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
142
144
|
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
143
145
|
```
|
|
144
146
|
|
|
147
|
+
Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
|
|
148
|
+
subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
|
|
149
|
+
subagent that decision memory exists and how to ask it.
|
|
150
|
+
|
|
145
151
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
146
152
|
dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
|
|
147
153
|
graph is disposable — the engine regenerates it from source at any moment. The memory must
|
|
@@ -185,7 +191,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
|
|
|
185
191
|
| `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
|
|
186
192
|
| `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
|
|
187
193
|
| `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
|
|
188
|
-
| `retrieve_decisions` / `list_facts` |
|
|
194
|
+
| `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
|
|
189
195
|
| `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
|
|
190
196
|
| `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
|
|
191
197
|
| `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
|
|
@@ -217,16 +223,22 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
217
223
|
|
|
218
224
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
219
225
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
220
|
-
plus a local, gitignored index it can always rebuild.
|
|
226
|
+
plus a local, gitignored index it can always rebuild. Two things sit outside the store:
|
|
227
|
+
the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
|
|
228
|
+
three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
|
|
229
|
+
`${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
|
|
230
|
+
**Nothing leaves your machine** —
|
|
221
231
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
222
232
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
223
233
|
session touched afterwards) so you can see which memory was shown and which files
|
|
224
234
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
225
235
|
- **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
|
|
226
|
-
are stored. A ratification gate controls
|
|
227
|
-
`
|
|
228
|
-
|
|
229
|
-
|
|
236
|
+
are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
237
|
+
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
238
|
+
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
239
|
+
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|
|
240
|
+
at write time with a stamp that says so: lessons, gotchas, and standalone facts under
|
|
241
|
+
`auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
|
|
230
242
|
- **Nothing is silently rewritten.** The store is append-only; every change of mind is
|
|
231
243
|
recorded as a supersession with its reason.
|
|
232
244
|
|
|
@@ -239,7 +251,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
|
|
|
239
251
|
domains and retrieval still works, but symbol-level anchors, communities, and moved-code
|
|
240
252
|
resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
|
|
241
253
|
Everything the engine produces is derived and regenerated on every rebuild; everything
|
|
242
|
-
Sidegraph stores is deliberate
|
|
254
|
+
Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
|
|
255
|
+
person, or by the opt-in policy). **Own the memory, rent the graph.**
|
|
243
256
|
|
|
244
257
|
## Status
|
|
245
258
|
|
|
@@ -25,10 +25,21 @@ Sidegraph is a local-only tool. Its entire data surface:
|
|
|
25
25
|
the visualization, OKF export and bootstrap-report commands write to the output paths you
|
|
26
26
|
give them; and the optional `sidegraph-prepare-commit-msg` git hook, once you install it,
|
|
27
27
|
adds commented decision trailers to the commit message file git hands it
|
|
28
|
-
(normally `.git/COMMIT_EDITMSG`).
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
(normally `.git/COMMIT_EDITMSG`). Three more writes sit outside the repository's own
|
|
29
|
+
files. `sidegraph-init --hooks` (or a yes to its refresh question) writes a helper script
|
|
30
|
+
and a marked block in three git hooks (`post-commit`, `post-merge`, `post-checkout`) under
|
|
31
|
+
`.git/hooks/`. When `core.hooksPath` is set, `sidegraph-init` writes only the helper (to
|
|
32
|
+
`.git/hooks/`) and prints the lines to add to your hooks by hand. While it runs, the helper
|
|
33
|
+
also keeps a lock, a flag file and a log in the git directory. `sidegraph-init --no-hooks`
|
|
34
|
+
writes the git config key `sidegraph.graphRefresh` to the repository's own config, and
|
|
35
|
+
`sidegraph-init --remove-hooks` takes the blocks, the helper and that key out again. The
|
|
36
|
+
SessionStart hook writes one 40-character commit id to
|
|
37
|
+
`${XDG_CACHE_HOME:-~/.cache}/sidegraph/launch-commit`, and only when the running package was
|
|
38
|
+
installed from the canonical `git+https://github.com/SantyagoSeaman/sidegraph.git@main`. That
|
|
39
|
+
covers the plugin and the manual `uvx --from …@main` recipe. A PyPI, tag, SHA or editable
|
|
40
|
+
install never writes it. Beyond those, the only filesystem writes are the standard config
|
|
41
|
+
snippets you install yourself (`.mcp.json`, hook entries). See
|
|
42
|
+
[`docs/reference/store-format.md`](docs/reference/store-format.md) for the full layout.
|
|
32
43
|
- **Network:** none. No remote telemetry, no phone-home, nothing leaves your machine. Local
|
|
33
44
|
retrieval telemetry is recorded in the gitignored `index.db` by default (which records
|
|
34
45
|
were shown and which files were touched, never uploaded); set `SIDEGRAPH_TELEMETRY=off` to
|
|
@@ -105,7 +105,7 @@ write below — the three raw authoring paths underneath it are:
|
|
|
105
105
|
asked to) names a domain directly, optionally nesting it under a `parent_slug`.
|
|
106
106
|
|
|
107
107
|
All three land `status=proposed`. **Every path passes through the same ratification gate** —
|
|
108
|
-
the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, kept
|
|
108
|
+
the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, still kept)
|
|
109
109
|
and the `sidegraph-ratify` CLI, which list and accept/drop decisions *and* domains side by
|
|
110
110
|
side. By default no path bypasses human review, including bootstrap: a fresh repo can
|
|
111
111
|
propose dozens of domains from its community structure in one command, but nothing is named
|