sidegraph 0.6.0__tar.gz → 0.8.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.6.0 → sidegraph-0.8.0}/CHANGELOG.md +321 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/CLAUDE.md +1 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/PKG-INFO +2 -2
- {sidegraph-0.6.0 → sidegraph-0.8.0}/README.md +1 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/README.md +1 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/anchoring.md +34 -6
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/mind-model.md +7 -7
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/retrieval.md +70 -27
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/claude-code-setup.md +13 -6
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/codex-setup.md +10 -2
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/capturing-decisions.md +19 -7
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/retrieval-in-sessions.md +26 -5
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/semantic-docs.md +5 -3
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/surviving-refactors.md +41 -5
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/team-workflow.md +22 -0
- sidegraph-0.8.0/docs/guides/troubleshooting.md +221 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/verifying-your-setup.md +3 -2
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/integrations/claude-code.md +73 -26
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/integrations/codex.md +53 -6
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/integrations/graphify.md +130 -26
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/llms.txt +1 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/cli.md +109 -13
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/configuration.md +27 -9
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/git-bindings.md +5 -3
- sidegraph-0.8.0/docs/reference/hooks.md +566 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/mcp-tools.md +187 -9
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/operations.md +1 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/stability.md +4 -3
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/store-format.md +21 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/hooks.json +2 -2
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/hooks/hooks.json +3 -3
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/SKILL.md +9 -6
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/SKILL.md +5 -3
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/SKILL.md +11 -6
- {sidegraph-0.6.0 → sidegraph-0.8.0}/pyproject.toml +1 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/capture.py +20 -21
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/cli.py +319 -9
- sidegraph-0.8.0/src/sidegraph/config.py +533 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/doctor.py +101 -18
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/engine/reader.py +380 -6
- sidegraph-0.8.0/src/sidegraph/freshness.py +59 -0
- sidegraph-0.8.0/src/sidegraph/githooks.py +556 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/host/hooks.py +648 -150
- sidegraph-0.8.0/src/sidegraph/integrity.py +1098 -0
- sidegraph-0.8.0/src/sidegraph/nearest_anchored.py +305 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/retrieval.py +246 -74
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/schema.py +12 -1
- sidegraph-0.8.0/src/sidegraph/seed_ladder.py +604 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/server.py +478 -71
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/stats/model.py +77 -8
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/stats/render.py +43 -3
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/store.py +135 -12
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/sync.py +232 -54
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/verify.py +38 -3
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/conftest.py +19 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/auto_policy/parity_goldens.json +1 -1
- sidegraph-0.8.0/tests/fixtures/member_names_python_graph.json +109 -0
- sidegraph-0.8.0/tests/fixtures/member_names_swift_graph.json +77 -0
- sidegraph-0.8.0/tests/githooks_support.py +194 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_doctor.py +3 -2
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_graph_paths.py +1 -1
- sidegraph-0.8.0/tests/test_cli_init_hooks.py +598 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_sync.py +7 -4
- sidegraph-0.8.0/tests/test_config_ancestor_lookup.py +265 -0
- sidegraph-0.8.0/tests/test_config_borrowed_graph.py +279 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_digest_integrity.py +23 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_docs_claims.py +33 -0
- sidegraph-0.8.0/tests/test_doctor_graph_stale.py +90 -0
- sidegraph-0.8.0/tests/test_doctor_integrity.py +206 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_scan.py +20 -0
- sidegraph-0.8.0/tests/test_git_config_isolation.py +51 -0
- sidegraph-0.8.0/tests/test_githooks.py +977 -0
- sidegraph-0.8.0/tests/test_graph_freshness.py +552 -0
- sidegraph-0.8.0/tests/test_hook_spawn_guard.py +291 -0
- sidegraph-0.8.0/tests/test_host_agent_state.py +300 -0
- sidegraph-0.8.0/tests/test_host_borrowed_graph.py +288 -0
- sidegraph-0.8.0/tests/test_host_integrity.py +1024 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_pretool.py +6 -6
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_session_start.py +171 -6
- sidegraph-0.8.0/tests/test_host_session_start_concurrent.py +151 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_stop.py +658 -24
- sidegraph-0.8.0/tests/test_host_subdirectory_launch.py +282 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_touch_events.py +1 -1
- sidegraph-0.8.0/tests/test_integrity.py +731 -0
- sidegraph-0.8.0/tests/test_integrity_refresh_hook.py +296 -0
- sidegraph-0.8.0/tests/test_integrity_replay.py +113 -0
- sidegraph-0.8.0/tests/test_integrity_stranded.py +864 -0
- sidegraph-0.8.0/tests/test_member_anchor_wiring.py +320 -0
- sidegraph-0.8.0/tests/test_nearest_anchored.py +59 -0
- sidegraph-0.8.0/tests/test_reader_member_name_lookup.py +193 -0
- sidegraph-0.8.0/tests/test_reader_member_names.py +369 -0
- sidegraph-0.8.0/tests/test_retrieval_guessed.py +442 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_toc.py +180 -3
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_schema_descriptor.py +34 -0
- sidegraph-0.8.0/tests/test_seed_ladder.py +1073 -0
- sidegraph-0.8.0/tests/test_server_borrowed_graph.py +543 -0
- sidegraph-0.8.0/tests/test_server_commit_hint.py +217 -0
- sidegraph-0.8.0/tests/test_server_graph_freshness.py +387 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_graph_path.py +3 -2
- sidegraph-0.8.0/tests/test_server_nearest_anchored.py +731 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_render_events.py +1 -1
- sidegraph-0.8.0/tests/test_server_tolerant_seeds.py +650 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_graph.py +47 -0
- sidegraph-0.8.0/tests/test_stats_health.py +205 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_render.py +139 -2
- sidegraph-0.8.0/tests/test_store_agent_state.py +282 -0
- sidegraph-0.8.0/tests/test_store_binding_index.py +91 -0
- sidegraph-0.8.0/tests/test_store_git_root_symlink.py +355 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_mutation_guard.py +19 -1
- sidegraph-0.8.0/tests/test_store_update_meta_if.py +60 -0
- sidegraph-0.8.0/tests/test_sync_canonical_writes.py +171 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_clean.py +11 -10
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_integration.py +10 -7
- sidegraph-0.8.0/tests/test_sync_moved_adoption.py +708 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_rebind.py +25 -16
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_run.py +11 -8
- sidegraph-0.8.0/tests/test_sync_toc_cache.py +251 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/uv.lock +11 -11
- sidegraph-0.6.0/docs/reference/hooks.md +0 -302
- sidegraph-0.6.0/src/sidegraph/config.py +0 -259
- sidegraph-0.6.0/tests/test_sync_toc_cache.py +0 -125
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.gitignore +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.gitleaks.toml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/.python-version +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/AGENTS.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/LICENSE +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/SECURITY.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/data-model.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/bootstrap.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/installation.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/quickstart.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/releasing.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/__init__.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_config.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doc_import.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_domains.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_importer.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_okf.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_ratify_policy.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_compact_review.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_verify_snapshot.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.6.0 → sidegraph-0.8.0}/tools/check_no_session_links.py +0 -0
|
@@ -7,6 +7,327 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] — 2026-10-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`get_task_context` says where the memory is when your file has none.** A file seed the graph
|
|
15
|
+
lacks, or one that resolved with no current record anchored to it, now gets a `## Nearest anchored`
|
|
16
|
+
sentence naming up to three files that do carry records: the graph neighbours first (the two
|
|
17
|
+
with the most records), then the files under the nearest directory that has any, skipping a
|
|
18
|
+
directory that holds more than a quarter of all anchored files (and more than four) and never
|
|
19
|
+
the repository root.
|
|
20
|
+
When the answer has no decision memory at all, the records of those files follow under `##
|
|
21
|
+
Nearest anchored records (not anchored to your files)`, labelled as not about your files, with
|
|
22
|
+
the same supersede line the main answer carries. An empty answer carries the sentence under `##
|
|
23
|
+
Why this is empty`. At most three seeds get a sentence. The records count as shown in
|
|
24
|
+
`sidegraph-stats`, and the neighbour files are never recorded as seeds. See
|
|
25
|
+
[the tool reference](docs/reference/mcp-tools.md#the-nearest-anchored-records).
|
|
26
|
+
|
|
27
|
+
- **Records that never reach the team are now visible.** A record follows the branch and
|
|
28
|
+
checkout it was written on, and on one field corpus two supersessions sat uncommitted for five
|
|
29
|
+
days and 32 proposals lived only on branches that `main`'s session start never saw. Two new
|
|
30
|
+
checks run at session start. `store-uncommitted` (degraded, with a notice, also in
|
|
31
|
+
`sidegraph-doctor` and `sidegraph-stats`) reports store files nobody committed for a day, aged
|
|
32
|
+
by the ULID in a new file's name (a `git stash` cannot rewrite it) and by the modification time
|
|
33
|
+
otherwise; fully staged files do not count, so `sidegraph-doctor --check` in a pre-commit hook
|
|
34
|
+
never blocks the fixing commit. `branch-only-records` (advisory) scans every unmerged local branch,
|
|
35
|
+
oldest first, for open records the default branch lacks (each counted once, for the newest
|
|
36
|
+
branch that holds it), and sends a notice when such a branch is more than a week old: the fix is
|
|
37
|
+
to merge it. The write tools (`add_decision`,
|
|
38
|
+
`supersede_decision`, `add_fact`, `supersede_fact`, `add_anchors`, `add_domain`,
|
|
39
|
+
`supersede_domain`, and the written elements of `propose_decisions` and `propose_domains`) add a
|
|
40
|
+
`commit_hint` to their result when the store is inside a git repository, except a store that is a
|
|
41
|
+
symlink to a directory outside it: git commits the link, not the records behind it. Where records
|
|
42
|
+
are written does not change. See the
|
|
43
|
+
[troubleshooting guide](docs/guides/troubleshooting.md#store-uncommitted) and the
|
|
44
|
+
[MCP tools reference](docs/reference/mcp-tools.md#commit-hint).
|
|
45
|
+
|
|
46
|
+
- **Sidegraph tells you when it needs attention, not only the model.** One list of integrity
|
|
47
|
+
checks now runs at every session start and in `sidegraph-doctor` and `sidegraph-stats`. The model
|
|
48
|
+
still gets a status line per problem, with the five existing lines unchanged and in the same
|
|
49
|
+
order. Problems that need a person also reach you as a `systemMessage`, which Claude Code shows as
|
|
50
|
+
a warning: at most once a day for each check, again at once when a problem gets worse, and not
|
|
51
|
+
again once the check finds nothing. New checks: a store that cannot be opened (a merge conflict
|
|
52
|
+
left in `.sidegraph/`, a damaged index, a store written by another version) now says so and
|
|
53
|
+
names the fix instead of switching memory off silently; a missing or unreadable code graph;
|
|
54
|
+
open records whose every code anchor is orphaned (degraded, with a notice, when three or more were
|
|
55
|
+
written in the last 14 days; advisory otherwise); and store files the last reload could not
|
|
56
|
+
index. A proposal that has waited 30 days earns a notice too. `sidegraph-doctor` gains an
|
|
57
|
+
`orphaned-record` finding and, with no graph, a skipped-checks line (`"graph"` in `--json`'s
|
|
58
|
+
`skipped`) instead of a finding, so `--check` does not start failing CI jobs that run without
|
|
59
|
+
one. `sidegraph-stats` opens with a `HEALTH` line (`health` in `--json`). The checks, their
|
|
60
|
+
severities and fixes are in the new [troubleshooting guide](docs/guides/troubleshooting.md), and
|
|
61
|
+
the output is in the [hooks reference](docs/reference/hooks.md#notices-for-the-human).
|
|
62
|
+
|
|
63
|
+
- **`sidegraph-init` asks whether to keep the code graph fresh, and installs the hook that does
|
|
64
|
+
it.** A graph nobody rebuilds goes stale, and on one field corpus it fell 314 commits behind
|
|
65
|
+
because the setup hint was printed and skipped. In a terminal, init now asks once (default yes);
|
|
66
|
+
`--hooks` installs without asking, `--no-hooks` declines and records it
|
|
67
|
+
(`git config sidegraph.graphRefresh false`), and `--remove-hooks` takes everything out and exits
|
|
68
|
+
without creating a store (it exits 1, and says the removal was partial, when a hook is a symlink
|
|
69
|
+
or has damaged markers and so keeps its block). The hook is a marked block in `post-commit`, `post-merge` and
|
|
70
|
+
`post-checkout`, inserted right after the shebang line so that a foreign hook that ends in `exit`
|
|
71
|
+
cannot skip it, plus a helper that rebuilds the graph in the background, in the main checkout
|
|
72
|
+
only (a linked worktree reads its graph), one rebuild at a time. It never replaces a hook: one that
|
|
73
|
+
is a symlink, not executable, CRLF or not a shell script is left alone and the line to add by hand
|
|
74
|
+
is printed. With `core.hooksPath` set it writes no hook file and prints the lines instead. Without
|
|
75
|
+
a terminal nothing is written, and a new advisory check, `refresh-hook-missing`, tells the model
|
|
76
|
+
to ask you, and tells you once a day, until the hook is installed or declined. A call you add by hand
|
|
77
|
+
counts only when its hook is executable and the call is not in a comment. The three flags are
|
|
78
|
+
a Committed surface ([stability](docs/reference/stability.md)); see
|
|
79
|
+
[keeping the graph fresh](docs/integrations/graphify.md#keeping-the-graph-fresh-git-hooks) and the
|
|
80
|
+
[troubleshooting guide](docs/guides/troubleshooting.md#refresh-hook-missing).
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
|
|
84
|
+
- **`get_task_context` reads a wrong seed the way you meant it, and an empty answer says why.**
|
|
85
|
+
A seed the graph does not hold as written used to come back as "No context found." Now `./x.py`,
|
|
86
|
+
`x.py:12`, an absolute path inside the repository, a missing or invented directory prefix, a bare
|
|
87
|
+
file name, a directory, and a `Type.member` with no file are read through a short ladder, and a
|
|
88
|
+
`## How your seeds were read` block says what each one became and that a rewrite is a guess. A
|
|
89
|
+
file that exists on disk but not in the graph is never swapped for a namesake. A directory reads
|
|
90
|
+
as up to eight files, or is listed when it holds more than 24. A path that differs from a graph
|
|
91
|
+
file only by letter case reads as that file, even on a case-insensitive filesystem. A path or
|
|
92
|
+
name that could mean several is reported and read as none. Guessed seeds rank in the related
|
|
93
|
+
tier below the seeds you got right. The not-in-graph block now names the normalised path, so
|
|
94
|
+
`./pkg/n.py` gets the stale-or-new advice instead of "check the path". A name with no file that
|
|
95
|
+
matches several symbols is no longer expanded to all of them: it is reported as ambiguous. A call
|
|
96
|
+
with no seeds at all names the accepted domains you can drill into. Telemetry records a rewritten
|
|
97
|
+
path under the path that was read and a directory under its normalised key, and keeps a seed
|
|
98
|
+
whose name starts with `..` that it used to drop. See
|
|
99
|
+
[the tool reference](docs/reference/mcp-tools.md#seeds-are-read-tolerantly).
|
|
100
|
+
|
|
101
|
+
### Fixed
|
|
102
|
+
|
|
103
|
+
- **A symlinked store's capture commit, code drift and refresh-hook check come from the project
|
|
104
|
+
that holds the link.** A store can be a symlink (`.sidegraph -> ../shared/store`). Its records
|
|
105
|
+
are anchored to code in the project that holds the link, but git resolved the link and answered
|
|
106
|
+
for the repository it points into: `provenance.commit` named that repository's `HEAD`, or was
|
|
107
|
+
empty when the target sits in no repository, so the code-drift check passed silently or never
|
|
108
|
+
ran, and the refresh-hook check read the wrong hooks. Capture now stamps the project's `HEAD`
|
|
109
|
+
(empty while the project has no commits), the code-drift check diffs it in the project's
|
|
110
|
+
repository, and the refresh-hook check reads the project's hooks and recorded choice, the ones
|
|
111
|
+
`sidegraph-init` writes. A store that is not a symlink behaves as before, and
|
|
112
|
+
`--against` (`sidegraph-verify`, `sidegraph-doctor`) still diffs the history of the repository
|
|
113
|
+
that holds the store's files. Three behaviour changes come with it. A store directory that is itself a repository or
|
|
114
|
+
submodule inside another repository now stamps the enclosing project's `HEAD` and measures drift
|
|
115
|
+
there, and its refresh-hook check now runs against the enclosing project; a top-level store
|
|
116
|
+
repository with no enclosing one is unchanged. A record stamped before the fix with the link
|
|
117
|
+
target's (or the nested repository's) `HEAD` now gets `sidegraph-doctor`'s existing
|
|
118
|
+
`code-drift: git unavailable — check skipped` note for that commit, where it used to pass
|
|
119
|
+
silently. And the records of a symlinked store now match in git-bindings rule (a) and in
|
|
120
|
+
`sidegraph-blame`, which read `provenance.commit`. See [the store
|
|
121
|
+
format](docs/reference/store-format.md).
|
|
122
|
+
|
|
123
|
+
### Security
|
|
124
|
+
|
|
125
|
+
- **The lockfile moves `PyJWT` from 2.13.0 to 2.15.1 and `virtualenv` from 21.7.0 to
|
|
126
|
+
21.14.4.** The PyJWT 2.14.0 and 2.15.0 fixes cover one critical advisory (an asymmetric
|
|
127
|
+
PEM key with mutated whitespace skips the HMAC key-confusion guard), five high ones (key
|
|
128
|
+
material accepted as HMAC secrets, JWKS redirects, a BOM bypass) and several moderate
|
|
129
|
+
ones. The virtualenv fixes cover seed wheels that were not integrity-checked and
|
|
130
|
+
activation scripts that run commands embedded in a path or a prompt. PyJWT reaches Sidegraph only
|
|
131
|
+
through the MCP SDK's `crypto` extra, and Sidegraph never decodes a token; virtualenv is
|
|
132
|
+
a development dependency through pre-commit. The published package pins neither, so this
|
|
133
|
+
changes development and CI environments and installs made from `uv.lock`; a fresh install
|
|
134
|
+
already resolves fixed versions.
|
|
135
|
+
|
|
136
|
+
## [0.7.0] — 2026-10-02
|
|
137
|
+
|
|
138
|
+
### Changed
|
|
139
|
+
|
|
140
|
+
- **The hooks and the MCP server look a missing relative store up inside the repository.** The
|
|
141
|
+
precedence between `--db`, `SIDEGRAPH_DIR`, `SIDEGRAPH_DB` and the default is unchanged, and a
|
|
142
|
+
store that exists where its relative path is anchored still wins. What is new: when a relative
|
|
143
|
+
`SIDEGRAPH_DIR` (or the default `.sidegraph`) does not exist there, the three hooks and the MCP
|
|
144
|
+
server visit the parent directories, nearest first, up to and including the repository root (the
|
|
145
|
+
nearest directory holding a `.git` entry, a directory or a file), and use the first store found.
|
|
146
|
+
The lookup never leaves the repository (a `.git` entry at your home directory or above it is not
|
|
147
|
+
a repository root, so a dotfiles repository does not turn `~/.sidegraph` into every project's
|
|
148
|
+
store) and does not run for `--db`, an absolute `SIDEGRAPH_DIR`, `SIDEGRAPH_DB`, a value with a
|
|
149
|
+
`..` part, or an anchor that is a symlink. The CLI, `sidegraph-init`
|
|
150
|
+
and `sidegraph-bootstrap` are unchanged: from a subdirectory they still need `--db`. To keep the
|
|
151
|
+
old outcome on a host surface, pass an absolute `SIDEGRAPH_DIR`.
|
|
152
|
+
|
|
153
|
+
### Fixed
|
|
154
|
+
|
|
155
|
+
- **A SessionStart hook registered twice on one host no longer injects the map twice.** Two
|
|
156
|
+
copies firing for one session at once both read the old duplicate-check ledger and both emitted;
|
|
157
|
+
the check now decides and stamps inside one write transaction, and a duplicate still answers
|
|
158
|
+
without waiting for a lock. The ledger keeps one row, so a repeat is still let through when
|
|
159
|
+
another session starts in between, or when two sessions with doubled hooks start together.
|
|
160
|
+
- **Sync's moved rung adopts only a real move.** When an anchor's file is gone, sync looks the
|
|
161
|
+
name up across the whole graph and follows a unique hit to its new file. That lookup ignores
|
|
162
|
+
case and decoration, and the check behind it (the old path is out of `HEAD`, the new one is in
|
|
163
|
+
it) did not ask whether the new path was there before. A type deleted together with its file
|
|
164
|
+
could therefore be re-anchored onto an unrelated file that held an old member of the same name:
|
|
165
|
+
a deleted `Priority` followed `.priority` into another file, silently rewriting the entity's
|
|
166
|
+
committed `descriptor.file_path`. Two rules now close it. The hit must be the same name once
|
|
167
|
+
the call decoration (`()`, a leading `.`) is stripped from both sides, with case kept. And git
|
|
168
|
+
must show the new path arriving in the change that removed the old one: the mainline commit that
|
|
169
|
+
deleted the old path (a branch merged with `--no-ff` counts as one change) must have a first
|
|
170
|
+
parent without the new path and must hold it itself. With `SIDEGRAPH_TRUST_DIRTY_TREE=on` and the
|
|
171
|
+
old path still in `HEAD`, the new path must be absent from `HEAD`. Every git failure refuses, as
|
|
172
|
+
does a history with no deletion in it, so a move out of a path git never held (a gitignored
|
|
173
|
+
directory) and a move that a shallow clone cannot prove now end `orphaned`, which
|
|
174
|
+
`sidegraph:heal-anchors` repairs, instead of being adopted. An uncommitted delete onto a path
|
|
175
|
+
that is already in `HEAD` is `orphaned` too, not remembered as a move waiting for a commit: no
|
|
176
|
+
commit can make it one. The search matches the old path literally (a path such as
|
|
177
|
+
`app/[id]/view.tsx` is not a glob) and ignores `log.showSignature`.
|
|
178
|
+
|
|
179
|
+
Some real moves are refused as well, because git's history alone does not show them as one
|
|
180
|
+
change. Each ends `orphaned` and `sidegraph:heal-anchors` re-anchors it:
|
|
181
|
+
- the new file added in one commit and the old one deleted in another on the first-parent line,
|
|
182
|
+
including a branch merged fast-forward or rebase-merged;
|
|
183
|
+
- a second move before any sync ran (`A` to `B` to `C` while the descriptor still names `A`);
|
|
184
|
+
- an old path that was re-added and then deleted again.
|
|
185
|
+
|
|
186
|
+
To check what an earlier release adopted, list the descriptor rewrites:
|
|
187
|
+
`git log -p --diff-filter=M -- .sidegraph/entities/ | grep -E '^(commit |[-+]\s+"file_path")'`.
|
|
188
|
+
A rewrite is a real move only if the new path was added by the commit that deleted the old one
|
|
189
|
+
(`git log --first-parent -m -1 --diff-filter=D -- <old path>` finds that commit; the new path
|
|
190
|
+
must be missing from its first parent and present in it). Re-anchor a wrong one by superseding
|
|
191
|
+
the record with fresh anchors.
|
|
192
|
+
|
|
193
|
+
- **The `SessionStart` instruction names a call the tool accepts, and a domain's mistake count
|
|
194
|
+
counts what the domain holds.** The standing line told the agent to call
|
|
195
|
+
`get_task_context(seeds)`, but the tool takes `files` and `entities` and rejects anything else,
|
|
196
|
+
so an agent that followed it made a call that failed validation. It now says
|
|
197
|
+
`get_task_context(files=[…])` with repo-relative paths, points at the check-plan skill before a
|
|
198
|
+
non-trivial change when it is available, and says to load the tool first if the host lists it
|
|
199
|
+
only by name. Separately, the per-domain count in the `SessionStart` map read "0 mistake(s)"
|
|
200
|
+
over a domain whose gotchas were anchored to its own code, because it counted only decisions
|
|
201
|
+
tagged to the domain itself. It now counts the accepted `gotcha`, `lesson` and `constraint`
|
|
202
|
+
decisions that `drill_down` serves for the domain, so the two show one number. The map's cache
|
|
203
|
+
records the store's digest, so a retrieval call on an unchanged store no longer rebuilds it, and
|
|
204
|
+
`SessionStart` reads the unratified list without building the whole map. The bindings table gains
|
|
205
|
+
an index by entity (an existing store gets it on its next open), which takes a rebuild of the map
|
|
206
|
+
from about 0.1 s to under 0.03 s on a real store, so the cost of a session start is what it was
|
|
207
|
+
before the count changed, also right after a store change and in a linked worktree. A worktree
|
|
208
|
+
builds its map with the main checkout's graph reader, so it counts the same decisions the main
|
|
209
|
+
checkout does. A map written by a path that has no graph reader (ratify, capture) leaves out
|
|
210
|
+
decisions anchored to a whole document until the next sync.
|
|
211
|
+
|
|
212
|
+
- **A Claude Code subagent gets its own read nudges, and its touches are told apart.** A
|
|
213
|
+
subagent's hook payload carries its parent's session id plus an `agent_id` of its own, and
|
|
214
|
+
the `PreToolUse` nudge keys were per session: once the main agent had been nudged, every
|
|
215
|
+
subagent it started read anchored files blind. Each agent, the session's own and every
|
|
216
|
+
subagent, now gets one generic and one path-specific nudge. The
|
|
217
|
+
keys are claimed in a single statement, so a subagent's parallel opening reads cannot both
|
|
218
|
+
nudge, and `SessionStart` expires keys older than 30 days. The `retrieval_events` journal
|
|
219
|
+
gains a nullable `agent` column, added to an existing index on its next open, that records
|
|
220
|
+
which subagent made a touch; the row stays under the parent's session, so `sidegraph-stats`
|
|
221
|
+
counts the same sessions as before. Only `agent_id` counts, never `agent_type`: a main
|
|
222
|
+
session started with `claude --agent <name>` is still the session's own agent.
|
|
223
|
+
|
|
224
|
+
- **An anchor written `Type.member` now resolves to the member.** Graphify labels a method
|
|
225
|
+
`.playClip()` and links it to its type, an agent writes `AudioPlayback.playClip`, and the two
|
|
226
|
+
never met: the anchor was born orphaned, and a seed naming it never reached the record, which
|
|
227
|
+
surfaced only through its community, as an unratified proposal. With a `file_path`, a name
|
|
228
|
+
with no exact match now falls back to a member of the named type in that file. It is for code
|
|
229
|
+
identifiers only (prose, a numbered heading or a hyphenated file name never reads as a
|
|
230
|
+
member). The name is split at the last `.`, `::` or `#` and the member is compared with its
|
|
231
|
+
case kept. A candidate that an edge ties to a different type is refused, and the answer stays
|
|
232
|
+
orphaned, never guessed, when several remain or when the file holds a case-only twin of the
|
|
233
|
+
member (a struct `Message` beside a method `.message()`, which the store treats as one
|
|
234
|
+
anchor). Without a file, and for a path-qualified name (`src/pkg/mod.py`), nothing changes.
|
|
235
|
+
On the read path a seed that names a stored anchor, and every node a seed resolves to, now
|
|
236
|
+
map to their store entities by the engine mapping, in the neighbour walk as well, so such a
|
|
237
|
+
record ranks as a mistake or decision again. The first `sidegraph-sync` after the upgrade
|
|
238
|
+
reruns once on its own (the sync stamp now carries a resolver revision, which a report does
|
|
239
|
+
not show) and heals the orphans this left behind. The skills and guides no longer say
|
|
240
|
+
`Type.member` names never resolve; the bare name with its file stays the preferred form.
|
|
241
|
+
|
|
242
|
+
- **A hook command that cannot start no longer blocks or loops the host.** On `Stop`, both hosts
|
|
243
|
+
feed a hook's stderr back when the hook exits 2: Codex continues the turn, and Claude Code
|
|
244
|
+
continues the conversation, and Claude Code also blocks the tool call on `PreToolUse`. `uv`
|
|
245
|
+
exits 2 on some of its own errors (a project it cannot find, a cache it cannot write) and `dash`
|
|
246
|
+
exits 2 when the `cd` fails, so a hook command that never reached Python could do exactly that,
|
|
247
|
+
over and over in a headless `codex exec` run. Every shipped hook command, in both plugins and in
|
|
248
|
+
the manual recipes in the docs, now ends with a guard: `Stop` and `PreToolUse` answer `{}`, and
|
|
249
|
+
`SessionStart` answers a one-line `systemMessage` that says the hook could not start and to run
|
|
250
|
+
the hook command in a terminal to see the error. A command that starts Python behaves as
|
|
251
|
+
before. **Codex users: approve the two hooks again once after updating.** Codex records trust
|
|
252
|
+
per hook definition and the definition includes its command, so the changed commands do not run
|
|
253
|
+
until you approve them in `/hooks` or at the next interactive session's trust prompt. **If you
|
|
254
|
+
wired the hooks by hand**, append the guard to your own commands in `.claude/settings.json` or
|
|
255
|
+
`.codex/hooks.json`; the recipes in the docs show it. The Codex page also now says how to run a
|
|
256
|
+
headless review without Sidegraph's hooks.
|
|
257
|
+
- **The capture nudge now arms on Codex.** The Stop hook's substance gate understood only Claude
|
|
258
|
+
Code transcripts, so on a Codex rollout it counted zero prompts and never nudged: every Codex
|
|
259
|
+
session ended without the capture reminder. The gate now reads a rollout too. A person's prompt
|
|
260
|
+
is a user message that is not text Codex wrote itself (the project instructions and environment
|
|
261
|
+
blocks, plugin and skill blocks, an aborted-turn note, a Stop hook's own block reason fed back);
|
|
262
|
+
nor does an answer to the agent's question, which arrives mid-turn, count as one. Each prompt
|
|
263
|
+
counts once although Codex mirrors it as an event. A thread arms after two real prompts, never
|
|
264
|
+
on tool calls. Subagent threads, Codex's automatic reviewer and headless `codex exec` runs, including
|
|
265
|
+
ones started through the Codex TypeScript SDK, never arm, so a review panel's `-o` output is
|
|
266
|
+
never replaced by a continuation. The nudge text, the once-per-session ledger and the hook
|
|
267
|
+
definitions are unchanged, so Codex's trust in the installed hooks stays valid. Claude Code
|
|
268
|
+
sessions are counted exactly as before.
|
|
269
|
+
- **A session started in a subdirectory no longer opens a second, empty store.** Claude Code sets
|
|
270
|
+
`CLAUDE_PROJECT_DIR` to the directory it was launched in, so a launch in `repo/pkg` with the
|
|
271
|
+
plugin active created `repo/pkg/.sidegraph` beside the repository's own store, and the session
|
|
272
|
+
saw no memory. The hooks and the MCP server now use `repo/.sidegraph`, record touches relative
|
|
273
|
+
to it (`pkg/a.py`, so they join the anchors) and keep the nested-store case (`.config/sidegraph`)
|
|
274
|
+
repo-relative. The hooks also read the graph the store's project holds, as the CLI and the MCP
|
|
275
|
+
server do, so a store in a nested directory finds its own `graphify-out/graph.json`; a relative
|
|
276
|
+
`SIDEGRAPH_GRAPH` is no longer looked up under `$CLAUDE_PROJECT_DIR`. A store the old behaviour
|
|
277
|
+
already created is not touched: when the store a session uses is empty and the repository's
|
|
278
|
+
store above it holds records, `SessionStart` adds one line naming both. Remove the empty
|
|
279
|
+
`<subdirectory>/.sidegraph` to use the repository's. A stray store that holds any record (one
|
|
280
|
+
proposed decision from an old capture is enough) is not reported and keeps hiding the
|
|
281
|
+
repository's: review it with `sidegraph-ratify --db <subdirectory>/.sidegraph`, record what
|
|
282
|
+
matters again in the repository's store, then remove the stray directory.
|
|
283
|
+
|
|
284
|
+
- **A code graph that never caught up with `HEAD` now says so.** Nothing compared the commit
|
|
285
|
+
`graph.json` was built at (`built_at_commit`) with `HEAD`, so a graph stuck at an old commit
|
|
286
|
+
looked up to date for good, and every `get_task_context` call seeded with a file added since
|
|
287
|
+
returned a bare `No context found.` The comparison now runs in the engine reader and counts a
|
|
288
|
+
graph as stale only when a file it should hold changed or appeared since the build (a commit
|
|
289
|
+
touching only file types the graph does not hold does not, and a graph built from a dirty tree
|
|
290
|
+
and committed afterwards does not). It surfaces in four places:
|
|
291
|
+
- `SessionStart` adds one line when the graph is stale, with the rebuild command
|
|
292
|
+
(`graphify update .` from the repository root);
|
|
293
|
+
- `get_task_context` appends a `## Not in the code graph` block after its answer when a seed is
|
|
294
|
+
not a file the graph holds, saying whether the graph is stale, shows no committed change since
|
|
295
|
+
its build (the file may be newer than the build, or one the engine skips) or could not be
|
|
296
|
+
compared, or whether the path is a directory, missing or not a normalized repo-relative path
|
|
297
|
+
(an absolute path, `./x`). Seeds the graph holds leave the answer byte-identical and cost no git call;
|
|
298
|
+
- `sidegraph-doctor` reports a new advisory finding, `graph-stale`. **`sidegraph-doctor --check`
|
|
299
|
+
now exits `2` on a stale graph**; a CI job that rebuilds the graph before running doctor is
|
|
300
|
+
unaffected;
|
|
301
|
+
- `sidegraph-stats` adds a `stale:` continuation line under the GRAPH counts, and its `--json`
|
|
302
|
+
gains `graph.freshness`, `built_at`, `commits_behind` and `stale_files`.
|
|
303
|
+
|
|
304
|
+
The docs no longer call a missed refresh "self-healing": the lazy check re-syncs a graph that
|
|
305
|
+
was rebuilt, and only a rebuild fixes one that never was.
|
|
306
|
+
|
|
307
|
+
- **A linked worktree reads the main checkout's code graph, and a missing graph is said.**
|
|
308
|
+
`graphify-out/` is gitignored, so a `git worktree add` checkout had the tracked store and no
|
|
309
|
+
graph, and `get_task_context` resolved nothing there. When the store's own graph is missing and
|
|
310
|
+
its repository is a linked worktree of a main checkout, the read tools (`get_task_context`,
|
|
311
|
+
`query_structure`, `query_decisions`, `drill_down`) and `SessionStart` now open the main
|
|
312
|
+
checkout's graph, found from the worktree's `.git` file alone (no git call). That graph is synced
|
|
313
|
+
index-only: a worktree's index starts cold, and without the derived state (domain communities,
|
|
314
|
+
community bindings, engine mappings) `drill_down` lost most of a domain's decisions and
|
|
315
|
+
`get_task_context` its `## Related` section. The sync never rewrites a tracked file (its moved
|
|
316
|
+
rung, the one step that can, abstains), so the worktree's store stays as git checked it out.
|
|
317
|
+
`SessionStart` builds the domain map in memory from the store, adds a line saying whose graph it
|
|
318
|
+
reads, and names the main checkout in its stale-graph line. `get_task_context` tells a file that
|
|
319
|
+
exists only on the branch apart from one the main checkout's graph is stale for. A file the
|
|
320
|
+
branch changed that the main checkout also has is described as it is in the main checkout (its
|
|
321
|
+
symbols and the edges between them), and nothing warns about it.
|
|
322
|
+
`sync_anchors`, `list_domain_candidates`, every write tool and every CLI default keep reading the
|
|
323
|
+
store's own graph. A bare repository (also one cloned into `x/.git`), a git directory that is
|
|
324
|
+
separate and not itself named `.git`, a submodule and a plain `git clone` have no main checkout
|
|
325
|
+
to borrow from.
|
|
326
|
+
- **`get_task_context` says when there is no code graph at all.** With no reader and at least one
|
|
327
|
+
seed, the answer ends with a `## No code graph` block naming the path that was looked at and
|
|
328
|
+
how to build it, instead of an answer that looked like a search with no hits. A graph that is
|
|
329
|
+
there and cannot be read is reported as not readable, not as missing.
|
|
330
|
+
|
|
10
331
|
## [0.6.0] — 2026-10-01
|
|
11
332
|
|
|
12
333
|
### 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.8.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.8.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
|
|
@@ -167,7 +167,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
167
167
|
next session ◀── SessionStart TOC anchored to entities in the
|
|
168
168
|
of named domains ◀── get_task_context ◀────── engine's graph (read-only);
|
|
169
169
|
mistakes first drill_down re-anchored after refactors
|
|
170
|
-
blind Read/Grep ──▶ nudged back to get_task_context (each form once per
|
|
170
|
+
blind Read/Grep ──▶ nudged back to get_task_context (each form once per agent)
|
|
171
171
|
```
|
|
172
172
|
|
|
173
173
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
@@ -139,7 +139,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
139
139
|
next session ◀── SessionStart TOC anchored to entities in the
|
|
140
140
|
of named domains ◀── get_task_context ◀────── engine's graph (read-only);
|
|
141
141
|
mistakes first drill_down re-anchored after refactors
|
|
142
|
-
blind Read/Grep ──▶ nudged back to get_task_context (each form once per
|
|
142
|
+
blind Read/Grep ──▶ nudged back to get_task_context (each form once per agent)
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
@@ -25,6 +25,7 @@ If the repository already has ADRs or specs, use the
|
|
|
25
25
|
## Operate and maintain it
|
|
26
26
|
|
|
27
27
|
- [Survive refactors and heal anchors](guides/surviving-refactors.md).
|
|
28
|
+
- [Read what Sidegraph tells you when it needs attention](guides/troubleshooting.md).
|
|
28
29
|
- [Run CI and scheduled maintenance](guides/ci-cd-maintenance.md).
|
|
29
30
|
- [Import decision-shaped documents](guides/semantic-docs.md).
|
|
30
31
|
- [See runtime cost and operational boundaries](reference/operations.md).
|
|
@@ -15,6 +15,22 @@ enclosing-module info, so `name` + `file_path` is all identity has to work with.
|
|
|
15
15
|
(lowercase, strip a leading `.`, drop call-decoration like `()`), so `.foo()` in a decision's
|
|
16
16
|
anchor matches the graph node named `foo`.
|
|
17
17
|
|
|
18
|
+
**`Type.member` names.** Graphify labels a method `.foo()` and links it to its type with a
|
|
19
|
+
`method` edge (an enum case with `case_of`), so a name written `Type.foo` has no exact match.
|
|
20
|
+
When none is found and the descriptor has a `file_path`, `resolve()` falls back to the member.
|
|
21
|
+
It is for code identifiers only: the owner (its last segment, so `Outer.Inner.foo` reads as
|
|
22
|
+
`Inner`) and the member must both be identifiers, and the candidate must be a `code` node, so
|
|
23
|
+
prose with a dot in it, a numbered heading or `verify-release.sh` never reads as a member.
|
|
24
|
+
The name is split at its last `.`, `::` or `#`, the node in that file whose label is the member
|
|
25
|
+
is found (case kept), a candidate the graph ties to a different type is rejected, and, of
|
|
26
|
+
several, those tied to the named type are kept. Anything that does not narrow to exactly one
|
|
27
|
+
node is `unresolved`, the orphaned, healable leaf a bare miss has always been, never
|
|
28
|
+
`ambiguous`. So is a name with a case-only twin in the file (a struct `Message` beside a
|
|
29
|
+
method `.message()`): the store dedups an anchor by its lowercased name, so the two spellings
|
|
30
|
+
are one entity, and binding either node would put the other's record on it. Without a file the
|
|
31
|
+
fallback never runs, and a path-qualified name (`src/pkg/mod.py`, which reads as the member
|
|
32
|
+
`py`) still never resolves.
|
|
33
|
+
|
|
18
34
|
## Lazy `Entity` creation
|
|
19
35
|
|
|
20
36
|
An `Entity` is created the first time a decision references it — via
|
|
@@ -121,8 +137,8 @@ node and a file node are both just nodes.
|
|
|
121
137
|
The same pattern applies to `concept` nodes from the semantic pass: a concept has no stable id
|
|
122
138
|
either, so **anchor concept + file together**, not the concept alone. Re-extracting an edited
|
|
123
139
|
file can rename or drop the concepts inside it — the same churn a code refactor causes to
|
|
124
|
-
symbol names — and the rebind ladder below handles it identically: exact match, then unique
|
|
125
|
-
name
|
|
140
|
+
symbol names — and the rebind ladder below handles it identically: exact match, then a unique
|
|
141
|
+
same-name match in a file that arrived with the old one's removal, then orphaned. No special-casing for concepts versus code symbols.
|
|
126
142
|
|
|
127
143
|
## What happens on rename or move
|
|
128
144
|
|
|
@@ -137,10 +153,13 @@ remembered under `pending_uncommitted_moves` are still re-verified once `HEAD` h
|
|
|
137
153
|
re-pointing](../guides/surviving-refactors.md#community-re-pointing)).
|
|
138
154
|
2. **Ambiguous** — leaf bindings flip to `degraded`; the node mapping is left untouched
|
|
139
155
|
(never guess); community is re-pointed if a shared one is still resolvable.
|
|
140
|
-
3. **Moved** — exact fails but a name-only retry resolves uniquely, *and* the
|
|
141
|
-
|
|
142
|
-
*and* the
|
|
143
|
-
`
|
|
156
|
+
3. **Moved** — exact fails but a name-only retry resolves uniquely, *and* the hit is the
|
|
157
|
+
same name (decoration such as `()` or a leading `.` stripped from both sides, **case
|
|
158
|
+
kept**), *and* the new file has the same suffix as the old `descriptor.file_path` (e.g.
|
|
159
|
+
`.py` -> `.py`, `.md` -> `.md`), *and* the old `file_path` is confirmed gone from the
|
|
160
|
+
checkout, *and* git's history shows the new file arriving in the same change that
|
|
161
|
+
removed the old one -> `descriptor.file_path` is updated to follow the file, leaf
|
|
162
|
+
bindings heal to `live`.
|
|
144
163
|
**Suffix guard:** a unique name-only hit whose file suffix *differs* from the old one
|
|
145
164
|
(e.g. a vanished code symbol whose name happens to collide with a doc heading) is a
|
|
146
165
|
**collision, not a move** — it is never adopted, and falls through to orphaned instead.
|
|
@@ -148,6 +167,15 @@ remembered under `pending_uncommitted_moves` are still re-verified once `HEAD` h
|
|
|
148
167
|
still there — a symbol renamed *inside* a surviving file is not a move, however unique
|
|
149
168
|
the name-only hit elsewhere looks, and "can't verify" counts as "still there" (see [why
|
|
150
169
|
`moved` checks the disk](../guides/surviving-refactors.md#why-moved-checks-the-disk)).
|
|
170
|
+
**Name guard:** the name-only lookup ignores case, so a deleted type `Priority` can find
|
|
171
|
+
an old member `.priority` in an unrelated file. That is a different symbol, not a move,
|
|
172
|
+
and is never adopted. **Arrival guard:** a new path that already existed before the old
|
|
173
|
+
one was removed is a collision, not a move. So is an old path git cannot account for
|
|
174
|
+
(never committed, or beyond the history a shallow clone holds): any git answer that is
|
|
175
|
+
not a clear yes refuses. A refused move falls through to orphaned, which
|
|
176
|
+
`sidegraph:heal-anchors` repairs.
|
|
177
|
+
This rung resolves by name only, so a `Type.member` anchor cannot follow its file being
|
|
178
|
+
moved; the bare member name can.
|
|
151
179
|
4. **Orphaned** — nothing resolves; leaf bindings flip to `orphaned`. Sync still tries to
|
|
152
180
|
derive the entity's current community from its surviving file's nodes (useful when a
|
|
153
181
|
symbol renamed but its file didn't move); that derivation only happens when the file's
|
|
@@ -39,19 +39,19 @@ that suffices:
|
|
|
39
39
|
summary, a mistake count, and a subdomain count (see
|
|
40
40
|
[retrieval](retrieval.md#sessionstart-toc)). This is what an agent reads before touching
|
|
41
41
|
anything — "what areas does this project have, and what should I already know about each."
|
|
42
|
-
The mistake count is
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
The mistake count is what `drill_down` would serve for the domain: the accepted `gotcha`,
|
|
43
|
+
`lesson` and `constraint` decisions in the union described under `drill_down` below, so a
|
|
44
|
+
gotcha anchored to a leaf entity that lives in the domain is counted too. Proposed and
|
|
45
|
+
superseded records are not.
|
|
46
46
|
2. **`drill_down(domain_slug)`** — walk one domain: its full summary, its accepted subdomains,
|
|
47
47
|
a capped sample of the code/doc entities that currently belong to it, and the decisions
|
|
48
|
-
about it (mistakes first).
|
|
49
|
-
|
|
48
|
+
about it (mistakes first). Its `decisions` list is the **union** of decisions tagged
|
|
49
|
+
directly to the `domain:<slug>` entity,
|
|
50
50
|
decisions anchored to any code/doc entity that lives in one of the domain's communities
|
|
51
51
|
(a community-membership join, deduplicated), and decisions anchored to a whole *document*
|
|
52
52
|
entity whose file_path is one of the domain's covered files — so a gotcha anchored to a leaf
|
|
53
53
|
entity in the domain, or an imported ADR that anchored to a doc rather than the domain
|
|
54
|
-
abstraction, *does* surface here
|
|
54
|
+
abstraction, *does* surface here, and is counted in the TOC. The document branch
|
|
55
55
|
matters specifically on doc corpora: `sidegraph-import --docs` anchors an ADR to the
|
|
56
56
|
document's own file-level node, but Graphify clusters every doc file-level node into one hub
|
|
57
57
|
community, so that node's community is essentially never among the domain's `communities`
|