sidegraph 0.7.0__tar.gz → 0.9.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.7.0 → sidegraph-0.9.0}/CHANGELOG.md +346 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/CLAUDE.md +6 -3
- {sidegraph-0.7.0 → sidegraph-0.9.0}/PKG-INFO +5 -3
- {sidegraph-0.7.0 → sidegraph-0.9.0}/README.md +2 -2
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/README.md +1 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/concepts/data-model.md +1 -1
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/concepts/retrieval.md +14 -4
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/getting-started/bootstrap.md +1 -1
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/getting-started/claude-code-setup.md +89 -14
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/getting-started/codex-setup.md +25 -9
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/getting-started/installation.md +19 -8
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/getting-started/quickstart.md +9 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/retrieval-in-sessions.md +21 -9
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/semantic-docs.md +2 -1
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/team-workflow.md +22 -0
- sidegraph-0.9.0/docs/guides/troubleshooting.md +327 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/integrations/claude-code.md +91 -31
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/integrations/codex.md +46 -14
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/integrations/graphify.md +87 -32
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/llms.txt +3 -2
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/cli.md +108 -19
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/configuration.md +10 -8
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/git-bindings.md +5 -3
- sidegraph-0.9.0/docs/reference/hooks.md +928 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/mcp-tools.md +162 -18
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/operations.md +15 -8
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/releasing.md +5 -3
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/stability.md +5 -4
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/reference/store-format.md +45 -10
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- sidegraph-0.9.0/plugin/sidegraph/codex/hooks.json +34 -0
- sidegraph-0.9.0/plugin/sidegraph/hooks/hooks.json +79 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-decision/SKILL.md +1 -1
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-fact/SKILL.md +4 -3
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/setup/SKILL.md +25 -9
- {sidegraph-0.7.0 → sidegraph-0.9.0}/pyproject.toml +6 -1
- sidegraph-0.9.0/src/sidegraph/__init__.py +76 -0
- sidegraph-0.9.0/src/sidegraph/bash_paths.py +553 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/integrations.py +11 -2
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/capture.py +21 -22
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/cli.py +342 -12
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/config.py +2 -2
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/doctor.py +152 -53
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/engine/reader.py +48 -0
- sidegraph-0.9.0/src/sidegraph/githooks.py +556 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/host/claude_settings.py +137 -0
- sidegraph-0.9.0/src/sidegraph/host/hooks.py +1896 -0
- sidegraph-0.9.0/src/sidegraph/host/launch.py +106 -0
- sidegraph-0.9.0/src/sidegraph/host/subagent.py +100 -0
- sidegraph-0.9.0/src/sidegraph/hot_index.py +321 -0
- sidegraph-0.9.0/src/sidegraph/integrity.py +1106 -0
- sidegraph-0.9.0/src/sidegraph/nearest_anchored.py +305 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/retrieval.py +101 -68
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/schema.py +4 -29
- sidegraph-0.9.0/src/sidegraph/seed_ladder.py +604 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/server.py +357 -81
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/stats/model.py +62 -8
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/stats/render.py +20 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/store.py +307 -144
- sidegraph-0.9.0/src/sidegraph/store_layout.py +191 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/sync.py +6 -5
- sidegraph-0.9.0/src/sidegraph/text_paths.py +176 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/verify.py +77 -17
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/conftest.py +19 -0
- sidegraph-0.9.0/tests/githooks_support.py +194 -0
- sidegraph-0.9.0/tests/test_agent_brief_manifests.py +79 -0
- sidegraph-0.9.0/tests/test_bash_paths.py +336 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_integrations.py +64 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_compact.py +32 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_doctor.py +20 -2
- sidegraph-0.9.0/tests/test_cli_init_hooks.py +598 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_codex_plugin.py +3 -3
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor.py +33 -0
- sidegraph-0.9.0/tests/test_doctor_integrity.py +206 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_scan.py +20 -0
- sidegraph-0.9.0/tests/test_git_config_isolation.py +51 -0
- sidegraph-0.9.0/tests/test_githooks.py +977 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_hook_spawn_guard.py +15 -12
- sidegraph-0.9.0/tests/test_host_agent_brief.py +490 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_agent_state.py +48 -42
- sidegraph-0.9.0/tests/test_host_integrity.py +1063 -0
- sidegraph-0.9.0/tests/test_host_launch.py +331 -0
- sidegraph-0.9.0/tests/test_host_pretool.py +372 -0
- sidegraph-0.9.0/tests/test_host_pretool_records.py +771 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_stop.py +141 -2
- sidegraph-0.9.0/tests/test_host_subagent_start.py +304 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_subdirectory_launch.py +4 -2
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_touch_events.py +16 -2
- sidegraph-0.9.0/tests/test_host_wiring_checks.py +719 -0
- sidegraph-0.9.0/tests/test_hot_index.py +642 -0
- sidegraph-0.9.0/tests/test_hot_index_hook.py +173 -0
- sidegraph-0.9.0/tests/test_hot_path_imports.py +319 -0
- sidegraph-0.9.0/tests/test_integrity.py +766 -0
- sidegraph-0.9.0/tests/test_integrity_refresh_hook.py +296 -0
- sidegraph-0.9.0/tests/test_integrity_replay.py +113 -0
- sidegraph-0.9.0/tests/test_integrity_stranded.py +864 -0
- sidegraph-0.9.0/tests/test_lazy_root.py +49 -0
- sidegraph-0.9.0/tests/test_nearest_anchored.py +59 -0
- sidegraph-0.9.0/tests/test_public_hook_launch.py +445 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_ratify_policy.py +21 -13
- sidegraph-0.9.0/tests/test_reader_member_name_lookup.py +193 -0
- sidegraph-0.9.0/tests/test_retrieval_guessed.py +442 -0
- sidegraph-0.9.0/tests/test_seed_ladder.py +1073 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_add_anchors.py +27 -0
- sidegraph-0.9.0/tests/test_server_commit_hint.py +217 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_graph_freshness.py +32 -18
- sidegraph-0.9.0/tests/test_server_nearest_anchored.py +731 -0
- sidegraph-0.9.0/tests/test_server_refresh.py +208 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_supersede.py +82 -1
- sidegraph-0.9.0/tests/test_server_tolerant_seeds.py +650 -0
- sidegraph-0.9.0/tests/test_stats_health.py +205 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_stats_render.py +42 -2
- sidegraph-0.9.0/tests/test_stop_hot_path.py +80 -0
- sidegraph-0.9.0/tests/test_stop_rearm.py +505 -0
- sidegraph-0.9.0/tests/test_store_bad_file.py +590 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_compact_review.py +5 -2
- sidegraph-0.9.0/tests/test_store_git_root_symlink.py +355 -0
- sidegraph-0.9.0/tests/test_subagent_start_manifests.py +62 -0
- sidegraph-0.9.0/tests/test_text_paths.py +414 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_verify_snapshot.py +166 -1
- {sidegraph-0.7.0 → sidegraph-0.9.0}/uv.lock +15 -11
- sidegraph-0.7.0/docs/reference/hooks.md +0 -454
- sidegraph-0.7.0/plugin/sidegraph/codex/hooks.json +0 -24
- sidegraph-0.7.0/plugin/sidegraph/hooks/hooks.json +0 -35
- sidegraph-0.7.0/src/sidegraph/__init__.py +0 -37
- sidegraph-0.7.0/src/sidegraph/host/hooks.py +0 -1174
- sidegraph-0.7.0/tests/test_host_pretool.py +0 -379
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.gitignore +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.gitleaks.toml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/.python-version +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/AGENTS.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/LICENSE +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/SECURITY.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/capturing-decisions.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_config.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doc_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_importer.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_okf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.9.0}/tools/check_no_session_links.py +0 -0
|
@@ -7,6 +7,352 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.0] — 2026-10-04
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Host wiring that silently switched memory off is now visible.** Two field failures went
|
|
15
|
+
unnoticed for weeks: hooks that ran an old install under a newer plugin, and sessions started in
|
|
16
|
+
a subdirectory where the plugin was off. `SessionStart` now prints `Sidegraph <version>` right
|
|
17
|
+
after the standing instruction, and two advisory checks report the wiring, each with a notice
|
|
18
|
+
at most once a day (`plugin-off-in-subdirectories` only when a nested directory's own settings
|
|
19
|
+
leave the plugin off).
|
|
20
|
+
- `version-skew` compares the running package with the plugin manifest under
|
|
21
|
+
`$CLAUDE_PLUGIN_ROOT` (or else `$PLUGIN_ROOT`, which Codex sets) by numeric parts, and says
|
|
22
|
+
which side is stale. It does not run without a plugin root, a manifest named `sidegraph`, or a
|
|
23
|
+
version.
|
|
24
|
+
- `plugin-off-in-subdirectories` applies Claude Code's settings model (a launch directory's own
|
|
25
|
+
project settings only, the repository root's `.claude/settings.local.json` for every launch,
|
|
26
|
+
`enabledPlugins` merged key by key over user settings) to the directories of the repository.
|
|
27
|
+
It reports a plugin enabled only in the root's `.claude/settings.json`, and nested directories
|
|
28
|
+
whose own `enabledPlugins` leave it off. User settings are read from
|
|
29
|
+
`$CLAUDE_CONFIG_DIR/settings.json` when that variable is set, else from `~/.claude/settings.json`. It also lists in `sidegraph-doctor` under the finding code
|
|
30
|
+
`plugin-off-in-subdirectories`, and **`--check` exits `2` on it** like any finding.
|
|
31
|
+
The getting-started pages now say that enabling the plugin at user scope, or in the root's
|
|
32
|
+
`.claude/settings.local.json`, covers every subdirectory, and the setup skill reads the doctor
|
|
33
|
+
finding. See [troubleshooting](docs/guides/troubleshooting.md#version-skew).
|
|
34
|
+
|
|
35
|
+
- **A subagent's brief carries the records for the files it names.** The task a subagent works
|
|
36
|
+
on is in the brief its parent wrote, which the `SubagentStart` brief cannot see. The
|
|
37
|
+
`sidegraph-pre-tool-use` entry point now also handles `Agent` (and `Task`, the older name): it
|
|
38
|
+
reads the files the brief names, and the files named in a `.md`, `.txt` or `.rst` document the
|
|
39
|
+
brief names (one hop, the first 64 KB), finds the records anchored to them, and returns the
|
|
40
|
+
call's own input with a block appended to `prompt` (`updatedInput`; no `permissionDecision`).
|
|
41
|
+
The subagent finds the block at the end of its first message. **The parent's view of its own
|
|
42
|
+
call does not show it**: its transcript keeps the prompt it wrote. A path resolves exactly when
|
|
43
|
+
it is an existing regular file inside the project root, and otherwise by a unique suffix among
|
|
44
|
+
the anchored files (`sub/x.py` for `pkg/sub/x.py`; an ambiguous suffix names nothing), tried
|
|
45
|
+
from the directory the agent was launched in before the root. A document is followed only when
|
|
46
|
+
it is a regular file inside the root, and **no hop goes through a project-instruction file**
|
|
47
|
+
(`CLAUDE.md`, `AGENTS.md` and their `.public` twins): they are still shown when records are
|
|
48
|
+
anchored to them, but the files they list are not followed. The block is grouped by file, two
|
|
49
|
+
records each, at most six record lines and 3,000 characters, and it ends with a
|
|
50
|
+
`More: get_task_context(files=[…])` line for the files shown; a file that misses the sixth
|
|
51
|
+
line by one still gets its first record there. It is **on by default**;
|
|
52
|
+
`SIDEGRAPH_AGENT_BRIEF=off` disables it. The plugin manifests (Claude Code only, the Codex ones
|
|
53
|
+
are unchanged) and the manual recipe gain a third `PreToolUse` group, matcher `Agent|Task`, on
|
|
54
|
+
the same command; a hand-wired setup needs that group added. Not tested: agent-team teammates
|
|
55
|
+
and `fork` spawns. See the
|
|
56
|
+
[hooks reference](docs/reference/hooks.md#subagent-briefs).
|
|
57
|
+
|
|
58
|
+
- **Every subagent starts knowing that memory exists and how to ask it.** A subagent gets no
|
|
59
|
+
`SessionStart` context, and Explore and Plan agents load no `CLAUDE.md` either, so nothing
|
|
60
|
+
standing told one that decision memory exists. The new `sidegraph-subagent-start` hook, wired
|
|
61
|
+
to `SubagentStart` in the Claude Code and Codex plugins, answers with a short brief: the same
|
|
62
|
+
standing `get_task_context(files=[…])` call `SessionStart` gives the main agent, and one
|
|
63
|
+
sentence of what memory holds ("N records anchored to code in M files, K of them recorded
|
|
64
|
+
mistakes"). The counts are what `get_task_context` could return: live records that may surface,
|
|
65
|
+
with a live or degraded binding to an entity that names a file. It carries no records, prints
|
|
66
|
+
`{}` where there is nothing anchored to code, and, like `PreToolUse`, reads the index directly
|
|
67
|
+
and builds no `Store`. `SIDEGRAPH_SUBAGENT_BRIEF=off` disables it. Codex records trust per hook
|
|
68
|
+
definition, so approve the new hook once in `/hooks`; manual recipes for both hosts gain the
|
|
69
|
+
entry. See the [hooks reference](docs/reference/hooks.md#sidegraph-subagent-start).
|
|
70
|
+
|
|
71
|
+
### Changed
|
|
72
|
+
|
|
73
|
+
- **The capture nudge comes back after more work, instead of firing once per session.** A session
|
|
74
|
+
that runs for a day and spawns subagents used to get one chance to record what it decided, at
|
|
75
|
+
its first substantial `Stop`, often before the work worth recording. A session that was already
|
|
76
|
+
nudged is now nudged again when at least 30 minutes have passed since its last nudge and at
|
|
77
|
+
least 10 commits authored since then are reachable from a local branch or `HEAD`; the text of
|
|
78
|
+
that nudge ends with `Since the last capture prompt: N commits.`, and the first nudge is
|
|
79
|
+
unchanged. The count is one `git log --branches HEAD`, run in the project the store belongs to
|
|
80
|
+
with a 2-second timeout, and it goes by author dates, so a rebase or cherry-pick of old commits
|
|
81
|
+
is not new work. A git failure means no re-arm. The last nudge is the meta key
|
|
82
|
+
`capture_rearm:<session>`, which the first nudge writes too and SessionStart expires after 30
|
|
83
|
+
days; a session captured by an older version has no key and counts from the `captured_at` of its
|
|
84
|
+
`capture_sessions` row. The new stamp is written with a compare-and-swap, so two parallel `Stop`
|
|
85
|
+
hooks cannot both nudge. A `Stop` inside the 30 minutes still exits on the read-only peek and
|
|
86
|
+
runs no git: a subprocess measured on a copy of this repository's store with a 1,000-commit
|
|
87
|
+
repository takes about 39 ms inside the gap and about 47 ms past it with too few commits. The
|
|
88
|
+
nudge's length bound is 850 characters, up from 800, for the added sentence. The count includes
|
|
89
|
+
commits that other sessions or people make on the same machine's branches.
|
|
90
|
+
`SIDEGRAPH_CAPTURE_NUDGE=off` silences re-armed nudges too. See the
|
|
91
|
+
[hooks reference](docs/reference/hooks.md#re-arm-after-more-work).
|
|
92
|
+
|
|
93
|
+
- **`PreToolUse` hands the agent the records of a file when it reads or edits it, instead of
|
|
94
|
+
asking it to fetch them.** The hook used to print a one-line nudge (a count, or the titles of
|
|
95
|
+
two records) and ask the agent to call `get_task_context`, which for a tool the host lists only
|
|
96
|
+
by name means loading it first. In the field study the one nudge that named a record worked and
|
|
97
|
+
the five that named counts did not, Edit and Write never nudged, and Bash, which is how current
|
|
98
|
+
Claude Code reads and searches, was never wired. The hook now prints the records themselves: the
|
|
99
|
+
guard line, then for each file a header and its top two records (three when the first two are
|
|
100
|
+
mistakes), each as `- [kind] title — first sentence of the choice (id …)`, accepted mistakes
|
|
101
|
+
first, proposals last and marked `[unratified]`, and a `More: get_task_context(files=[…])` line
|
|
102
|
+
when records were left out. It covers `Read`, `Grep`, `Edit` and `Write`, and four Bash read
|
|
103
|
+
commands, `sed`, `grep`, `rg` and `cat`, wired as four `if` entries on one command (`if` needs
|
|
104
|
+
Claude Code 2.1.89 for correct matching; an older host runs the hook on every Bash call, which
|
|
105
|
+
exits early with no output). A Bash line delivers the first three files it reads that have
|
|
106
|
+
records. Each file arrives once per agent, and an agent receives at most ten files: one SQL
|
|
107
|
+
statement counts and inserts a `pretool_file:<session>:<agent>:<path>` key, where `<agent>` is
|
|
108
|
+
`-` for the session's own agent, so concurrent hooks cannot exceed the cap. The counting form
|
|
109
|
+
(`this project has a decision memory … N domains, M decisions`) is gone, the `pretool_nudge:`
|
|
110
|
+
and `pretool_nudge_path:` keys are no longer written (SessionStart still prunes them, and the
|
|
111
|
+
new keys after 30 days), and a Bash read is still not a touch event. **`SIDEGRAPH_GREP_NUDGE=off`
|
|
112
|
+
keeps its name and now turns off all of this**, on every tool that reads (not the `Agent`
|
|
113
|
+
brief below, which has its own switch); it stops neither the hook from
|
|
114
|
+
launching on a Bash call nor touch recording. A subprocess median of nine on this repository's
|
|
115
|
+
store: about 26 ms when nothing is delivered, about 35 ms for a `Read` of the file with the most
|
|
116
|
+
records, about 38 ms for a Bash line naming three anchored files. A hand-wired
|
|
117
|
+
`.claude/settings.json` gains the Bash group (see the
|
|
118
|
+
[setup guide](docs/getting-started/claude-code-setup.md#2-add-the-hooks)). The `PreToolUse`
|
|
119
|
+
commands, in the plugin and in that snippet, no longer set `SIDEGRAPH_GRAPH`, which the hook
|
|
120
|
+
never read: Graphify's `graphify claude install` and `uninstall` remove a `Bash` entry whose
|
|
121
|
+
text mentions `graphify`, and would otherwise have removed the hand-wired group. See the
|
|
122
|
+
[hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
|
|
123
|
+
|
|
124
|
+
- **The plugin's hot hooks start from the commit `SessionStart` resolved, not from `@main`.**
|
|
125
|
+
`uv` re-resolves a branch reference on every call, about 0.8 s on a warm cache, and `Stop` and
|
|
126
|
+
`PreToolUse` run many times a session. `SessionStart` now records the commit `uv` resolved for
|
|
127
|
+
an `@main` install in `${XDG_CACHE_HOME:-$HOME/.cache}/sidegraph/launch-commit`: 40 hex bytes,
|
|
128
|
+
one file per machine, never written by an install pinned to a tag or SHA, an editable install
|
|
129
|
+
or a PyPI install. The public `Stop` and `PreToolUse` commands (Claude Code) and `Stop` (Codex)
|
|
130
|
+
launch `uvx --from` that commit, which `uv` serves from its cache in about 0.2 s, and fall back
|
|
131
|
+
to `@main` when there is no valid file, as before. A plugin pinned to a tag or commit ignores
|
|
132
|
+
the file and launches its own ref. `SessionStart` and the MCP server still run `@main`. A release therefore reaches a running session at the next `SessionStart` on the
|
|
133
|
+
machine, in any project and either host, not at its next hook call. The Codex `Stop` command is
|
|
134
|
+
wrapped in `sh -c '…'` so a fish login shell parses one literal. Codex records trust per hook
|
|
135
|
+
definition, so approve the changed `Stop` hook once in `/hooks`; the command no longer changes
|
|
136
|
+
between releases. `sidegraph-bootstrap`'s verification finds an entry point inside such a
|
|
137
|
+
`sh -c` script. See [troubleshooting](docs/guides/troubleshooting.md#the-launch-commit-file).
|
|
138
|
+
|
|
139
|
+
- **`PreToolUse` and `Stop` start about three times faster, and a tool call no longer creates a
|
|
140
|
+
store.** `import sidegraph.<anything>` used to load pydantic, ulid and every model, and
|
|
141
|
+
`PreToolUse` constructed a `Store`, which walks every record file, once for the touch row and
|
|
142
|
+
once for the nudge. The package root now resolves its re-exports on first access;
|
|
143
|
+
`PreToolUse` reads and writes `index.db` through one raw SQLite handle, with the same nudge
|
|
144
|
+
text, the same one-shot claim and the same touch row; and `Stop` imports `Store` only past its
|
|
145
|
+
early exits. On this repository's own store (about 1,500 record files), a subprocess median of
|
|
146
|
+
nine: a hook call that does nothing falls from about 83 ms to about 25 ms, an `Edit` from about
|
|
147
|
+
96 ms to about 30 ms, a `Read` from about 127 ms to about 35 ms, and the two `Stop` early exits
|
|
148
|
+
from about 87 ms to about 34 ms. The handle trusts the index as the last full open left it and
|
|
149
|
+
does nothing, printing `{}`, when the index is missing, a store-owned entry is a symlink, the
|
|
150
|
+
`schema_version` is not this version's, `retrieval_events` has no `agent` column, or opening it
|
|
151
|
+
fails. A `Store` open (a `SessionStart`, a command, a started MCP server) repairs a missing, empty or
|
|
152
|
+
older-layout index and refuses a symlinked entry or an unknown `schema_version`, as before; a
|
|
153
|
+
running server does not recreate a deleted index. A write that waits out the one-second lock timeout is not
|
|
154
|
+
retried in that run. **Behaviour change:** a `Read` or
|
|
155
|
+
`Edit` in a project without a store no longer creates `.sidegraph/`, and the nudge path no
|
|
156
|
+
longer prints "creating new store"; `SessionStart` and the MCP server still create the store.
|
|
157
|
+
A record that arrives mid-session can be missing from the nudge's titles until the next MCP
|
|
158
|
+
call. See the [hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
|
|
159
|
+
|
|
160
|
+
### Fixed
|
|
161
|
+
|
|
162
|
+
- **A finished background agent, an agent-team message or a `!` command's output no longer counts
|
|
163
|
+
as a typed prompt.** Claude Code writes each of these into the transcript as a `type: "user"`
|
|
164
|
+
line without the `isMeta` flag, so the `Stop` gate counted it: a session with one request and two
|
|
165
|
+
background agents passed the two-prompt gate at its first stop, and the capture nudge, which fires
|
|
166
|
+
once per session, was spent before there was anything to record. The gate now skips content that
|
|
167
|
+
starts `<task-notification>`, `<teammate-message` (the tag carries attributes, and is how a
|
|
168
|
+
teammate's own session receives a message), `Another Claude session sent a message` (how the
|
|
169
|
+
lead's session receives one) or `<bash-stdout>`, next to the three slash-command wrappers it
|
|
170
|
+
already skipped. It also skips a line that newer Claude Code marks with
|
|
171
|
+
`origin.kind: "task-notification"` or `promptSource: "system"`, which catches task
|
|
172
|
+
notifications written in plain prose. A slash command the
|
|
173
|
+
person typed, which starts `<command-message>`, and a `!` command's own `<bash-input>` still
|
|
174
|
+
count. Codex rollouts share the prefixes. See the
|
|
175
|
+
[hooks reference](docs/reference/hooks.md#sidegraph-stop).
|
|
176
|
+
- **A running MCP server sees a record that arrives mid-session.** The server keeps one `Store`,
|
|
177
|
+
and a `Store` checks the record files only when it is opened, so after a `git pull`
|
|
178
|
+
`get_task_context` and `retrieve_decisions` kept answering from the index as it stood until the
|
|
179
|
+
server restarted. The `PreToolUse` hook, which opened a `Store` on every call, was what
|
|
180
|
+
refreshed it, by accident. Every tool call now first re-checks the record files: a digest walk
|
|
181
|
+
(about 8 ms on 1,500 files), and a rebuild only when something changed. A filesystem error during
|
|
182
|
+
that check, such as a checkout deleting a record file mid-walk, does not fail the call: the tool
|
|
183
|
+
answers from the previous index and one line goes to stderr.
|
|
184
|
+
- **One record file that does not parse no longer switches memory off.** A merge that left
|
|
185
|
+
conflict markers in a decision, entity, fact or bindings file made the index rebuild raise, so
|
|
186
|
+
the store could not be opened: every hook fell back to "cannot open its store", and the MCP
|
|
187
|
+
server served nothing. The rebuild now skips such a file, whether it is invalid JSON, invalid
|
|
188
|
+
UTF-8, a wrong shape, rejected by its model or impossible to serialise, lists it as
|
|
189
|
+
`parse-error`, and loads the rest. The usual notice names the first such file, and
|
|
190
|
+
`sidegraph-verify` reports each of them; a file that fails validation no longer hides its
|
|
191
|
+
archived copy. A bindings file is skipped whole, so a half-valid file never leaves half of its
|
|
192
|
+
anchors in the index, and its record stays retrievable without them. A file that cannot be
|
|
193
|
+
opened at all (a permission or I/O error) still fails the open.
|
|
194
|
+
- **An archive line that cannot be read costs that line, not the store.** A line of an archive
|
|
195
|
+
segment that is not valid UTF-8 or JSON, or whose decision or domain fails its model, is skipped
|
|
196
|
+
with a warning in the rebuild, the rest of the segment loads, and the segment is listed as
|
|
197
|
+
`bad-archive-segment`. `sidegraph-verify` reports each such line with its segment and line
|
|
198
|
+
number. `sidegraph-compact` keeps the strict rule: it refuses to run over a segment it cannot
|
|
199
|
+
fully read and names the segment and the line (`--dry-run` included, with exit code 1 and no
|
|
200
|
+
traceback), and a hot file the rebuild left out no longer makes `--dry-run` fail with a bare
|
|
201
|
+
`JSONDecodeError`.
|
|
202
|
+
- **A file the rebuild left out is never overwritten.** With the store open again, a write that
|
|
203
|
+
recomputes a record's bindings from the index (`add_anchors`, `add_binding`) would have replaced
|
|
204
|
+
a conflicted bindings file with only the new anchor. All six canonical writers now refuse to
|
|
205
|
+
replace a listed file, with an error that names it. `add_anchors` checks first, so its refusal
|
|
206
|
+
leaves no orphan entity file behind. `supersede_decision` and `supersede_fact` refuse to inherit
|
|
207
|
+
anchors from a predecessor whose bindings file is skipped, since the successor would silently
|
|
208
|
+
start with none. `sidegraph-doctor` now says a skipped bindings file is skipped (unreadable),
|
|
209
|
+
not absent or empty. While an entity file is skipped, an anchor to the
|
|
210
|
+
same name mints a second entity, which `sidegraph-doctor`'s `duplicate-entity` check shows once
|
|
211
|
+
the file is fixed.
|
|
212
|
+
- **The skip warning no longer says "remove".** Removing a record file breaks the append-only
|
|
213
|
+
store, and removing an archive segment destroys every archived record in it. The warning now
|
|
214
|
+
says to restore the file with git or fix it by hand, and never to delete a segment. The
|
|
215
|
+
`store-files-skipped` notice says the same when the first listed file is an archive segment:
|
|
216
|
+
its lines that could not be read are left out, restore it with git, never delete it.
|
|
217
|
+
- **`sidegraph-verify` and `sidegraph-doctor` report what the rebuild leaves out.** They read an
|
|
218
|
+
archive segment as one string, so a line of invalid UTF-8 made them exit 1 with "store not
|
|
219
|
+
readable" and no file, and a line whose decision or domain fails its model was not reported at
|
|
220
|
+
all. They now split a segment into lines as bytes and report each bad line as
|
|
221
|
+
`bad-archive-segment`, with its segment and line number. A record file of invalid UTF-8, one
|
|
222
|
+
nested past the recursion limit and one that validates but cannot be serialised (a lone
|
|
223
|
+
surrogate) are `parse-error`s naming the file, where the first two exited 1 and the third
|
|
224
|
+
reported clean. A title holding U+2028 or U+0085 no longer gives a false `bad-archive-segment`.
|
|
225
|
+
- **Compacting a decision whose title holds U+2028 or U+0085 no longer leaves a store that will
|
|
226
|
+
not open.** The archive reader split a segment with `str.splitlines`, which breaks a line at
|
|
227
|
+
those characters (the segment holds them raw), so the next rebuild raised "corrupt archive
|
|
228
|
+
segment". A segment is now split as bytes, at `\n` and `\r` only.
|
|
229
|
+
|
|
230
|
+
## [0.8.0] — 2026-10-03
|
|
231
|
+
|
|
232
|
+
### Added
|
|
233
|
+
|
|
234
|
+
- **`get_task_context` says where the memory is when your file has none.** A file seed the graph
|
|
235
|
+
lacks, or one that resolved with no current record anchored to it, now gets a `## Nearest anchored`
|
|
236
|
+
sentence naming up to three files that do carry records: the graph neighbours first (the two
|
|
237
|
+
with the most records), then the files under the nearest directory that has any, skipping a
|
|
238
|
+
directory that holds more than a quarter of all anchored files (and more than four) and never
|
|
239
|
+
the repository root.
|
|
240
|
+
When the answer has no decision memory at all, the records of those files follow under `##
|
|
241
|
+
Nearest anchored records (not anchored to your files)`, labelled as not about your files, with
|
|
242
|
+
the same supersede line the main answer carries. An empty answer carries the sentence under `##
|
|
243
|
+
Why this is empty`. At most three seeds get a sentence. The records count as shown in
|
|
244
|
+
`sidegraph-stats`, and the neighbour files are never recorded as seeds. See
|
|
245
|
+
[the tool reference](docs/reference/mcp-tools.md#the-nearest-anchored-records).
|
|
246
|
+
|
|
247
|
+
- **Records that never reach the team are now visible.** A record follows the branch and
|
|
248
|
+
checkout it was written on, and on one field corpus two supersessions sat uncommitted for five
|
|
249
|
+
days and 32 proposals lived only on branches that `main`'s session start never saw. Two new
|
|
250
|
+
checks run at session start. `store-uncommitted` (degraded, with a notice, also in
|
|
251
|
+
`sidegraph-doctor` and `sidegraph-stats`) reports store files nobody committed for a day, aged
|
|
252
|
+
by the ULID in a new file's name (a `git stash` cannot rewrite it) and by the modification time
|
|
253
|
+
otherwise; fully staged files do not count, so `sidegraph-doctor --check` in a pre-commit hook
|
|
254
|
+
never blocks the fixing commit. `branch-only-records` (advisory) scans every unmerged local branch,
|
|
255
|
+
oldest first, for open records the default branch lacks (each counted once, for the newest
|
|
256
|
+
branch that holds it), and sends a notice when such a branch is more than a week old: the fix is
|
|
257
|
+
to merge it. The write tools (`add_decision`,
|
|
258
|
+
`supersede_decision`, `add_fact`, `supersede_fact`, `add_anchors`, `add_domain`,
|
|
259
|
+
`supersede_domain`, and the written elements of `propose_decisions` and `propose_domains`) add a
|
|
260
|
+
`commit_hint` to their result when the store is inside a git repository, except a store that is a
|
|
261
|
+
symlink to a directory outside it: git commits the link, not the records behind it. Where records
|
|
262
|
+
are written does not change. See the
|
|
263
|
+
[troubleshooting guide](docs/guides/troubleshooting.md#store-uncommitted) and the
|
|
264
|
+
[MCP tools reference](docs/reference/mcp-tools.md#commit-hint).
|
|
265
|
+
|
|
266
|
+
- **Sidegraph tells you when it needs attention, not only the model.** One list of integrity
|
|
267
|
+
checks now runs at every session start and in `sidegraph-doctor` and `sidegraph-stats`. The model
|
|
268
|
+
still gets a status line per problem, with the five existing lines unchanged and in the same
|
|
269
|
+
order. Problems that need a person also reach you as a `systemMessage`, which Claude Code shows as
|
|
270
|
+
a warning: at most once a day for each check, again at once when a problem gets worse, and not
|
|
271
|
+
again once the check finds nothing. New checks: a store that cannot be opened (a merge conflict
|
|
272
|
+
left in `.sidegraph/`, a damaged index, a store written by another version) now says so and
|
|
273
|
+
names the fix instead of switching memory off silently; a missing or unreadable code graph;
|
|
274
|
+
open records whose every code anchor is orphaned (degraded, with a notice, when three or more were
|
|
275
|
+
written in the last 14 days; advisory otherwise); and store files the last reload could not
|
|
276
|
+
index. A proposal that has waited 30 days earns a notice too. `sidegraph-doctor` gains an
|
|
277
|
+
`orphaned-record` finding and, with no graph, a skipped-checks line (`"graph"` in `--json`'s
|
|
278
|
+
`skipped`) instead of a finding, so `--check` does not start failing CI jobs that run without
|
|
279
|
+
one. `sidegraph-stats` opens with a `HEALTH` line (`health` in `--json`). The checks, their
|
|
280
|
+
severities and fixes are in the new [troubleshooting guide](docs/guides/troubleshooting.md), and
|
|
281
|
+
the output is in the [hooks reference](docs/reference/hooks.md#notices-for-the-human).
|
|
282
|
+
|
|
283
|
+
- **`sidegraph-init` asks whether to keep the code graph fresh, and installs the hook that does
|
|
284
|
+
it.** A graph nobody rebuilds goes stale, and on one field corpus it fell 314 commits behind
|
|
285
|
+
because the setup hint was printed and skipped. In a terminal, init now asks once (default yes);
|
|
286
|
+
`--hooks` installs without asking, `--no-hooks` declines and records it
|
|
287
|
+
(`git config sidegraph.graphRefresh false`), and `--remove-hooks` takes everything out and exits
|
|
288
|
+
without creating a store (it exits 1, and says the removal was partial, when a hook is a symlink
|
|
289
|
+
or has damaged markers and so keeps its block). The hook is a marked block in `post-commit`, `post-merge` and
|
|
290
|
+
`post-checkout`, inserted right after the shebang line so that a foreign hook that ends in `exit`
|
|
291
|
+
cannot skip it, plus a helper that rebuilds the graph in the background, in the main checkout
|
|
292
|
+
only (a linked worktree reads its graph), one rebuild at a time. It never replaces a hook: one that
|
|
293
|
+
is a symlink, not executable, CRLF or not a shell script is left alone and the line to add by hand
|
|
294
|
+
is printed. With `core.hooksPath` set it writes no hook file and prints the lines instead. Without
|
|
295
|
+
a terminal nothing is written, and a new advisory check, `refresh-hook-missing`, tells the model
|
|
296
|
+
to ask you, and tells you once a day, until the hook is installed or declined. A call you add by hand
|
|
297
|
+
counts only when its hook is executable and the call is not in a comment. The three flags are
|
|
298
|
+
a Committed surface ([stability](docs/reference/stability.md)); see
|
|
299
|
+
[keeping the graph fresh](docs/integrations/graphify.md#keeping-the-graph-fresh-git-hooks) and the
|
|
300
|
+
[troubleshooting guide](docs/guides/troubleshooting.md#refresh-hook-missing).
|
|
301
|
+
|
|
302
|
+
### Changed
|
|
303
|
+
|
|
304
|
+
- **`get_task_context` reads a wrong seed the way you meant it, and an empty answer says why.**
|
|
305
|
+
A seed the graph does not hold as written used to come back as "No context found." Now `./x.py`,
|
|
306
|
+
`x.py:12`, an absolute path inside the repository, a missing or invented directory prefix, a bare
|
|
307
|
+
file name, a directory, and a `Type.member` with no file are read through a short ladder, and a
|
|
308
|
+
`## How your seeds were read` block says what each one became and that a rewrite is a guess. A
|
|
309
|
+
file that exists on disk but not in the graph is never swapped for a namesake. A directory reads
|
|
310
|
+
as up to eight files, or is listed when it holds more than 24. A path that differs from a graph
|
|
311
|
+
file only by letter case reads as that file, even on a case-insensitive filesystem. A path or
|
|
312
|
+
name that could mean several is reported and read as none. Guessed seeds rank in the related
|
|
313
|
+
tier below the seeds you got right. The not-in-graph block now names the normalised path, so
|
|
314
|
+
`./pkg/n.py` gets the stale-or-new advice instead of "check the path". A name with no file that
|
|
315
|
+
matches several symbols is no longer expanded to all of them: it is reported as ambiguous. A call
|
|
316
|
+
with no seeds at all names the accepted domains you can drill into. Telemetry records a rewritten
|
|
317
|
+
path under the path that was read and a directory under its normalised key, and keeps a seed
|
|
318
|
+
whose name starts with `..` that it used to drop. See
|
|
319
|
+
[the tool reference](docs/reference/mcp-tools.md#seeds-are-read-tolerantly).
|
|
320
|
+
|
|
321
|
+
### Fixed
|
|
322
|
+
|
|
323
|
+
- **A symlinked store's capture commit, code drift and refresh-hook check come from the project
|
|
324
|
+
that holds the link.** A store can be a symlink (`.sidegraph -> ../shared/store`). Its records
|
|
325
|
+
are anchored to code in the project that holds the link, but git resolved the link and answered
|
|
326
|
+
for the repository it points into: `provenance.commit` named that repository's `HEAD`, or was
|
|
327
|
+
empty when the target sits in no repository, so the code-drift check passed silently or never
|
|
328
|
+
ran, and the refresh-hook check read the wrong hooks. Capture now stamps the project's `HEAD`
|
|
329
|
+
(empty while the project has no commits), the code-drift check diffs it in the project's
|
|
330
|
+
repository, and the refresh-hook check reads the project's hooks and recorded choice, the ones
|
|
331
|
+
`sidegraph-init` writes. A store that is not a symlink behaves as before, and
|
|
332
|
+
`--against` (`sidegraph-verify`, `sidegraph-doctor`) still diffs the history of the repository
|
|
333
|
+
that holds the store's files. Three behaviour changes come with it. A store directory that is itself a repository or
|
|
334
|
+
submodule inside another repository now stamps the enclosing project's `HEAD` and measures drift
|
|
335
|
+
there, and its refresh-hook check now runs against the enclosing project; a top-level store
|
|
336
|
+
repository with no enclosing one is unchanged. A record stamped before the fix with the link
|
|
337
|
+
target's (or the nested repository's) `HEAD` now gets `sidegraph-doctor`'s existing
|
|
338
|
+
`code-drift: git unavailable — check skipped` note for that commit, where it used to pass
|
|
339
|
+
silently. And the records of a symlinked store now match in git-bindings rule (a) and in
|
|
340
|
+
`sidegraph-blame`, which read `provenance.commit`. See [the store
|
|
341
|
+
format](docs/reference/store-format.md).
|
|
342
|
+
|
|
343
|
+
### Security
|
|
344
|
+
|
|
345
|
+
- **The lockfile moves `PyJWT` from 2.13.0 to 2.15.1 and `virtualenv` from 21.7.0 to
|
|
346
|
+
21.14.4.** The PyJWT 2.14.0 and 2.15.0 fixes cover one critical advisory (an asymmetric
|
|
347
|
+
PEM key with mutated whitespace skips the HMAC key-confusion guard), five high ones (key
|
|
348
|
+
material accepted as HMAC secrets, JWKS redirects, a BOM bypass) and several moderate
|
|
349
|
+
ones. The virtualenv fixes cover seed wheels that were not integrity-checked and
|
|
350
|
+
activation scripts that run commands embedded in a path or a prompt. PyJWT reaches Sidegraph only
|
|
351
|
+
through the MCP SDK's `crypto` extra, and Sidegraph never decodes a token; virtualenv is
|
|
352
|
+
a development dependency through pre-commit. The published package pins neither, so this
|
|
353
|
+
changes development and CI environments and installs made from `uv.lock`; a fresh install
|
|
354
|
+
already resolves fixed versions.
|
|
355
|
+
|
|
10
356
|
## [0.7.0] — 2026-10-02
|
|
11
357
|
|
|
12
358
|
### Changed
|
|
@@ -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.9.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
|
|
@@ -53,11 +53,14 @@ src/sidegraph/
|
|
|
53
53
|
├── schema.py # Pydantic models: Entity, Decision, Fact, AnchorBinding, Domain, Initiative
|
|
54
54
|
├── store.py # owned append-only store (file-per-record JSON); enforces invariants on write
|
|
55
55
|
├── retrieval.py # multi-altitude, budget-bounded, task-aware read path (mistakes first)
|
|
56
|
+
├── hot_index.py # raw-sqlite handle on index.db for the hook hot path (no Store, no pydantic)
|
|
57
|
+
├── store_layout.py # store constants and rules shared with the hot path (pydantic-free)
|
|
56
58
|
├── server.py # FastMCP decision MCP — the tools agents call
|
|
57
59
|
├── engine/ # ── ENGINE SEAM ── the ONLY place Graphify specifics may live
|
|
58
60
|
│ └── reader.py # GraphifyReader: reads graph.json (read-only input; no MCP)
|
|
59
|
-
└── host/ # ── HOST SEAM ── Claude Code integration (SessionStart/Stop/PreToolUse)
|
|
60
|
-
|
|
61
|
+
└── host/ # ── HOST SEAM ── Claude Code integration (SessionStart/Stop/PreToolUse/SubagentStart)
|
|
62
|
+
├── hooks.py # host-specific; portable core never reaches in here
|
|
63
|
+
└── subagent.py # SubagentStart: the memory brief for a starting subagent
|
|
61
64
|
```
|
|
62
65
|
|
|
63
66
|
- **Portable core** (`schema`, `store`, `retrieval`, `server`) knows nothing about Graphify
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.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
|
|
@@ -21,7 +21,9 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
21
21
|
Classifier: Topic :: Software Development :: Documentation
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries
|
|
23
23
|
Requires-Python: >=3.13
|
|
24
|
+
Requires-Dist: anyio>=4
|
|
24
25
|
Requires-Dist: fastmcp>=3.4
|
|
26
|
+
Requires-Dist: mcp>=1.24
|
|
25
27
|
Requires-Dist: pydantic>=2.9
|
|
26
28
|
Requires-Dist: python-ulid>=3.0
|
|
27
29
|
Description-Content-Type: text/markdown
|
|
@@ -73,7 +75,7 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
73
75
|
|
|
74
76
|
```
|
|
75
77
|
# 2. Inside a Claude Code session in that repo: install the plugin — MCP server + all
|
|
76
|
-
#
|
|
78
|
+
# four hooks, wired automatically.
|
|
77
79
|
/plugin marketplace add SantyagoSeaman/sidegraph
|
|
78
80
|
/plugin install sidegraph@sidegraph
|
|
79
81
|
```
|
|
@@ -167,7 +169,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
167
169
|
next session ◀── SessionStart TOC anchored to entities in the
|
|
168
170
|
of named domains ◀── get_task_context ◀────── engine's graph (read-only);
|
|
169
171
|
mistakes first drill_down re-anchored after refactors
|
|
170
|
-
|
|
172
|
+
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
171
173
|
```
|
|
172
174
|
|
|
173
175
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
@@ -45,7 +45,7 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
45
45
|
|
|
46
46
|
```
|
|
47
47
|
# 2. Inside a Claude Code session in that repo: install the plugin — MCP server + all
|
|
48
|
-
#
|
|
48
|
+
# four hooks, wired automatically.
|
|
49
49
|
/plugin marketplace add SantyagoSeaman/sidegraph
|
|
50
50
|
/plugin install sidegraph@sidegraph
|
|
51
51
|
```
|
|
@@ -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
|
-
|
|
142
|
+
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file 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).
|
|
@@ -238,7 +238,7 @@ for how this differs from a `Domain`.
|
|
|
238
238
|
|
|
239
239
|
## `schema_version` — a public contract
|
|
240
240
|
|
|
241
|
-
`SCHEMA_VERSION` (currently `0.6.0
|
|
241
|
+
`SCHEMA_VERSION` (currently `0.6.0`, defined in `store_layout.py` and re-exported by `schema.py`) is stamped into the store's `meta` table
|
|
242
242
|
once, at creation, and checked for an **exact** match on the fast (digest-matches) freshness
|
|
243
243
|
path — a mismatch there normally raises immediately rather than silently reading mismatched
|
|
244
244
|
data. The one exception: a store stamped with a version in `_RELOADABLE_SCHEMA_VERSIONS`
|
|
@@ -95,8 +95,17 @@ most likely to save it from a repeat mistake come first.
|
|
|
95
95
|
A `Seed` is either:
|
|
96
96
|
- a **file path** — resolves to every anchorable node in that file, or
|
|
97
97
|
- a **name (+ optional file_path)** — an entity ref, resolved the same way capture resolves
|
|
98
|
-
anchors (see [anchoring](anchoring.md#descriptors-name--file))
|
|
99
|
-
*all* candidates
|
|
98
|
+
anchors (see [anchoring](anchoring.md#descriptors-name--file)). An ambiguous ref with a file
|
|
99
|
+
keeps *all* its candidates in that file. For the MCP tool `get_task_context`, an ambiguous ref
|
|
100
|
+
with *no* file is reported and not read: expanding it would be a silent guess.
|
|
101
|
+
`query_structure` and `query_decisions` still expand every candidate.
|
|
102
|
+
|
|
103
|
+
The MCP tool reads a seed that the graph does not hold as written before giving up on it: a
|
|
104
|
+
path with a stray `./`, a wrong prefix or a bare file name, a directory, and a `Type.member`
|
|
105
|
+
with no file. Every rewrite is a guess and is named as one in the reply, the seeds that resolved
|
|
106
|
+
as written come first, and a guess that could mean several things is listed and never read (see
|
|
107
|
+
[`get_task_context`](../reference/mcp-tools.md#seeds-are-read-tolerantly)). The rule is still
|
|
108
|
+
exact matching, never similarity.
|
|
100
109
|
|
|
101
110
|
A seed reaches the store's entities two ways, and both count: a named seed that matches a
|
|
102
111
|
stored anchor name is that entity directly (whatever the graph calls the node, so a stored
|
|
@@ -317,8 +326,9 @@ syncs it too, index-only: the derived state fills its cold index, and no tracked
|
|
|
317
326
|
version (plus the reader's resolver revision, so an upgrade that changes how names resolve reruns the pass once) against the store's `last_synced_graph_version` meta stamp and skips the full pass if they match (an entity remembered under
|
|
318
327
|
`pending_uncommitted_moves` is still re-verified once `HEAD` has moved).
|
|
319
328
|
This is the self-healing mechanism described in
|
|
320
|
-
[anchoring](anchoring.md#what-happens-on-rename-or-move): a graph that was rebuilt
|
|
321
|
-
|
|
329
|
+
[anchoring](anchoring.md#what-happens-on-rename-or-move): a graph that was rebuilt, by the
|
|
330
|
+
[graph refresh hook](../integrations/graphify.md#keeping-the-graph-fresh-git-hooks) or by hand,
|
|
331
|
+
with no sync after it, is caught by the next read, and it's what keeps each accepted domain's
|
|
322
332
|
`communities` field current too (see
|
|
323
333
|
[mind model](mind-model.md#how-domains-relate-to-engine-communities)). It cannot catch a graph
|
|
324
334
|
that was never rebuilt, because the version it compares is the file's own: that case is
|
|
@@ -180,5 +180,5 @@ Continue through the maintenance loop:
|
|
|
180
180
|
|
|
181
181
|
The visual launch demo must show discovery and review, production proof, new-session capture
|
|
182
182
|
and ratification, and later organic retrieval. An import-only recording does not satisfy the
|
|
183
|
-
release package. The existing
|
|
183
|
+
release package. The existing PreToolUse records block is part of normal delivery; its
|
|
184
184
|
effect is measured separately and is not new Bootstrap functionality.
|