sidegraph 0.15.0__tar.gz → 0.16.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.15.0 → sidegraph-0.16.0}/.github/workflows/ci.yml +3 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/CHANGELOG.md +36 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/CLAUDE.md +1 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/PKG-INFO +2 -2
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/README.md +1 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/concepts/mind-model.md +5 -3
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/concepts/retrieval.md +6 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/getting-started/installation.md +9 -8
- sidegraph-0.16.0/docs/guides/health-check.md +66 -0
- sidegraph-0.16.0/docs/guides/using-0.16.md +45 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/cli.md +39 -17
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/hooks.md +14 -7
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/mcp-tools.md +45 -26
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/store-format.md +15 -11
- {sidegraph-0.15.0 → sidegraph-0.16.0}/package.json +1 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/.muse-plugin/plugin.json +5 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +4 -2
- sidegraph-0.16.0/plugin/sidegraph/skills/health-check/SKILL.md +83 -0
- sidegraph-0.16.0/plugin/sidegraph/skills/health-check/scripts/collect.py +1100 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +13 -8
- sidegraph-0.16.0/plugin/sidegraph/skills/stats/agents/openai.yaml +6 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/pyproject.toml +4 -4
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/cli.py +20 -5
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/doctor.py +19 -4
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/gitio.py +2 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/hooks.py +21 -16
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/subagent.py +1 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/hot_index.py +2 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/retrieval.py +21 -10
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/server.py +144 -19
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/stats/model.py +6 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/stats/render.py +2 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/store.py +218 -91
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/store_layout.py +35 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/sync.py +16 -2
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/githooks_support.py +4 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bounded_listings.py +435 -0
- sidegraph-0.16.0/tests/test_cli_compact.py +299 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_codex_plugin.py +9 -2
- sidegraph-0.16.0/tests/test_health_check_skill.py +1195 -0
- sidegraph-0.16.0/tests/test_hook_contention.py +972 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_pretool_records.py +110 -22
- sidegraph-0.16.0/tests/test_retrieval_seeds.py +436 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_decision_listing.py +22 -6
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_mcp_smoke.py +10 -3
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_skill_frontmatter.py +1 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stats_model.py +138 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stats_render.py +41 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stop_rearm.py +15 -2
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_canonical_stat.py +34 -1
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_compact.py +84 -4
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_compact_review.py +16 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/uv.lock +5 -5
- sidegraph-0.15.0/tests/test_cli_compact.py +0 -135
- sidegraph-0.15.0/tests/test_retrieval_seeds.py +0 -49
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.gitignore +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.gitleaks.toml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.opencode/INSTALL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/.python-version +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/AGENTS.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/LICENSE +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/README.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/SECURITY.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/concepts/data-model.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/getting-started/bootstrap.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/getting-started/claude-code-setup.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/getting-started/codex-setup.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/getting-started/quickstart.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/adr-export.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/capturing-decisions.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/migrating-to-0.14.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/retrieval-in-sessions.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/semantic-docs.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/team-workflow.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/troubleshooting.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/using-0.15.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/integrations/claude-code.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/integrations/codex.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/integrations/graphify.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/integrations/muse.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/integrations/opencode.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/llms.txt +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/configuration.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/git-bindings.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/operations.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/releasing.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/reference/stability.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/index.js +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.15.0/plugin/sidegraph/skills/import-adrs → sidegraph-0.16.0/plugin/sidegraph/skills/health-check}/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.15.0/plugin/sidegraph/skills/manage-domains → sidegraph-0.16.0/plugin/sidegraph/skills/import-adrs}/agents/openai.yaml +0 -0
- {sidegraph-0.15.0/plugin/sidegraph/skills/name-domains → sidegraph-0.16.0/plugin/sidegraph/skills/manage-domains}/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.15.0/plugin/sidegraph/skills/setup → sidegraph-0.16.0/plugin/sidegraph/skills/name-domains}/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
- {sidegraph-0.15.0/plugin/sidegraph/skills/stats → sidegraph-0.16.0/plugin/sidegraph/skills/setup}/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/adr.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/adr_cli.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/adr_files.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/adr_identity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bash_paths.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/capture.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/config.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/delivery.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/domain_snapshot.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/drift_checks.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/engine/rationale.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/diagnostics.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/mcp_entry.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/host/session_identity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/input_limits.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/integrity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/redaction_scan.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/redaction_tokens.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/schema.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/text_paths.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/tool_rate_limit.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/validation_errors.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/verify.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/worktree_seeds.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/src/sidegraph/write_boundary.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/__init__.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/conftest.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/graph_fixtures.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/opencode_plugin_runner.mjs +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/snapshot_support.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_adr.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_adr_files.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_adr_identity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_anchor_descriptor.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_anchor_paths.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_anchoring_membership.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_batch_panel_fixes.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_scan_regular.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_bootstrap_unanchored.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_adr.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_doctor.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_domains_snapshot.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_command_windows.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_config.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_delivery_evidence.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_delivery_stats.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_delivery_surfaces.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doc_import.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_integrity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_unhashable_payload.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_domain_seed_names.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_domain_snapshot_format.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_domain_snapshot_notices.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_domains.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_drift_checks.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_engine_build.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_entry_point_arguments.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_file_bound_retrieval.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_git_config_isolation.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_git_output_utf8.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_githooks.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_graphify_pin.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hook_body_compaction.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hook_failure_diagnostics.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hook_payload_encoding.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hook_showings.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_integrity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_launch.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_stop.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_host_wiring_checks.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hot_index.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hot_index_facts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hot_index_hook.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_import_dry_run_preview.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_importer.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_index_journal_mode.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_installed_wheel_smoke.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_integrity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_integrity_engine_version.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_mcp_entry_ratify_policy.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_mcp_entry_repo_root.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_muse_plugin.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_okf.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_opencode_plugin.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_portable_json.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_public_hook_launch.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_ratify_policy.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_rationale_compatibility.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_engine_version.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_file_labels.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_label_conventions.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_stub_collapse.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_type_split.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_rebuild_instruction.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_redaction_scan.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_redaction_tokens.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_repo_relative_paths_portable.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_membership_generations.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_membership_index.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_secret_scan_gate.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_binary_limits.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_capture_diagnostics.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_capture_limits.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_cli_diagnostics.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_doc_limits.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_input_limits.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_numeric_enums.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_python_shapes.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_redaction_cursor.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_redaction_scaling.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_validation_errors.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_security_write_boundary.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_seed_paths_portable.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_annotations.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_argument_names.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_invocation_policy.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_record_types.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_result_contract.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_session_attribution.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_cross_process_mutations.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_domain_members.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_file_anchor_names.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_non_file_entries.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_record_types.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_requirement.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_snapshot_wiring.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_subagent_start_manifests.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_subprocess_text_encoding.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_membership.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_snapshot_membership.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_text_paths.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_verify_domain_snapshot.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_verify_git_framing.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_verify_git_revisions.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_verify_git_stdin.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_verify_snapshot.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/test_worktree_seeds.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/wheel_server_trace.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tests/wheel_smoke.py +0 -0
- {sidegraph-0.15.0 → sidegraph-0.16.0}/tools/check_no_session_links.py +0 -0
|
@@ -130,7 +130,7 @@ jobs:
|
|
|
130
130
|
interpreter="$environment/bin/python"
|
|
131
131
|
constraints=()
|
|
132
132
|
if [ "$SDK_PAIR" = minimum ]; then
|
|
133
|
-
constraints=(fastmcp==3.4.2 mcp==1.
|
|
133
|
+
constraints=(fastmcp==3.4.2 mcp==1.30.0)
|
|
134
134
|
fi
|
|
135
135
|
uv pip install --python "$interpreter" "$wheel" pytest "${constraints[@]}"
|
|
136
136
|
mkdir -p "$RUNNER_TEMP/sdk-check"
|
|
@@ -188,6 +188,7 @@ jobs:
|
|
|
188
188
|
uv run pytest -q --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
|
|
189
189
|
tests/test_store_mutation_guard.py `
|
|
190
190
|
tests/test_store_mutation_immediate.py tests/test_store_cross_process_mutations.py `
|
|
191
|
+
tests/test_hook_contention.py tests/test_retrieval_seeds.py `
|
|
191
192
|
tests/test_portable_json.py tests/test_bootstrap_descriptor_cleanup.py `
|
|
192
193
|
tests/test_server_result_contract.py tests/test_server_invocation_policy.py `
|
|
193
194
|
tests/test_verify_git_stdin.py tests/test_seed_paths_portable.py `
|
|
@@ -197,6 +198,7 @@ jobs:
|
|
|
197
198
|
tests/test_hot_index_facts.py `
|
|
198
199
|
tests/test_delivery_evidence.py tests/test_delivery_stats.py tests/test_delivery_surfaces.py `
|
|
199
200
|
tests/test_git_output_utf8.py `
|
|
201
|
+
tests/test_health_check_skill.py `
|
|
200
202
|
$privateTests `
|
|
201
203
|
tests/test_installed_wheel_smoke.py
|
|
202
204
|
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
@@ -7,6 +7,42 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.16.0] — 2026-10-20
|
|
11
|
+
|
|
12
|
+
See [Using Sidegraph 0.16](docs/guides/using-0.16.md) for update, compatibility, and
|
|
13
|
+
limitation notes.
|
|
14
|
+
|
|
15
|
+
### Security
|
|
16
|
+
|
|
17
|
+
- Raise the minimum MCP Python SDK to 1.30.0, which includes the upstream fix for
|
|
18
|
+
[GHSA-84m7-p3x7-pcfv](https://github.com/advisories/GHSA-84m7-p3x7-pcfv). The supported
|
|
19
|
+
SDK major remains 1.
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- Add `/sidegraph:health-check`, a read-only installation report with six evidence sections
|
|
24
|
+
and prioritized manual recommendations. It uses an already identified Python interpreter
|
|
25
|
+
and skips doctor and stats paths when an existing SQLite index is unsafe to open.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- Hook-owned SQLite handles now refuse lock contention immediately across session, stop,
|
|
30
|
+
tool-use and subagent entry paths. SessionStart's dedupe remains best-effort under overlap;
|
|
31
|
+
its graph, filesystem and Git work is outside this lock-wait bound.
|
|
32
|
+
- Retrieval and file listings reuse a lazy, per-call descriptor lookup, avoiding repeated
|
|
33
|
+
full entity scans while preserving seed selection and rendered output.
|
|
34
|
+
- `sidegraph-compact` reports distinct hot files retained when their content is not fully
|
|
35
|
+
represented in the immutable archive, with warnings that distinguish extra fields from
|
|
36
|
+
shared-value or structure differences.
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- `list_domains` now bounds its complete MCP text response and reports matched, returned and
|
|
41
|
+
omitted counts with whole rows. Its provisional return shape changes from a bare list to a
|
|
42
|
+
JSON-text envelope; exact domain-id and query filters can retrieve rows left out by the cap.
|
|
43
|
+
- `sidegraph-stats` withholds anchor health counts while a fresh index's binding statuses await
|
|
44
|
+
`sidegraph-sync`, while keeping the record inventory and reach figures available.
|
|
45
|
+
|
|
10
46
|
## [0.15.0] — 2026-10-18
|
|
11
47
|
|
|
12
48
|
### 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.16.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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.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
|
|
@@ -23,7 +23,7 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
23
23
|
Requires-Python: >=3.13
|
|
24
24
|
Requires-Dist: anyio>=4
|
|
25
25
|
Requires-Dist: fastmcp<4,>=3.4.2
|
|
26
|
-
Requires-Dist: mcp<2,>=1.
|
|
26
|
+
Requires-Dist: mcp<2,>=1.30
|
|
27
27
|
Requires-Dist: pydantic>=2.9
|
|
28
28
|
Requires-Dist: python-ulid>=3.0
|
|
29
29
|
Description-Content-Type: text/markdown
|
|
@@ -26,6 +26,7 @@ If the repository already has ADRs or specs, use the
|
|
|
26
26
|
## Operate and maintain it
|
|
27
27
|
|
|
28
28
|
- [Migrate an existing store to Sidegraph 0.14](guides/migrating-to-0.14.md).
|
|
29
|
+
- [Check a Sidegraph installation](guides/health-check.md).
|
|
29
30
|
- [Survive refactors and heal anchors](guides/surviving-refactors.md).
|
|
30
31
|
- [Read what Sidegraph tells you when it needs attention](guides/troubleshooting.md).
|
|
31
32
|
- [Run CI and scheduled maintenance](guides/ci-cd-maintenance.md).
|
|
@@ -131,9 +131,11 @@ this matters in practice beyond an ordinary rename: freeing a community that a d
|
|
|
131
131
|
still claims (give the successor no matching `path_prefixes`/`seed_anchors` instead of
|
|
132
132
|
carrying the old rule forward).
|
|
133
133
|
|
|
134
|
-
**Listing.** `list_domains(status=None)`
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
**Listing.** `list_domains(status=None)` searches every status and returns whole domain rows
|
|
135
|
+
inside a bounded JSON-text envelope, with counts and a hint when filters or output limits omit
|
|
136
|
+
rows. Narrow by exact domain ids or query terms to reach a row from an omitted listing. Rows
|
|
137
|
+
include membership/lineage fields (`member_count`, `seed_anchor_count`, `parent_slug` and
|
|
138
|
+
`child_slugs`); this is the general "show me all domains" answer `list_proposed`
|
|
137
139
|
(proposed-only) and `list_domain_candidates` (unclaimed-only) don't cover.
|
|
138
140
|
|
|
139
141
|
## How domains relate to engine communities
|
|
@@ -103,6 +103,12 @@ an empty list with an explanatory `"note"` key — everything store-derived (`do
|
|
|
103
103
|
takes the seeds as `files` and `entities`): given what the agent is about to touch, return a compact slice of structure *and* memory, memory ranked so the things
|
|
104
104
|
most likely to save it from a repeat mistake come first.
|
|
105
105
|
|
|
106
|
+
Within one retrieval or file-list call, descriptor resolution shares a lazy, operation-scoped
|
|
107
|
+
lookup of parsed entities. It preserves the existing exact-path, pathless adoption, ambiguity,
|
|
108
|
+
and winner rules while avoiding a full entity-table parse for each graph node. The lookup is
|
|
109
|
+
discarded after the call; a later call sees entity changes. This is a performance-only change:
|
|
110
|
+
seed selection, record ranking, budgets, and rendered output are unchanged.
|
|
111
|
+
|
|
106
112
|
### Seeds
|
|
107
113
|
|
|
108
114
|
A `Seed` is either:
|
|
@@ -24,18 +24,18 @@ installs a non-editable wheel outside the checkout, checks its package bytes aga
|
|
|
24
24
|
artifact, runs a CLI, and exchanges real MCP stdio messages in a Unicode/spaced directory.
|
|
25
25
|
The exact selection is in [the CI workflow](../../.github/workflows/ci.yml).
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
For the 0.14.0 release-candidate campaign, real Claude Code and Codex sessions ran with the
|
|
28
28
|
installed plugin, in fresh host profiles, on Windows Server 2022 x64 and macOS 15 arm64,
|
|
29
|
-
each with Python 3.13 and 3.14. Each run
|
|
29
|
+
each with Python 3.13 and 3.14. Each run was the full plugin session for both hosts: the
|
|
30
30
|
plugin's MCP server, `SessionStart` context, records before a Read, a bundled skill, a
|
|
31
31
|
subagent brief, the `Stop` capture prompt, capture and ratification, and recall in a fresh
|
|
32
|
-
session. The project folder and host profile paths
|
|
32
|
+
session. The project folder and host profile paths contained a non-ASCII character.
|
|
33
33
|
|
|
34
34
|
**0.14.0 publication gate:** Claude Code 2.1.296 and Codex CLI 0.162.1 on all four cells
|
|
35
35
|
above, including a Windows 3.14 cell with PowerShell 7 unavailable for preflight and both
|
|
36
36
|
real host sessions. Windows 3.13 retains PowerShell 7; its launcher checks also cover 5.1.
|
|
37
|
-
Stable publication
|
|
38
|
-
README's blue badges summarize release acceptance, rather than live workflow status or
|
|
37
|
+
Stable publication of 0.14.0 required the full gate to pass without a known-issue exception.
|
|
38
|
+
The README's blue badges summarize release acceptance, rather than live workflow status or
|
|
39
39
|
support for every published version. Muse and OpenCode have the narrower coverage in
|
|
40
40
|
their installation guides and are outside this native matrix.
|
|
41
41
|
|
|
@@ -45,14 +45,15 @@ with Git for Windows installed; they do not establish support for Windows hosts
|
|
|
45
45
|
remains outside these checks.
|
|
46
46
|
See [Windows](#windows) before installing a host plugin.
|
|
47
47
|
|
|
48
|
-
Package dependencies support `fastmcp>=3.4.2,<4` and `mcp>=1.
|
|
48
|
+
Package dependencies support `fastmcp>=3.4.2,<4` and `mcp>=1.30,<2`. Major SDK upgrades
|
|
49
49
|
require a separate compatibility review; an unlocked package install may resolve newer
|
|
50
50
|
versions within those bounds than the development lockfile.
|
|
51
51
|
|
|
52
52
|
### Windows
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
Current native CI covers selected core/MCP checks, wheel installation, CLI execution, and
|
|
55
|
+
MCP stdio paths; WSL is not a separate CI target. Full Windows plugin sessions were exercised
|
|
56
|
+
in the historical 0.14.0 release-candidate campaign described above.
|
|
56
57
|
|
|
57
58
|
**Version requirement:** releases before 0.12.0 can stall a native Windows write: a Git
|
|
58
59
|
child inherits the MCP stdin pipe and holds the write until the request times out (see
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Check a Sidegraph installation
|
|
2
|
+
|
|
3
|
+
Use `/sidegraph:health-check` to collect one read-only report for the current repository.
|
|
4
|
+
It covers plugin wiring, runtime versions, Graphify, store integrity, anchor advisories, and
|
|
5
|
+
inventory and usage. `UNKNOWN` means the evidence could not be established; it remains a
|
|
6
|
+
warning and never becomes a clean result.
|
|
7
|
+
|
|
8
|
+
## Runtime requirement
|
|
9
|
+
|
|
10
|
+
The skill runs its local `scripts/collect.py` helper with `-B` under an already identified
|
|
11
|
+
Python interpreter. In a development checkout, the supported paths are:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
"<project>/.venv/bin/python" -B "<skill-directory>/scripts/collect.py" --project "<launch-directory>" --host claude
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
For Codex, pass `--host codex`; use `unknown` when the attached host is not known. On Windows,
|
|
18
|
+
use the existing `<project>/.venv/Scripts/python.exe`. Installed use requires a
|
|
19
|
+
known interpreter from attached host launch metadata or metadata for an identified Sidegraph
|
|
20
|
+
environment. The collector does not guess a Python on `PATH`, run an unknown Sidegraph
|
|
21
|
+
executable, or use `uv`/`uvx` as its launcher. If no suitable interpreter is known, the skill
|
|
22
|
+
shows all six sections as limited, includes safe static evidence already available, lists
|
|
23
|
+
manual recommendations, and stops. The same fallback applies when the helper exits nonzero,
|
|
24
|
+
prints error JSON, or cannot import required inspection helpers; show only the error class and
|
|
25
|
+
do not echo exception text. Cached package files alone do not authorize provisioning.
|
|
26
|
+
|
|
27
|
+
The skill resolves the Git root to select the interpreter, then passes the original launch
|
|
28
|
+
directory as `--project` so Claude plugin-scope checks retain the launch context. The optional
|
|
29
|
+
`--store`, `--graph`, and `--plugin-root` arguments are for
|
|
30
|
+
paths already known to the host or user; the collector does not search unrelated profiles.
|
|
31
|
+
|
|
32
|
+
## Evidence and limits
|
|
33
|
+
|
|
34
|
+
The report separates the collector package, plugin manifest, optional PATH installation,
|
|
35
|
+
Graphify-recorded engine version, and any already observed active MCP evidence. Static
|
|
36
|
+
registration is not proof that a running server answered. The workflow never starts a server
|
|
37
|
+
or calls retrieval tools to test connectivity.
|
|
38
|
+
|
|
39
|
+
The collector fingerprints the canonical store, index and sidecars, settings, plugin
|
|
40
|
+
manifests, graph inputs, and actual Git index around its process. This is a stable-source
|
|
41
|
+
check, not an atomic snapshot; concurrent writes make preservation evidence unstable without
|
|
42
|
+
identifying which process changed it. Host hooks surrounding tool invocation are outside the
|
|
43
|
+
collector's preservation boundary.
|
|
44
|
+
|
|
45
|
+
If the index is absent, canonical-only doctor curation still runs, and index-dependent
|
|
46
|
+
findings and stats are marked skipped. If an existing index has WAL/SHM sidecars, an
|
|
47
|
+
unrecognized header, an unreadable header, or a nonempty rollback journal, all doctor
|
|
48
|
+
advisory and stats paths that could open it are skipped. A regular rollback-mode index allows
|
|
49
|
+
the existing doctor and stats checks to run. Cold or stale index qualifications are retained.
|
|
50
|
+
|
|
51
|
+
The six report sections distinguish contract violations from advisory findings and missing
|
|
52
|
+
coverage. Inventory counts come from canonical readers. Pending age is unknown for malformed
|
|
53
|
+
record identifiers. Usage reports summarize recorded activity only; delivery counts do not
|
|
54
|
+
show usefulness, prevented errors, or saved time. Records on unmerged or remote-only branches
|
|
55
|
+
are not exhaustively checked.
|
|
56
|
+
|
|
57
|
+
## Manual follow-up
|
|
58
|
+
|
|
59
|
+
Recommendations are prioritized and deduplicated, with a reason, explicit scope, argv, working
|
|
60
|
+
directory, and environment for a manual command or skill to run after the report. Render argv
|
|
61
|
+
with the attached shell's native quoting; paths are never embedded into shell snippets. The
|
|
62
|
+
health check never executes recommendations. Ordinary doctor and stats reads
|
|
63
|
+
outside this collector can create SQLite sidecars for a WAL database, so inspect such an
|
|
64
|
+
index separately after the writing session. Ending a session does not guarantee a persistent
|
|
65
|
+
journal-mode change. Do not recommend an upgrade from an unknown version or install the
|
|
66
|
+
optional PATH CLI solely because it is absent.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Using Sidegraph 0.16
|
|
2
|
+
|
|
3
|
+
Sidegraph 0.16.0 adds bounded full-domain listings, honest uncomputed stats, a read-only
|
|
4
|
+
installation health report, lower repeated descriptor-lookup cost, immediate refusal of hook
|
|
5
|
+
SQLite lock contention, and clearer reporting of retained hot files during compaction. See the
|
|
6
|
+
[changelog](../../CHANGELOG.md#0160--2026-10-20) for details.
|
|
7
|
+
|
|
8
|
+
## Update
|
|
9
|
+
|
|
10
|
+
For a CLI installed from the public repository's `main`, run:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
uv tool upgrade sidegraph
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
For a PyPI version pin, install or upgrade to the exact release:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
uv tool install --upgrade sidegraph==0.16.0
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For host plugins, update the marketplace package and installed plugin using the
|
|
23
|
+
[host installation instructions](../getting-started/installation.md), then start a new session
|
|
24
|
+
so the MCP server and hooks use the released version. Public plugin manifests intentionally
|
|
25
|
+
follow `main`; an explicit release-candidate pin stays pinned until you change it.
|
|
26
|
+
|
|
27
|
+
## Stores and changed responses
|
|
28
|
+
|
|
29
|
+
Existing stores from 0.15 remain compatible. This release adds no canonical store format
|
|
30
|
+
migration.
|
|
31
|
+
|
|
32
|
+
`list_domains` now returns a provisional JSON text envelope with `matched`, `returned`, `omitted`,
|
|
33
|
+
`domains`, and `hint`, instead of a bare list. Read rows from `domains`; use the counts and hint
|
|
34
|
+
to see whether the response was bounded and how to narrow it.
|
|
35
|
+
|
|
36
|
+
Run `/sidegraph:health-check` for a read-only report about plugin wiring, runtime versions,
|
|
37
|
+
Graphify, store integrity, anchor advisories, and recorded inventory and usage. Missing evidence
|
|
38
|
+
stays `UNKNOWN`; an unsafe existing SQLite index causes checks that might open it to be skipped.
|
|
39
|
+
|
|
40
|
+
## Limits
|
|
41
|
+
|
|
42
|
+
Retrieval can still include off-task records, and this release does not measure whether delivered
|
|
43
|
+
memory helped or saved time. It adds no task-query ranking or full-pool recall claim, and it does
|
|
44
|
+
not change active-store compaction behavior. Health-report usage counts describe recorded
|
|
45
|
+
activity, not usefulness.
|
|
@@ -1091,30 +1091,45 @@ before removing the now-redundant hot files leaves those as harmless leftover du
|
|
|
1091
1091
|
run detects and removes them without writing a second, duplicate segment — counted separately
|
|
1092
1092
|
in the output as "leftover hot file(s)".
|
|
1093
1093
|
|
|
1094
|
-
**A hot file that differs from its archived copy.** Compact keeps
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1094
|
+
**A hot file that differs from its archived copy.** Compact keeps both copies and prints a
|
|
1095
|
+
`DIFFERENT content` warning on stderr. When ignoring hot-only fields makes the shared content
|
|
1096
|
+
match, the warning says those extra fields are not represented in the archive and that a newer
|
|
1097
|
+
Sidegraph may have written them; that is an observed shape, not proof of which version wrote it.
|
|
1098
|
+
If shared values or structures differ, the warning says to compare both copies. The record is
|
|
1099
|
+
still counted in `compacted N record(s)`, because it is in the new segment; its hot file is not
|
|
1100
|
+
removed. Output also reports `kept K hot file(s): their content is not fully represented in the
|
|
1101
|
+
archive`, including on later compact runs that have no new records to archive. `sidegraph-verify`
|
|
1102
|
+
continues to report `duplicate-ulid` while both copies remain. Upgrading alone is not promised to
|
|
1103
|
+
reconcile an existing immutable archive entry. Back up the store, run `sidegraph-verify --db
|
|
1104
|
+
<store-dir>`, compare both copies against known-good history, and retain both until you establish
|
|
1105
|
+
an information-preserving reconciliation. For a fresh candidate in `--dry-run`, the warning
|
|
1106
|
+
compares the hot file with the prospective archive payload; no second copy has been published yet.
|
|
1101
1107
|
|
|
1102
1108
|
**`--dry-run` output:** one line per candidate — `<ulid> <kind> <status> <title>` — or a bare
|
|
1103
1109
|
`nothing to compact` if there is nothing eligible at all (no candidates, nothing age-filtered
|
|
1104
|
-
out, no leftovers). Otherwise: `would compact N record(s) (X
|
|
1105
|
-
(not terminal enough)`; if `--older-than` excluded any domains
|
|
1106
|
-
to check), an additional line reports `M domain(s) excluded:
|
|
1107
|
-
interrupted run left redundant hot files behind, an additional
|
|
1108
|
-
K leftover hot file(s) already durably archived by a prior,
|
|
1110
|
+
out, no leftovers, and no mismatched hot files). Otherwise: `would compact N record(s) (X
|
|
1111
|
+
decisions, Y domains); Z skipped (not terminal enough)`; if `--older-than` excluded any domains
|
|
1112
|
+
outright (no terminal timestamp to check), an additional line reports `M domain(s) excluded:
|
|
1113
|
+
terminal age unknown`; if a prior interrupted run left redundant hot files behind, an additional
|
|
1114
|
+
line reports `would also remove K leftover hot file(s) already durably archived by a prior,
|
|
1115
|
+
interrupted compact run`; and mismatches add `would keep K hot file(s): their content is not fully
|
|
1116
|
+
represented in the archive`. Dry-run compares fresh candidates as well as archived leftovers and
|
|
1117
|
+
writes no canonical file, archive segment or digest. `--older-than` filters fresh candidates;
|
|
1118
|
+
already archived leftovers remain eligible for cleanup or retention regardless of their current
|
|
1119
|
+
hot status or age. Opening the store may still initialize or
|
|
1120
|
+
migrate it, or rebuild `index.db`.
|
|
1109
1121
|
|
|
1110
1122
|
**Real-run output:** when there was nothing to do at all, a single line —
|
|
1111
1123
|
`nothing to compact` (bare), or `nothing to compact; Z skipped (not terminal enough)` and/or
|
|
1112
|
-
`; M domain(s) excluded: terminal age unknown` appended when either applies.
|
|
1124
|
+
`; M domain(s) excluded: terminal age unknown` appended when either applies. A positive kept
|
|
1125
|
+
count bypasses that no-op line. Otherwise:
|
|
1113
1126
|
`compacted N record(s) into <segment_path> (X decisions, Y domains); Z skipped (not terminal
|
|
1114
|
-
enough)` — or `compacted 0 record(s); Z skipped (not terminal enough)` when
|
|
1115
|
-
cleanup
|
|
1116
|
-
terminal age unknown` line
|
|
1117
|
-
|
|
1127
|
+
enough)` — or `compacted 0 record(s); Z skipped (not terminal enough)` when kept hot files or
|
|
1128
|
+
leftover cleanup remain and no new segment was written — followed by an `M domain(s) excluded:
|
|
1129
|
+
terminal age unknown` line, a `cleaned up K leftover hot file(s) from an interrupted prior
|
|
1130
|
+
compact run` line, and/or `kept K hot file(s): their content is not fully represented in the
|
|
1131
|
+
archive`, each only when applicable. `compacted N` counts new archive entries; `kept K` counts
|
|
1132
|
+
distinct hot files retained after comparison.
|
|
1118
1133
|
|
|
1119
1134
|
**Exit code:** `0` on success, including a no-op run and every `--dry-run` that completes.
|
|
1120
1135
|
Returns `1` before touching the store if `--older-than` is negative (`--older-than must be >= 0
|
|
@@ -1771,6 +1786,13 @@ Lines the report will not invent:
|
|
|
1771
1786
|
no figure derived from the records: MEMORY and ANCHORS read `not shown: the index is behind
|
|
1772
1787
|
the store files`, and REACH says which of its figures are not counted. The journal-derived
|
|
1773
1788
|
lines are unaffected. `--json` carries `"index_stale": true` and `null` for those figures.
|
|
1789
|
+
- **Binding statuses not computed.** A fresh index can still have binding statuses waiting for
|
|
1790
|
+
`sidegraph-sync` after reload. In that state, ANCHORS reads `not computed for current graph →
|
|
1791
|
+
sidegraph-sync`; no anchor counts are shown, while MEMORY and REACH inventory remain available.
|
|
1792
|
+
`--json` carries `"anchors": null`, `"binding_statuses_computed": false` and
|
|
1793
|
+
`"index_stale": false`. When both conditions apply, canonical file staleness takes precedence
|
|
1794
|
+
in the text; `binding_statuses_computed` is false without implying that volatile state alone
|
|
1795
|
+
caused the omission.
|
|
1774
1796
|
- **Budget and abandoned counts not recorded.** Once the report is past the floor above, when
|
|
1775
1797
|
the window holds no render-journal record, the budget lines are replaced by the single line
|
|
1776
1798
|
`budget and tried-and-abandoned counts: not recorded yet`. A zero there would read as a
|
|
@@ -14,6 +14,11 @@ before it reads stdin or opens the store, so typing `--help` never runs a hook.
|
|
|
14
14
|
without arguments. For wiring them into `.claude/settings.json`, see
|
|
15
15
|
[`getting-started/claude-code-setup.md`](../getting-started/claude-code-setup.md).
|
|
16
16
|
|
|
17
|
+
Hook-owned SQLite connections use a zero-second busy timeout, so a lock held by another
|
|
18
|
+
Sidegraph writer is refused immediately at the database layer. This bounds SQLite lock waits;
|
|
19
|
+
graph loading, filesystem work, transcript parsing and Git still contribute to whole-hook time.
|
|
20
|
+
Other `Store`, hot-index and read-only-index callers retain their existing defaults.
|
|
21
|
+
|
|
17
22
|
## The command guard
|
|
18
23
|
|
|
19
24
|
The wiring commands in the plugin manifests and the setup recipes end with a shell guard:
|
|
@@ -145,8 +150,9 @@ Behavior:
|
|
|
145
150
|
60 seconds of the recorded one, before or after it, is a duplicate (the hook registered
|
|
146
151
|
twice on one host, for example the plugin and a hand-written project hook), and it prints
|
|
147
152
|
`{}` and returns before anything below runs. The check is a read that takes no write lock,
|
|
148
|
-
so a
|
|
149
|
-
|
|
153
|
+
so a readable, already-stamped duplicate exits immediately. A start that is not a duplicate
|
|
154
|
+
decides again and stamps the ledger in one write transaction. Stamping remains best-effort:
|
|
155
|
+
if overlapping copies both encounter a busy write, both may emit the standing map.
|
|
150
156
|
If the store cannot be opened, the hook does not print `{}` (see
|
|
151
157
|
[A store that cannot open](#a-store-that-cannot-open)): memory is off for the session and the
|
|
152
158
|
person is told. Only a lock another process holds keeps the silent `{}`.
|
|
@@ -483,7 +489,7 @@ lines only.
|
|
|
483
489
|
host (different session ids, so the duplicate guard in step 1 does not apply) do not both
|
|
484
490
|
send it. If the write itself fails, the notice is sent anyway: a duplicate is better than
|
|
485
491
|
silence. When the failure is a lock another process holds, the hook stops writing for that
|
|
486
|
-
start (
|
|
492
|
+
start (further writes are refused promptly too) and sends the remaining due
|
|
487
493
|
notices unclaimed.
|
|
488
494
|
- A check that ran and found nothing deletes its row, so a problem that returns after a fix is
|
|
489
495
|
reported at once. Only a row that exists is deleted, so a start with nothing recorded makes no
|
|
@@ -783,8 +789,9 @@ repairs it, the hook keeps printing `{}`. `Store` repairs some of these and refu
|
|
|
783
789
|
re-checks the record files before each call, but it keeps the connection it opened, so a deleted
|
|
784
790
|
`index.db` stays gone for it until it restarts.
|
|
785
791
|
|
|
786
|
-
|
|
787
|
-
|
|
792
|
+
Hook-owned writes refuse the index lock immediately. A refused hot write is dropped, and the
|
|
793
|
+
hook makes no further hot write in that run. SQLite contention does not set a whole-hook latency
|
|
794
|
+
target; unrelated startup, graph and filesystem work can still take time.
|
|
788
795
|
|
|
789
796
|
Two consequences are visible:
|
|
790
797
|
|
|
@@ -1077,8 +1084,8 @@ spawn), and one `retrieval_shows` bump each. Nothing is journaled without a sess
|
|
|
1077
1084
|
64 KB for each text document the brief names, and one records query for each file the brief names
|
|
1078
1085
|
that has anchored records, stopping at the sixth file that has any (each shown file costs at least
|
|
1079
1086
|
one line), then one write transaction for the journal rows. This path used to be read-only: while
|
|
1080
|
-
another process holds the write lock,
|
|
1081
|
-
|
|
1087
|
+
another process holds the write lock, the optional journal write now refuses immediately, and a
|
|
1088
|
+
failed write is swallowed (the brief is still delivered). It loads
|
|
1082
1089
|
nothing beyond the standard library, like the rest of this hook.
|
|
1083
1090
|
|
|
1084
1091
|
**Not tested.**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# MCP tools reference
|
|
2
2
|
|
|
3
|
-
Twenty-
|
|
3
|
+
Twenty-five tools, all defined in [`src/sidegraph/server.py`](../../src/sidegraph/server.py) and
|
|
4
4
|
exposed by the `sidegraph-mcp` stdio server (`FastMCP("sidegraph")`). The server holds one
|
|
5
5
|
process-wide `Store` (path resolved via `$SIDEGRAPH_DIR`, same precedence the CLI and hooks
|
|
6
6
|
use — see [`configuration.md`](configuration.md#store-path-resolution)) and a best-effort
|
|
@@ -19,24 +19,26 @@ server without host identity: the session id stays null and retrievals are journ
|
|
|
19
19
|
|
|
20
20
|
## Transport and protocol compatibility
|
|
21
21
|
|
|
22
|
-
`sidegraph-mcp`
|
|
23
|
-
standard output carry protocol messages; diagnostics go to standard error.
|
|
24
|
-
|
|
22
|
+
`sidegraph-mcp` defaults to a local **stdio** server started by an MCP client. Standard input
|
|
23
|
+
and standard output carry protocol messages; diagnostics go to standard error. FastMCP
|
|
24
|
+
transport settings can select HTTP, but Sidegraph supplies no separate HTTP authorization
|
|
25
|
+
configuration.
|
|
25
26
|
Configure the working directory and `SIDEGRAPH_DIR` for the repository the server should
|
|
26
27
|
use; see [configuration](configuration.md#path-resolution-semantics).
|
|
27
28
|
|
|
28
29
|
Git commands for provenance, initiative, ratification identity and graph checks receive
|
|
29
30
|
EOF on standard input, keeping subprocesses separate from the MCP protocol stream.
|
|
30
31
|
|
|
31
|
-
The development lockfile selects FastMCP 3.4.2 and MCP Python SDK 1.
|
|
32
|
-
dependencies are `fastmcp>=3.4.2,<4` and `mcp>=1.
|
|
32
|
+
The development lockfile selects FastMCP 3.4.2 and MCP Python SDK 1.30.0. Supported package
|
|
33
|
+
dependencies are `fastmcp>=3.4.2,<4` and `mcp>=1.30,<2`. The locked stack
|
|
33
34
|
uses the `initialize` / `notifications/initialized` lifecycle and negotiates protocol
|
|
34
35
|
versions through **2025-11-25**. The server reports Sidegraph's package version in
|
|
35
36
|
`serverInfo.version`; that is separate from the negotiated protocol version.
|
|
36
37
|
|
|
37
38
|
The [2026-07-28 MCP specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/versioning)
|
|
38
39
|
also describes a newer discovery lifecycle. The locked stack does not implement
|
|
39
|
-
`server/discover
|
|
40
|
+
`server/discover`; the installed MCP 1.30.0 server returns JSON-RPC `-32602` (`Invalid request
|
|
41
|
+
parameters`) for that request. A client must support the legacy initialization flow to use this
|
|
40
42
|
release. A request for a newer version during `initialize` can receive `2025-11-25`;
|
|
41
43
|
the client must check that it supports the returned version.
|
|
42
44
|
|
|
@@ -59,15 +61,16 @@ counting or rendering those as separate answers.
|
|
|
59
61
|
**Every listing tool is bounded.** The host replaces an answer over its limit with a notice
|
|
60
62
|
(Claude Code: a warning above 10,000 tokens, an "exceeds maximum allowed tokens" notice above
|
|
61
63
|
25,000 tokens by default, and a result saved to a file above 50,000 characters). So
|
|
62
|
-
`retrieve_decisions`, `list_facts`, `get_entity_history`, `drill_down`, `list_domain_candidates
|
|
63
|
-
|
|
64
|
-
`
|
|
65
|
-
|
|
64
|
+
`retrieve_decisions`, `list_facts`, `get_entity_history`, `drill_down`, `list_domain_candidates`,
|
|
65
|
+
`list_proposed` and `list_domains` are bounded and say what they left out and how to narrow.
|
|
66
|
+
All seven take `budget_chars` (default 24,000, maximum 40,000). `retrieve_decisions`,
|
|
67
|
+
`list_facts`, `get_entity_history`, `drill_down` and `list_domains` take `limit` (default 25,
|
|
68
|
+
maximum 100); `list_domain_candidates` keeps its own `limit`. `get_task_context`, `query_structure`,
|
|
66
69
|
`query_decisions` and `list_proposed` never return more than 40,000 characters: a cut names
|
|
67
70
|
the sections it removed in a closing note, and the advice at the end of the answer (how the
|
|
68
71
|
seeds were read, what is not in the graph, the supersede hint, the drift legend) is kept.
|
|
69
|
-
`
|
|
70
|
-
|
|
72
|
+
`verify_store`, `sync_anchors` and `find_entity` are sized by the number of findings or name
|
|
73
|
+
candidates, not by accumulated memory, and stay unbounded. In Codex
|
|
71
74
|
the host-side knob is `mcp_servers.<id>.tools.<tool>.output_token_limit` (its default is not
|
|
72
75
|
documented).
|
|
73
76
|
|
|
@@ -1198,21 +1201,37 @@ key instead of erroring.
|
|
|
1198
1201
|
## `list_domains`
|
|
1199
1202
|
|
|
1200
1203
|
```python
|
|
1201
|
-
list_domains(
|
|
1204
|
+
list_domains(
|
|
1205
|
+
status: str | None = None,
|
|
1206
|
+
query: str | None = None,
|
|
1207
|
+
ids: list[str] | None = None,
|
|
1208
|
+
limit: int = 25,
|
|
1209
|
+
budget_chars: int = 24000,
|
|
1210
|
+
) -> ToolResult
|
|
1202
1211
|
```
|
|
1203
1212
|
|
|
1204
|
-
The full-listing counterpart to `list_proposed` (proposed-only) and
|
|
1205
|
-
(unclaimed-only)
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1213
|
+
The bounded, full-listing counterpart to `list_proposed` (proposed-only) and
|
|
1214
|
+
`list_domain_candidates` (unclaimed-only). `status`, when given, filters to one of
|
|
1215
|
+
`"proposed"`/`"accepted"`/`"dropped"`/`"superseded"`; omitted returns every status.
|
|
1216
|
+
`ids` matches exact domain ids (`Domain.domain_id`, the row's `id`, never its slug).
|
|
1217
|
+
`query` is case-insensitive whitespace-separated AND terms searched across slug, title and
|
|
1218
|
+
summary joined with newlines. Filters combine with AND; blank query and blank-only ids are
|
|
1219
|
+
ignored. `limit` is clamped to 1..100 and `budget_chars` to 4,000..40,000. Read-only — writes
|
|
1220
|
+
nothing, ever; safe to call repeatedly.
|
|
1221
|
+
|
|
1222
|
+
**Returns:** one text block containing compact JSON: `{"matched": int, "returned": int,
|
|
1223
|
+
"omitted": int, "domains": [...], "hint": str | null}`. Counts are after filtering and
|
|
1224
|
+
before bounds; no matches means all three counts are zero. `domains` is the largest fitting
|
|
1225
|
+
initial prefix of complete rows, sorted by slug. Each row retains the existing fields:
|
|
1226
|
+
`{"id", "slug", "title", "summary", "status", "member_count", "path_prefixes",
|
|
1227
|
+
"seed_anchor_count", "parent_slug", "child_slugs"}`. `member_count` remains
|
|
1228
|
+
`len(domain.communities)`. Parent/child lineage comes from the full store even when filters
|
|
1229
|
+
exclude relatives. When the character budget omits rows, `hint` identifies the effective bound,
|
|
1230
|
+
suggests filters, and gives a bounded relative local-file fallback for the next omitted domain.
|
|
1231
|
+
When `limit` cuts the list, the hint suggests filters and raising `limit` only below 100. Empty
|
|
1232
|
+
stores say `No domains in the store.`; empty filtered matches name active filter keys without
|
|
1233
|
+
echoing their values. This is the provisional MCP return shape and sends no output schema or
|
|
1234
|
+
structured duplicate.
|
|
1216
1235
|
|
|
1217
1236
|
## `propose_decisions`
|
|
1218
1237
|
|
|
@@ -595,17 +595,21 @@ collision — publishing retries under the next sequence number rather than over
|
|
|
595
595
|
Identical content normally produces identical bytes and a matching hash suffix; the loader
|
|
596
596
|
deduplicates overlapping ULIDs after branches merge.
|
|
597
597
|
|
|
598
|
-
The loader reads hot files **and** every archive segment on every load, deduping by ULID (
|
|
599
|
-
record can legitimately appear in more than one segment — e.g. compaction run
|
|
600
|
-
two branches before they merged —
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
598
|
+
The loader reads hot files **and** every archive segment on every load, deduping by ULID (an
|
|
599
|
+
archive record can legitimately appear in more than one segment — e.g. compaction run
|
|
600
|
+
independently on two branches before they merged — and byte-identical archive copies are
|
|
601
|
+
equivalent). If a hot file and an archived copy of the same id disagree, the hot file wins and
|
|
602
|
+
a warning prints; the store never silently prefers the archive over live disk state. A key the
|
|
603
|
+
hot file lacks, against `null` or an empty list or object in the archive, is not a disagreement
|
|
604
|
+
(the file predates the field). A key only the hot file holds, at any depth and whatever its
|
|
605
|
+
value, always is, and `sidegraph-compact` keeps that file. Warnings identify whether hot-only
|
|
606
|
+
fields explain the mismatch or whether shared values/structures differ; neither cause alone
|
|
607
|
+
proves which writer produced the copy. Both copies remain available, so `sidegraph-verify` may
|
|
608
|
+
report `duplicate-ulid`. Back up the store, verify it, compare both copies against known-good
|
|
609
|
+
history, and retain both until an information-preserving reconciliation is established. An
|
|
610
|
+
upgrade alone does not promise to reconcile an existing immutable archive entry. The freshness
|
|
611
|
+
digest (above) covers `archive/*.jsonl` too, so a segment absorbed from a teammate's branch via
|
|
612
|
+
`git pull` is picked up on the next open exactly like any other new committed file.
|
|
609
613
|
|
|
610
614
|
`sidegraph-compact --older-than N` additionally requires a record to have been terminal for at
|
|
611
615
|
least `N` days; domains are always excluded from that filter (nothing on `Domain` records when
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sidegraph",
|
|
3
3
|
"displayName": "Sidegraph",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.16.0",
|
|
5
5
|
"description": "Durable decision/lessons memory over your code graph — ADRs, gotchas, and constraints that survive refactors, retrieved mistakes-first.",
|
|
6
6
|
"author": { "name": "SantyagoSeaman", "url": "https://github.com/SantyagoSeaman" },
|
|
7
7
|
"homepage": "https://github.com/SantyagoSeaman/sidegraph",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sidegraph",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Durable decision/lessons memory over your code graph — ADRs, gotchas, and constraints that survive refactors, retrieved mistakes-first.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"skills": "./skills/",
|