sidegraph 0.8.0__tar.gz → 0.10.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.8.0 → sidegraph-0.10.0}/.agents/plugins/marketplace.json +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.claude-plugin/marketplace.json +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/CHANGELOG.md +324 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/CLAUDE.md +6 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/PKG-INFO +26 -11
- {sidegraph-0.8.0 → sidegraph-0.10.0}/README.md +23 -10
- {sidegraph-0.8.0 → sidegraph-0.10.0}/SECURITY.md +15 -4
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/concepts/data-model.md +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/concepts/mind-model.md +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/concepts/retrieval.md +50 -11
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/getting-started/bootstrap.md +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/getting-started/claude-code-setup.md +104 -16
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/getting-started/codex-setup.md +32 -13
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/getting-started/installation.md +28 -10
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/getting-started/quickstart.md +29 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/capturing-decisions.md +9 -7
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/retrieval-in-sessions.md +67 -15
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/semantic-docs.md +2 -2
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/team-workflow.md +11 -4
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/troubleshooting.md +119 -12
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/integrations/claude-code.md +121 -46
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/integrations/codex.md +85 -27
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/integrations/graphify.md +20 -10
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/llms.txt +3 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/cli.md +69 -44
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/configuration.md +10 -8
- sidegraph-0.10.0/docs/reference/hooks.md +970 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/mcp-tools.md +219 -30
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/operations.md +24 -9
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/releasing.md +5 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/stability.md +4 -4
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/store-format.md +34 -10
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- sidegraph-0.10.0/plugin/sidegraph/codex/hooks.json +34 -0
- sidegraph-0.10.0/plugin/sidegraph/hooks/hooks.json +79 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/check-plan/SKILL.md +7 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/explain-why/SKILL.md +8 -6
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +6 -5
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +10 -2
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +6 -2
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-decision/SKILL.md +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-fact/SKILL.md +4 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/setup/SKILL.md +35 -9
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +3 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/pyproject.toml +6 -1
- sidegraph-0.10.0/src/sidegraph/__init__.py +76 -0
- sidegraph-0.10.0/src/sidegraph/bash_paths.py +553 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/apply.py +9 -5
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/integrations.py +11 -2
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/capture.py +1 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/cli.py +55 -14
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/config.py +2 -2
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/doc_import.py +230 -50
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/doctor.py +59 -7
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/host/claude_settings.py +137 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/host/hooks.py +841 -277
- sidegraph-0.10.0/src/sidegraph/host/launch.py +106 -0
- sidegraph-0.10.0/src/sidegraph/host/subagent.py +100 -0
- sidegraph-0.10.0/src/sidegraph/hot_index.py +321 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/importer.py +52 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/integrity.py +23 -15
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/retrieval.py +31 -71
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/schema.py +4 -29
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/server.py +756 -63
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/store.py +337 -143
- sidegraph-0.10.0/src/sidegraph/store_layout.py +191 -0
- sidegraph-0.10.0/src/sidegraph/text_paths.py +176 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/verify.py +39 -14
- sidegraph-0.10.0/tests/test_agent_brief_manifests.py +79 -0
- sidegraph-0.10.0/tests/test_bash_paths.py +336 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_apply.py +44 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_integrations.py +64 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_compact.py +32 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_doctor.py +17 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_codex_plugin.py +3 -3
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doc_import.py +67 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_docs_claims.py +35 -9
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor.py +33 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_flow_profile.py +8 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_hook_spawn_guard.py +15 -12
- sidegraph-0.10.0/tests/test_host_agent_brief.py +490 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_agent_state.py +48 -42
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_integrity.py +48 -9
- sidegraph-0.10.0/tests/test_host_launch.py +331 -0
- sidegraph-0.10.0/tests/test_host_pretool.py +372 -0
- sidegraph-0.10.0/tests/test_host_pretool_records.py +771 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_stop.py +141 -2
- sidegraph-0.10.0/tests/test_host_subagent_start.py +304 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_subdirectory_launch.py +4 -2
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_touch_events.py +16 -2
- sidegraph-0.10.0/tests/test_host_wiring_checks.py +719 -0
- sidegraph-0.10.0/tests/test_hot_index.py +642 -0
- sidegraph-0.10.0/tests/test_hot_index_hook.py +173 -0
- sidegraph-0.10.0/tests/test_hot_path_imports.py +319 -0
- sidegraph-0.10.0/tests/test_import_dry_run_preview.py +619 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_importer.py +1 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_integrity.py +35 -0
- sidegraph-0.10.0/tests/test_lazy_root.py +49 -0
- sidegraph-0.10.0/tests/test_public_hook_launch.py +445 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_ratify_policy.py +35 -18
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_add_anchors.py +27 -0
- sidegraph-0.10.0/tests/test_server_annotations.py +86 -0
- sidegraph-0.10.0/tests/test_server_argument_names.py +275 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_borrowed_graph.py +98 -0
- sidegraph-0.10.0/tests/test_server_decision_listing.py +773 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_mcp_smoke.py +10 -2
- sidegraph-0.10.0/tests/test_server_record_types.py +177 -0
- sidegraph-0.10.0/tests/test_server_refresh.py +208 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_supersede.py +82 -1
- sidegraph-0.10.0/tests/test_stop_hot_path.py +80 -0
- sidegraph-0.10.0/tests/test_stop_rearm.py +505 -0
- sidegraph-0.10.0/tests/test_store_bad_file.py +590 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_compact_review.py +5 -2
- sidegraph-0.10.0/tests/test_store_record_types.py +77 -0
- sidegraph-0.10.0/tests/test_subagent_start_manifests.py +62 -0
- sidegraph-0.10.0/tests/test_text_paths.py +414 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_verify_snapshot.py +166 -1
- {sidegraph-0.8.0 → sidegraph-0.10.0}/uv.lock +5 -1
- sidegraph-0.8.0/docs/reference/hooks.md +0 -566
- sidegraph-0.8.0/plugin/sidegraph/codex/hooks.json +0 -24
- sidegraph-0.8.0/plugin/sidegraph/hooks/hooks.json +0 -35
- sidegraph-0.8.0/src/sidegraph/__init__.py +0 -37
- sidegraph-0.8.0/tests/test_host_pretool.py +0 -379
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.gitignore +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.gitleaks.toml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/.python-version +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/AGENTS.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/LICENSE +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/README.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/reference/git-bindings.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/stats/model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/sync.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/__init__.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/conftest.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/githooks_support.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_config.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_integrity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_git_config_isolation.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_githooks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_okf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_stats_render.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.8.0 → sidegraph-0.10.0}/tools/check_no_session_links.py +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"source": "local",
|
|
9
9
|
"path": "./plugin/sidegraph"
|
|
10
10
|
},
|
|
11
|
-
"description": "Durable decision/lessons memory over your code graph — captured in-session,
|
|
11
|
+
"description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors."
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
{
|
|
7
7
|
"name": "sidegraph",
|
|
8
8
|
"source": "./plugin/sidegraph",
|
|
9
|
-
"description": "Durable decision/lessons memory over your code graph — captured in-session,
|
|
9
|
+
"description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors.",
|
|
10
10
|
"homepage": "https://github.com/SantyagoSeaman/sidegraph"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
@@ -7,6 +7,330 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.10.0] — 2026-10-04
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Every MCP tool now carries annotations, so a host's auto-reviewer stops rejecting memory
|
|
15
|
+
reads.** In the field, Codex's auto-reviewer rejected 20 `get_task_context` calls, and each
|
|
16
|
+
one lost memory for that step: an unannotated tool takes the MCP defaults (destructive,
|
|
17
|
+
open-world), and the review's verdict then depends on the prompt. The seven tools that never
|
|
18
|
+
change a tracked file are read-only; the other 17 are non-destructive, closed-world local
|
|
19
|
+
writes. No tool sends anything off the machine and none deletes a record. A test runs the
|
|
20
|
+
read-only tools on a store where a lazy sync would adopt a moved symbol, and fails if one of
|
|
21
|
+
them changes a tracked file, so the annotation cannot drift from what the tool does. See the
|
|
22
|
+
[reference](docs/reference/mcp-tools.md#annotations) and the
|
|
23
|
+
[Codex page](docs/integrations/codex.md#the-auto-reviewer-and-memory-reads).
|
|
24
|
+
- **The seed tools accept the argument names agents try, and every tool names its parameters in
|
|
25
|
+
an error.** `get_task_context`, `query_structure` and `query_decisions` accept `paths` (as
|
|
26
|
+
`files`) and `seeds`; each seed goes to `files` when it looks like a path and to `entities`
|
|
27
|
+
otherwise. `task` is refused with a line saying there is no free-text query. Any other
|
|
28
|
+
unknown argument, on any tool, is an error that names it and lists the tool's real parameters;
|
|
29
|
+
FastMCP's own error named the argument but not the parameters.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- **`retrieve_decisions` no longer returns the whole store.** One call returned a full dump of
|
|
34
|
+
every visible decision: about 143,000 tokens on a store of 260 records, more than a host would
|
|
35
|
+
show, and in a field report most agents passed `include_superseded: true` and then either
|
|
36
|
+
printed the dump or filtered it by hand. The call now has two answers.
|
|
37
|
+
- With no narrowing filter it returns an **overview**: the total, counts by status and kind
|
|
38
|
+
(superseded and rejected records included, so the counts say that history exists), and the
|
|
39
|
+
newest records as compact rows (`id`, `kind`, `status`, `title`, `valid_from`).
|
|
40
|
+
- With a narrowing filter it returns **full records**, gotchas and lessons first and newest
|
|
41
|
+
first, cut at `limit` (default 25, at most 100) or `budget_chars` (default 24,000, at most
|
|
42
|
+
60,000), whichever comes first. A `hint` says what cut the list, or why it is empty.
|
|
43
|
+
- The filters are new arguments, and they combine with AND: `status` and `kind` (a string or a
|
|
44
|
+
list), `files`, `query` (every word must occur in the record's text) and `ids` (exact record
|
|
45
|
+
ids, superseded ones too). `include_superseded` keeps its meaning: it widens the overview's
|
|
46
|
+
`newest` and a filtered call that has no `status`.
|
|
47
|
+
- `files` are read the way `get_task_context` reads them: a basename, a suffix, a directory or
|
|
48
|
+
a letter-case slip works. `unresolved_files` lists, for each path nothing could read (at most
|
|
49
|
+
ten, with `unresolved_omitted` counting the rest), why (`ambiguous`, `directory-too-large`,
|
|
50
|
+
`not-in-graph` or `no-graph`) and the candidates to pass instead.
|
|
51
|
+
- **The return type changed from a list to a JSON object, sent once as a single text block
|
|
52
|
+
with no structured copy**, so `budget_chars` is the real cost on every host. A client that
|
|
53
|
+
read the list now reads `decisions` of a filtered answer. The proposal policy is unchanged
|
|
54
|
+
and applies to every shape.
|
|
55
|
+
- The `check-plan`, `explain-why`, `triage-drift` and `heal-anchors` skills now call it with a
|
|
56
|
+
filter, and a test fails if a skill calls it without one. See the
|
|
57
|
+
[reference](docs/reference/mcp-tools.md#retrieve_decisions).
|
|
58
|
+
|
|
59
|
+
### Fixed
|
|
60
|
+
|
|
61
|
+
- **A fault converting a reviewed item in `sidegraph-bootstrap` now prints the RESUME line.** The
|
|
62
|
+
conversion of each reviewed item, and the check that its ref still matches the candidate,
|
|
63
|
+
ran outside the per-item error handling. A fault there, after an earlier item had been
|
|
64
|
+
written, left `apply_review` without a report: an `AssertionError` ended the run as a
|
|
65
|
+
traceback, a `ValueError` was reported as a failure before anything was written, and neither
|
|
66
|
+
printed `RESUME`, though canonical files were already on disk. The fault now takes the path a
|
|
67
|
+
write error takes: the run stops, reports `partial-recoverable` with the durable candidates and
|
|
68
|
+
the failing ref, and prints the resume command. A fault on the first item, before anything is
|
|
69
|
+
written, now exits 2 with `STORE incomplete`, the failing ref and the resume command, where a
|
|
70
|
+
`ValueError` used to exit 1 with an `ERROR` line; the terminal shows the failing ref and not the
|
|
71
|
+
reason.
|
|
72
|
+
- **`sidegraph-import --dry-run` now says what auto-ratification would do.** Both import paths
|
|
73
|
+
decided auto-ratification only after a real write, so under a non-`manual`
|
|
74
|
+
`SIDEGRAPH_RATIFY_POLICY` a dry run could not show which records a real run would land
|
|
75
|
+
accepted without a human: on one fixture it reported 0 where the real run auto-ratified 2. The
|
|
76
|
+
dry run now runs the same eligibility gate on the record the write would produce and reports
|
|
77
|
+
the result in a new `would_auto_ratify` field on `ImportReport` and `DocImportReport`, and as
|
|
78
|
+
`auto_ratify_eligible` on each dry-run item. `auto_ratified` keeps its meaning, transitions
|
|
79
|
+
that actually happened, so it stays 0 in a dry run.
|
|
80
|
+
- **Behaviour change:** under a non-`manual` policy the summary line gains `would
|
|
81
|
+
auto-ratify M` before `(skipped:` and an eligible item line ends with ` [auto]`. Under
|
|
82
|
+
`manual` both are unchanged. A dry run still never carries the real run's `auto-ratified K`.
|
|
83
|
+
- The count is eligibility, not a guarantee: a real run's transition can still fail, for
|
|
84
|
+
example on a race or a refused cascade.
|
|
85
|
+
- A key repeated within one run no longer counts twice in the dry run. Two rationales with the
|
|
86
|
+
same title in one file count once. A document ref met more than once (one file named twice, a
|
|
87
|
+
directory plus a file inside it, or a live and an archived copy that a profile maps to one
|
|
88
|
+
ref) is classified against the records the earlier copies would have left there, as the real
|
|
89
|
+
run sees them: an identical repeat is skipped, a differing one supersedes, and a copy after a
|
|
90
|
+
`rejected` first copy is a fresh write. Two rare shapes can still differ in the
|
|
91
|
+
`superseded`/`skipped` split, not in the eligibility count where checked: a ref met three
|
|
92
|
+
times with the first content returning, under an auto policy, and a repeat with no anchor of
|
|
93
|
+
its own.
|
|
94
|
+
- **`find_entity` no longer calls a dangling record a decision.** Each binding was labelled
|
|
95
|
+
`fact` if a fact lookup found it and `decision` otherwise, so a binding whose record exists in
|
|
96
|
+
neither table (a record file removed by hand, or lost in a merge) came back as a decision that
|
|
97
|
+
`get_decision` could not fetch, and each binding cost a query of its own. The types of all of an
|
|
98
|
+
entity's bindings now come from one read of the index, and a binding with no record reports
|
|
99
|
+
`record_type: "unknown"`. The value is additive: a client that handles `decision` and `fact`
|
|
100
|
+
is unaffected. `get_entity_history` uses the same read and still skips such a binding. See the
|
|
101
|
+
[reference](docs/reference/mcp-tools.md#find_entity).
|
|
102
|
+
- **A document status like `should not be rejected` no longer lands `rejected`.** The check for
|
|
103
|
+
a turned-down status saw a negation only as `not` and one space directly before the word, so
|
|
104
|
+
`should not be rejected`, `not rejected` (two spaces), `never rejected` and `isn't rejected`
|
|
105
|
+
all read as rejections, and a false `rejected` lands closed and invisible to retrieval. A
|
|
106
|
+
negation is now `not`, `never` or a word ending `n't` within the three words before the word in
|
|
107
|
+
the same clause. A clause ends at `,` `;` `.` `:`, a pipe, a slash, an em or en dash, or a spaced
|
|
108
|
+
hyphen or `->`, so `not reviewed, rejected`, `Not accepted — rejected` and `Won't do / rejected`
|
|
109
|
+
still read as rejections, as does `not rejected, rejected`. A conjunction does not end a
|
|
110
|
+
clause: `Not adopted and rejected` reads as negated, and lands accepted unless `--propose` or
|
|
111
|
+
a draft marker sends it to the ratification queue. See the
|
|
112
|
+
[reference](docs/reference/cli.md#sidegraph-import).
|
|
113
|
+
|
|
114
|
+
## [0.9.0] — 2026-10-04
|
|
115
|
+
|
|
116
|
+
### Added
|
|
117
|
+
|
|
118
|
+
- **Host wiring that silently switched memory off is now visible.** Two field failures went
|
|
119
|
+
unnoticed for weeks: hooks that ran an old install under a newer plugin, and sessions started in
|
|
120
|
+
a subdirectory where the plugin was off. `SessionStart` now prints `Sidegraph <version>` right
|
|
121
|
+
after the standing instruction, and two advisory checks report the wiring, each with a notice
|
|
122
|
+
at most once a day (`plugin-off-in-subdirectories` only when a nested directory's own settings
|
|
123
|
+
leave the plugin off).
|
|
124
|
+
- `version-skew` compares the running package with the plugin manifest under
|
|
125
|
+
`$CLAUDE_PLUGIN_ROOT` (or else `$PLUGIN_ROOT`, which Codex sets) by numeric parts, and says
|
|
126
|
+
which side is stale. It does not run without a plugin root, a manifest named `sidegraph`, or a
|
|
127
|
+
version.
|
|
128
|
+
- `plugin-off-in-subdirectories` applies Claude Code's settings model (a launch directory's own
|
|
129
|
+
project settings only, the repository root's `.claude/settings.local.json` for every launch,
|
|
130
|
+
`enabledPlugins` merged key by key over user settings) to the directories of the repository.
|
|
131
|
+
It reports a plugin enabled only in the root's `.claude/settings.json`, and nested directories
|
|
132
|
+
whose own `enabledPlugins` leave it off. User settings are read from
|
|
133
|
+
`$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
|
|
134
|
+
`plugin-off-in-subdirectories`, and **`--check` exits `2` on it** like any finding.
|
|
135
|
+
The getting-started pages now say that enabling the plugin at user scope, or in the root's
|
|
136
|
+
`.claude/settings.local.json`, covers every subdirectory, and the setup skill reads the doctor
|
|
137
|
+
finding. See [troubleshooting](docs/guides/troubleshooting.md#version-skew).
|
|
138
|
+
|
|
139
|
+
- **A subagent's brief carries the records for the files it names.** The task a subagent works
|
|
140
|
+
on is in the brief its parent wrote, which the `SubagentStart` brief cannot see. The
|
|
141
|
+
`sidegraph-pre-tool-use` entry point now also handles `Agent` (and `Task`, the older name): it
|
|
142
|
+
reads the files the brief names, and the files named in a `.md`, `.txt` or `.rst` document the
|
|
143
|
+
brief names (one hop, the first 64 KB), finds the records anchored to them, and returns the
|
|
144
|
+
call's own input with a block appended to `prompt` (`updatedInput`; no `permissionDecision`).
|
|
145
|
+
The subagent finds the block at the end of its first message. **The parent's view of its own
|
|
146
|
+
call does not show it**: its transcript keeps the prompt it wrote. A path resolves exactly when
|
|
147
|
+
it is an existing regular file inside the project root, and otherwise by a unique suffix among
|
|
148
|
+
the anchored files (`sub/x.py` for `pkg/sub/x.py`; an ambiguous suffix names nothing), tried
|
|
149
|
+
from the directory the agent was launched in before the root. A document is followed only when
|
|
150
|
+
it is a regular file inside the root, and **no hop goes through a project-instruction file**
|
|
151
|
+
(`CLAUDE.md`, `AGENTS.md` and their `.public` twins): they are still shown when records are
|
|
152
|
+
anchored to them, but the files they list are not followed. The block is grouped by file, two
|
|
153
|
+
records each, at most six record lines and 3,000 characters, and it ends with a
|
|
154
|
+
`More: get_task_context(files=[…])` line for the files shown; a file that misses the sixth
|
|
155
|
+
line by one still gets its first record there. It is **on by default**;
|
|
156
|
+
`SIDEGRAPH_AGENT_BRIEF=off` disables it. The plugin manifests (Claude Code only, the Codex ones
|
|
157
|
+
are unchanged) and the manual recipe gain a third `PreToolUse` group, matcher `Agent|Task`, on
|
|
158
|
+
the same command; a hand-wired setup needs that group added. Not tested: agent-team teammates
|
|
159
|
+
and `fork` spawns. See the
|
|
160
|
+
[hooks reference](docs/reference/hooks.md#subagent-briefs).
|
|
161
|
+
|
|
162
|
+
- **Every subagent starts knowing that memory exists and how to ask it.** A subagent gets no
|
|
163
|
+
`SessionStart` context, and Explore and Plan agents load no `CLAUDE.md` either, so nothing
|
|
164
|
+
standing told one that decision memory exists. The new `sidegraph-subagent-start` hook, wired
|
|
165
|
+
to `SubagentStart` in the Claude Code and Codex plugins, answers with a short brief: the same
|
|
166
|
+
standing `get_task_context(files=[…])` call `SessionStart` gives the main agent, and one
|
|
167
|
+
sentence of what memory holds ("N records anchored to code in M files, K of them recorded
|
|
168
|
+
mistakes"). The counts are what `get_task_context` could return: live records that may surface,
|
|
169
|
+
with a live or degraded binding to an entity that names a file. It carries no records, prints
|
|
170
|
+
`{}` where there is nothing anchored to code, and, like `PreToolUse`, reads the index directly
|
|
171
|
+
and builds no `Store`. `SIDEGRAPH_SUBAGENT_BRIEF=off` disables it. Codex records trust per hook
|
|
172
|
+
definition, so approve the new hook once in `/hooks`; manual recipes for both hosts gain the
|
|
173
|
+
entry. See the [hooks reference](docs/reference/hooks.md#sidegraph-subagent-start).
|
|
174
|
+
|
|
175
|
+
### Changed
|
|
176
|
+
|
|
177
|
+
- **The capture nudge comes back after more work, instead of firing once per session.** A session
|
|
178
|
+
that runs for a day and spawns subagents used to get one chance to record what it decided, at
|
|
179
|
+
its first substantial `Stop`, often before the work worth recording. A session that was already
|
|
180
|
+
nudged is now nudged again when at least 30 minutes have passed since its last nudge and at
|
|
181
|
+
least 10 commits authored since then are reachable from a local branch or `HEAD`; the text of
|
|
182
|
+
that nudge ends with `Since the last capture prompt: N commits.`, and the first nudge is
|
|
183
|
+
unchanged. The count is one `git log --branches HEAD`, run in the project the store belongs to
|
|
184
|
+
with a 2-second timeout, and it goes by author dates, so a rebase or cherry-pick of old commits
|
|
185
|
+
is not new work. A git failure means no re-arm. The last nudge is the meta key
|
|
186
|
+
`capture_rearm:<session>`, which the first nudge writes too and SessionStart expires after 30
|
|
187
|
+
days; a session captured by an older version has no key and counts from the `captured_at` of its
|
|
188
|
+
`capture_sessions` row. The new stamp is written with a compare-and-swap, so two parallel `Stop`
|
|
189
|
+
hooks cannot both nudge. A `Stop` inside the 30 minutes still exits on the read-only peek and
|
|
190
|
+
runs no git: a subprocess measured on a copy of this repository's store with a 1,000-commit
|
|
191
|
+
repository takes about 39 ms inside the gap and about 47 ms past it with too few commits. The
|
|
192
|
+
nudge's length bound is 850 characters, up from 800, for the added sentence. The count includes
|
|
193
|
+
commits that other sessions or people make on the same machine's branches.
|
|
194
|
+
`SIDEGRAPH_CAPTURE_NUDGE=off` silences re-armed nudges too. See the
|
|
195
|
+
[hooks reference](docs/reference/hooks.md#re-arm-after-more-work).
|
|
196
|
+
|
|
197
|
+
- **`PreToolUse` hands the agent the records of a file when it reads or edits it, instead of
|
|
198
|
+
asking it to fetch them.** The hook used to print a one-line nudge (a count, or the titles of
|
|
199
|
+
two records) and ask the agent to call `get_task_context`, which for a tool the host lists only
|
|
200
|
+
by name means loading it first. In the field study the one nudge that named a record worked and
|
|
201
|
+
the five that named counts did not, Edit and Write never nudged, and Bash, which is how current
|
|
202
|
+
Claude Code reads and searches, was never wired. The hook now prints the records themselves: the
|
|
203
|
+
guard line, then for each file a header and its top two records (three when the first two are
|
|
204
|
+
mistakes), each as `- [kind] title — first sentence of the choice (id …)`, accepted mistakes
|
|
205
|
+
first, proposals last and marked `[unratified]`, and a `More: get_task_context(files=[…])` line
|
|
206
|
+
when records were left out. It covers `Read`, `Grep`, `Edit` and `Write`, and four Bash read
|
|
207
|
+
commands, `sed`, `grep`, `rg` and `cat`, wired as four `if` entries on one command (`if` needs
|
|
208
|
+
Claude Code 2.1.89 for correct matching; an older host runs the hook on every Bash call, which
|
|
209
|
+
exits early with no output). A Bash line delivers the first three files it reads that have
|
|
210
|
+
records. Each file arrives once per agent, and an agent receives at most ten files: one SQL
|
|
211
|
+
statement counts and inserts a `pretool_file:<session>:<agent>:<path>` key, where `<agent>` is
|
|
212
|
+
`-` for the session's own agent, so concurrent hooks cannot exceed the cap. The counting form
|
|
213
|
+
(`this project has a decision memory … N domains, M decisions`) is gone, the `pretool_nudge:`
|
|
214
|
+
and `pretool_nudge_path:` keys are no longer written (SessionStart still prunes them, and the
|
|
215
|
+
new keys after 30 days), and a Bash read is still not a touch event. **`SIDEGRAPH_GREP_NUDGE=off`
|
|
216
|
+
keeps its name and now turns off all of this**, on every tool that reads (not the `Agent`
|
|
217
|
+
brief below, which has its own switch); it stops neither the hook from
|
|
218
|
+
launching on a Bash call nor touch recording. A subprocess median of nine on this repository's
|
|
219
|
+
store: about 26 ms when nothing is delivered, about 35 ms for a `Read` of the file with the most
|
|
220
|
+
records, about 38 ms for a Bash line naming three anchored files. A hand-wired
|
|
221
|
+
`.claude/settings.json` gains the Bash group (see the
|
|
222
|
+
[setup guide](docs/getting-started/claude-code-setup.md#2-add-the-hooks)). The `PreToolUse`
|
|
223
|
+
commands, in the plugin and in that snippet, no longer set `SIDEGRAPH_GRAPH`, which the hook
|
|
224
|
+
never read: Graphify's `graphify claude install` and `uninstall` remove a `Bash` entry whose
|
|
225
|
+
text mentions `graphify`, and would otherwise have removed the hand-wired group. See the
|
|
226
|
+
[hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
|
|
227
|
+
|
|
228
|
+
- **The plugin's hot hooks start from the commit `SessionStart` resolved, not from `@main`.**
|
|
229
|
+
`uv` re-resolves a branch reference on every call, about 0.8 s on a warm cache, and `Stop` and
|
|
230
|
+
`PreToolUse` run many times a session. `SessionStart` now records the commit `uv` resolved for
|
|
231
|
+
an `@main` install in `${XDG_CACHE_HOME:-$HOME/.cache}/sidegraph/launch-commit`: 40 hex bytes,
|
|
232
|
+
one file per machine, never written by an install pinned to a tag or SHA, an editable install
|
|
233
|
+
or a PyPI install. The public `Stop` and `PreToolUse` commands (Claude Code) and `Stop` (Codex)
|
|
234
|
+
launch `uvx --from` that commit, which `uv` serves from its cache in about 0.2 s, and fall back
|
|
235
|
+
to `@main` when there is no valid file, as before. A plugin pinned to a tag or commit ignores
|
|
236
|
+
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
|
|
237
|
+
machine, in any project and either host, not at its next hook call. The Codex `Stop` command is
|
|
238
|
+
wrapped in `sh -c '…'` so a fish login shell parses one literal. Codex records trust per hook
|
|
239
|
+
definition, so approve the changed `Stop` hook once in `/hooks`; the command no longer changes
|
|
240
|
+
between releases. `sidegraph-bootstrap`'s verification finds an entry point inside such a
|
|
241
|
+
`sh -c` script. See [troubleshooting](docs/guides/troubleshooting.md#the-launch-commit-file).
|
|
242
|
+
|
|
243
|
+
- **`PreToolUse` and `Stop` start about three times faster, and a tool call no longer creates a
|
|
244
|
+
store.** `import sidegraph.<anything>` used to load pydantic, ulid and every model, and
|
|
245
|
+
`PreToolUse` constructed a `Store`, which walks every record file, once for the touch row and
|
|
246
|
+
once for the nudge. The package root now resolves its re-exports on first access;
|
|
247
|
+
`PreToolUse` reads and writes `index.db` through one raw SQLite handle, with the same nudge
|
|
248
|
+
text, the same one-shot claim and the same touch row; and `Stop` imports `Store` only past its
|
|
249
|
+
early exits. On this repository's own store (about 1,500 record files), a subprocess median of
|
|
250
|
+
nine: a hook call that does nothing falls from about 83 ms to about 25 ms, an `Edit` from about
|
|
251
|
+
96 ms to about 30 ms, a `Read` from about 127 ms to about 35 ms, and the two `Stop` early exits
|
|
252
|
+
from about 87 ms to about 34 ms. The handle trusts the index as the last full open left it and
|
|
253
|
+
does nothing, printing `{}`, when the index is missing, a store-owned entry is a symlink, the
|
|
254
|
+
`schema_version` is not this version's, `retrieval_events` has no `agent` column, or opening it
|
|
255
|
+
fails. A `Store` open (a `SessionStart`, a command, a started MCP server) repairs a missing, empty or
|
|
256
|
+
older-layout index and refuses a symlinked entry or an unknown `schema_version`, as before; a
|
|
257
|
+
running server does not recreate a deleted index. A write that waits out the one-second lock timeout is not
|
|
258
|
+
retried in that run. **Behaviour change:** a `Read` or
|
|
259
|
+
`Edit` in a project without a store no longer creates `.sidegraph/`, and the nudge path no
|
|
260
|
+
longer prints "creating new store"; `SessionStart` and the MCP server still create the store.
|
|
261
|
+
A record that arrives mid-session can be missing from the nudge's titles until the next MCP
|
|
262
|
+
call. See the [hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
|
|
263
|
+
|
|
264
|
+
### Fixed
|
|
265
|
+
|
|
266
|
+
- **A finished background agent, an agent-team message or a `!` command's output no longer counts
|
|
267
|
+
as a typed prompt.** Claude Code writes each of these into the transcript as a `type: "user"`
|
|
268
|
+
line without the `isMeta` flag, so the `Stop` gate counted it: a session with one request and two
|
|
269
|
+
background agents passed the two-prompt gate at its first stop, and the capture nudge, which fires
|
|
270
|
+
once per session, was spent before there was anything to record. The gate now skips content that
|
|
271
|
+
starts `<task-notification>`, `<teammate-message` (the tag carries attributes, and is how a
|
|
272
|
+
teammate's own session receives a message), `Another Claude session sent a message` (how the
|
|
273
|
+
lead's session receives one) or `<bash-stdout>`, next to the three slash-command wrappers it
|
|
274
|
+
already skipped. It also skips a line that newer Claude Code marks with
|
|
275
|
+
`origin.kind: "task-notification"` or `promptSource: "system"`, which catches task
|
|
276
|
+
notifications written in plain prose. A slash command the
|
|
277
|
+
person typed, which starts `<command-message>`, and a `!` command's own `<bash-input>` still
|
|
278
|
+
count. Codex rollouts share the prefixes. See the
|
|
279
|
+
[hooks reference](docs/reference/hooks.md#sidegraph-stop).
|
|
280
|
+
- **A running MCP server sees a record that arrives mid-session.** The server keeps one `Store`,
|
|
281
|
+
and a `Store` checks the record files only when it is opened, so after a `git pull`
|
|
282
|
+
`get_task_context` and `retrieve_decisions` kept answering from the index as it stood until the
|
|
283
|
+
server restarted. The `PreToolUse` hook, which opened a `Store` on every call, was what
|
|
284
|
+
refreshed it, by accident. Every tool call now first re-checks the record files: a digest walk
|
|
285
|
+
(about 8 ms on 1,500 files), and a rebuild only when something changed. A filesystem error during
|
|
286
|
+
that check, such as a checkout deleting a record file mid-walk, does not fail the call: the tool
|
|
287
|
+
answers from the previous index and one line goes to stderr.
|
|
288
|
+
- **One record file that does not parse no longer switches memory off.** A merge that left
|
|
289
|
+
conflict markers in a decision, entity, fact or bindings file made the index rebuild raise, so
|
|
290
|
+
the store could not be opened: every hook fell back to "cannot open its store", and the MCP
|
|
291
|
+
server served nothing. The rebuild now skips such a file, whether it is invalid JSON, invalid
|
|
292
|
+
UTF-8, a wrong shape, rejected by its model or impossible to serialise, lists it as
|
|
293
|
+
`parse-error`, and loads the rest. The usual notice names the first such file, and
|
|
294
|
+
`sidegraph-verify` reports each of them; a file that fails validation no longer hides its
|
|
295
|
+
archived copy. A bindings file is skipped whole, so a half-valid file never leaves half of its
|
|
296
|
+
anchors in the index, and its record stays retrievable without them. A file that cannot be
|
|
297
|
+
opened at all (a permission or I/O error) still fails the open.
|
|
298
|
+
- **An archive line that cannot be read costs that line, not the store.** A line of an archive
|
|
299
|
+
segment that is not valid UTF-8 or JSON, or whose decision or domain fails its model, is skipped
|
|
300
|
+
with a warning in the rebuild, the rest of the segment loads, and the segment is listed as
|
|
301
|
+
`bad-archive-segment`. `sidegraph-verify` reports each such line with its segment and line
|
|
302
|
+
number. `sidegraph-compact` keeps the strict rule: it refuses to run over a segment it cannot
|
|
303
|
+
fully read and names the segment and the line (`--dry-run` included, with exit code 1 and no
|
|
304
|
+
traceback), and a hot file the rebuild left out no longer makes `--dry-run` fail with a bare
|
|
305
|
+
`JSONDecodeError`.
|
|
306
|
+
- **A file the rebuild left out is never overwritten.** With the store open again, a write that
|
|
307
|
+
recomputes a record's bindings from the index (`add_anchors`, `add_binding`) would have replaced
|
|
308
|
+
a conflicted bindings file with only the new anchor. All six canonical writers now refuse to
|
|
309
|
+
replace a listed file, with an error that names it. `add_anchors` checks first, so its refusal
|
|
310
|
+
leaves no orphan entity file behind. `supersede_decision` and `supersede_fact` refuse to inherit
|
|
311
|
+
anchors from a predecessor whose bindings file is skipped, since the successor would silently
|
|
312
|
+
start with none. `sidegraph-doctor` now says a skipped bindings file is skipped (unreadable),
|
|
313
|
+
not absent or empty. While an entity file is skipped, an anchor to the
|
|
314
|
+
same name mints a second entity, which `sidegraph-doctor`'s `duplicate-entity` check shows once
|
|
315
|
+
the file is fixed.
|
|
316
|
+
- **The skip warning no longer says "remove".** Removing a record file breaks the append-only
|
|
317
|
+
store, and removing an archive segment destroys every archived record in it. The warning now
|
|
318
|
+
says to restore the file with git or fix it by hand, and never to delete a segment. The
|
|
319
|
+
`store-files-skipped` notice says the same when the first listed file is an archive segment:
|
|
320
|
+
its lines that could not be read are left out, restore it with git, never delete it.
|
|
321
|
+
- **`sidegraph-verify` and `sidegraph-doctor` report what the rebuild leaves out.** They read an
|
|
322
|
+
archive segment as one string, so a line of invalid UTF-8 made them exit 1 with "store not
|
|
323
|
+
readable" and no file, and a line whose decision or domain fails its model was not reported at
|
|
324
|
+
all. They now split a segment into lines as bytes and report each bad line as
|
|
325
|
+
`bad-archive-segment`, with its segment and line number. A record file of invalid UTF-8, one
|
|
326
|
+
nested past the recursion limit and one that validates but cannot be serialised (a lone
|
|
327
|
+
surrogate) are `parse-error`s naming the file, where the first two exited 1 and the third
|
|
328
|
+
reported clean. A title holding U+2028 or U+0085 no longer gives a false `bad-archive-segment`.
|
|
329
|
+
- **Compacting a decision whose title holds U+2028 or U+0085 no longer leaves a store that will
|
|
330
|
+
not open.** The archive reader split a segment with `str.splitlines`, which breaks a line at
|
|
331
|
+
those characters (the segment holds them raw), so the next rebuild raised "corrupt archive
|
|
332
|
+
segment". A segment is now split as bytes, at `\n` and `\r` only.
|
|
333
|
+
|
|
10
334
|
## [0.8.0] — 2026-10-03
|
|
11
335
|
|
|
12
336
|
### 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.10.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.10.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,14 +75,16 @@ 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
|
```
|
|
80
82
|
|
|
81
83
|
```bash
|
|
82
84
|
# 3. Install the CLIs + MCP server, then bootstrap the store in your repo
|
|
83
|
-
# (creates .sidegraph/, prints setup instructions)
|
|
85
|
+
# (creates .sidegraph/, prints setup instructions). In a terminal it also asks
|
|
86
|
+
# whether to install a git hook that rebuilds the code graph after each commit,
|
|
87
|
+
# merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
|
|
84
88
|
uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
|
|
85
89
|
sidegraph-init
|
|
86
90
|
|
|
@@ -167,9 +171,13 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
167
171
|
next session ◀── SessionStart TOC anchored to entities in the
|
|
168
172
|
of named domains ◀── get_task_context ◀────── engine's graph (read-only);
|
|
169
173
|
mistakes first drill_down re-anchored after refactors
|
|
170
|
-
|
|
174
|
+
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
171
175
|
```
|
|
172
176
|
|
|
177
|
+
Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
|
|
178
|
+
subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
|
|
179
|
+
subagent that decision memory exists and how to ask it.
|
|
180
|
+
|
|
173
181
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
174
182
|
dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
|
|
175
183
|
graph is disposable — the engine regenerates it from source at any moment. The memory must
|
|
@@ -213,7 +221,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
|
|
|
213
221
|
| `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
|
|
214
222
|
| `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
|
|
215
223
|
| `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
|
|
216
|
-
| `retrieve_decisions` / `list_facts` |
|
|
224
|
+
| `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
|
|
217
225
|
| `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
|
|
218
226
|
| `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
|
|
219
227
|
| `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
|
|
@@ -245,16 +253,22 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
245
253
|
|
|
246
254
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
247
255
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
248
|
-
plus a local, gitignored index it can always rebuild.
|
|
256
|
+
plus a local, gitignored index it can always rebuild. Two things sit outside the store:
|
|
257
|
+
the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
|
|
258
|
+
three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
|
|
259
|
+
`${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
|
|
260
|
+
**Nothing leaves your machine** —
|
|
249
261
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
250
262
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
251
263
|
session touched afterwards) so you can see which memory was shown and which files
|
|
252
264
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
253
265
|
- **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
|
|
254
|
-
are stored. A ratification gate controls
|
|
255
|
-
`
|
|
256
|
-
|
|
257
|
-
|
|
266
|
+
are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
267
|
+
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
268
|
+
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
269
|
+
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|
|
270
|
+
at write time with a stamp that says so: lessons, gotchas, and standalone facts under
|
|
271
|
+
`auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
|
|
258
272
|
- **Nothing is silently rewritten.** The store is append-only; every change of mind is
|
|
259
273
|
recorded as a supersession with its reason.
|
|
260
274
|
|
|
@@ -267,7 +281,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
|
|
|
267
281
|
domains and retrieval still works, but symbol-level anchors, communities, and moved-code
|
|
268
282
|
resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
|
|
269
283
|
Everything the engine produces is derived and regenerated on every rebuild; everything
|
|
270
|
-
Sidegraph stores is deliberate
|
|
284
|
+
Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
|
|
285
|
+
person, or by the opt-in policy). **Own the memory, rent the graph.**
|
|
271
286
|
|
|
272
287
|
## Status
|
|
273
288
|
|
|
@@ -45,14 +45,16 @@ 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
|
```
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
# 3. Install the CLIs + MCP server, then bootstrap the store in your repo
|
|
55
|
-
# (creates .sidegraph/, prints setup instructions)
|
|
55
|
+
# (creates .sidegraph/, prints setup instructions). In a terminal it also asks
|
|
56
|
+
# whether to install a git hook that rebuilds the code graph after each commit,
|
|
57
|
+
# merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
|
|
56
58
|
uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
|
|
57
59
|
sidegraph-init
|
|
58
60
|
|
|
@@ -139,9 +141,13 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
139
141
|
next session ◀── SessionStart TOC anchored to entities in the
|
|
140
142
|
of named domains ◀── get_task_context ◀────── engine's graph (read-only);
|
|
141
143
|
mistakes first drill_down re-anchored after refactors
|
|
142
|
-
|
|
144
|
+
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
143
145
|
```
|
|
144
146
|
|
|
147
|
+
Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
|
|
148
|
+
subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
|
|
149
|
+
subagent that decision memory exists and how to ask it.
|
|
150
|
+
|
|
145
151
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
146
152
|
dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
|
|
147
153
|
graph is disposable — the engine regenerates it from source at any moment. The memory must
|
|
@@ -185,7 +191,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
|
|
|
185
191
|
| `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
|
|
186
192
|
| `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
|
|
187
193
|
| `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
|
|
188
|
-
| `retrieve_decisions` / `list_facts` |
|
|
194
|
+
| `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
|
|
189
195
|
| `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
|
|
190
196
|
| `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
|
|
191
197
|
| `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
|
|
@@ -217,16 +223,22 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
217
223
|
|
|
218
224
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
219
225
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
220
|
-
plus a local, gitignored index it can always rebuild.
|
|
226
|
+
plus a local, gitignored index it can always rebuild. Two things sit outside the store:
|
|
227
|
+
the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
|
|
228
|
+
three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
|
|
229
|
+
`${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
|
|
230
|
+
**Nothing leaves your machine** —
|
|
221
231
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
222
232
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
223
233
|
session touched afterwards) so you can see which memory was shown and which files
|
|
224
234
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
225
235
|
- **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
|
|
226
|
-
are stored. A ratification gate controls
|
|
227
|
-
`
|
|
228
|
-
|
|
229
|
-
|
|
236
|
+
are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
237
|
+
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
238
|
+
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
239
|
+
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|
|
240
|
+
at write time with a stamp that says so: lessons, gotchas, and standalone facts under
|
|
241
|
+
`auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
|
|
230
242
|
- **Nothing is silently rewritten.** The store is append-only; every change of mind is
|
|
231
243
|
recorded as a supersession with its reason.
|
|
232
244
|
|
|
@@ -239,7 +251,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
|
|
|
239
251
|
domains and retrieval still works, but symbol-level anchors, communities, and moved-code
|
|
240
252
|
resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
|
|
241
253
|
Everything the engine produces is derived and regenerated on every rebuild; everything
|
|
242
|
-
Sidegraph stores is deliberate
|
|
254
|
+
Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
|
|
255
|
+
person, or by the opt-in policy). **Own the memory, rent the graph.**
|
|
243
256
|
|
|
244
257
|
## Status
|
|
245
258
|
|
|
@@ -25,10 +25,21 @@ Sidegraph is a local-only tool. Its entire data surface:
|
|
|
25
25
|
the visualization, OKF export and bootstrap-report commands write to the output paths you
|
|
26
26
|
give them; and the optional `sidegraph-prepare-commit-msg` git hook, once you install it,
|
|
27
27
|
adds commented decision trailers to the commit message file git hands it
|
|
28
|
-
(normally `.git/COMMIT_EDITMSG`).
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
(normally `.git/COMMIT_EDITMSG`). Three more writes sit outside the repository's own
|
|
29
|
+
files. `sidegraph-init --hooks` (or a yes to its refresh question) writes a helper script
|
|
30
|
+
and a marked block in three git hooks (`post-commit`, `post-merge`, `post-checkout`) under
|
|
31
|
+
`.git/hooks/`. When `core.hooksPath` is set, `sidegraph-init` writes only the helper (to
|
|
32
|
+
`.git/hooks/`) and prints the lines to add to your hooks by hand. While it runs, the helper
|
|
33
|
+
also keeps a lock, a flag file and a log in the git directory. `sidegraph-init --no-hooks`
|
|
34
|
+
writes the git config key `sidegraph.graphRefresh` to the repository's own config, and
|
|
35
|
+
`sidegraph-init --remove-hooks` takes the blocks, the helper and that key out again. The
|
|
36
|
+
SessionStart hook writes one 40-character commit id to
|
|
37
|
+
`${XDG_CACHE_HOME:-~/.cache}/sidegraph/launch-commit`, and only when the running package was
|
|
38
|
+
installed from the canonical `git+https://github.com/SantyagoSeaman/sidegraph.git@main`. That
|
|
39
|
+
covers the plugin and the manual `uvx --from …@main` recipe. A PyPI, tag, SHA or editable
|
|
40
|
+
install never writes it. Beyond those, the only filesystem writes are the standard config
|
|
41
|
+
snippets you install yourself (`.mcp.json`, hook entries). See
|
|
42
|
+
[`docs/reference/store-format.md`](docs/reference/store-format.md) for the full layout.
|
|
32
43
|
- **Network:** none. No remote telemetry, no phone-home, nothing leaves your machine. Local
|
|
33
44
|
retrieval telemetry is recorded in the gitignored `index.db` by default (which records
|
|
34
45
|
were shown and which files were touched, never uploaded); set `SIDEGRAPH_TELEMETRY=off` to
|
|
@@ -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`
|
|
@@ -105,7 +105,7 @@ write below — the three raw authoring paths underneath it are:
|
|
|
105
105
|
asked to) names a domain directly, optionally nesting it under a `parent_slug`.
|
|
106
106
|
|
|
107
107
|
All three land `status=proposed`. **Every path passes through the same ratification gate** —
|
|
108
|
-
the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, kept
|
|
108
|
+
the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, still kept)
|
|
109
109
|
and the `sidegraph-ratify` CLI, which list and accept/drop decisions *and* domains side by
|
|
110
110
|
side. By default no path bypasses human review, including bootstrap: a fresh repo can
|
|
111
111
|
propose dozens of domains from its community structure in one command, but nothing is named
|