sidegraph 0.7.0__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sidegraph-0.7.0 → sidegraph-0.8.0}/CHANGELOG.md +126 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/CLAUDE.md +1 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/PKG-INFO +1 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/README.md +1 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/retrieval.md +14 -4
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/retrieval-in-sessions.md +17 -6
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/semantic-docs.md +2 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/team-workflow.md +22 -0
- sidegraph-0.8.0/docs/guides/troubleshooting.md +221 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/integrations/claude-code.md +4 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/integrations/graphify.md +67 -22
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/llms.txt +1 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/cli.md +93 -10
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/git-bindings.md +5 -3
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/hooks.md +118 -6
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/mcp-tools.md +150 -14
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/stability.md +4 -3
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/store-format.md +11 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/SKILL.md +11 -6
- {sidegraph-0.7.0 → sidegraph-0.8.0}/pyproject.toml +1 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/capture.py +20 -21
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/cli.py +319 -9
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/doctor.py +96 -49
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/engine/reader.py +48 -0
- sidegraph-0.8.0/src/sidegraph/githooks.py +556 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/host/hooks.py +262 -104
- sidegraph-0.8.0/src/sidegraph/integrity.py +1098 -0
- sidegraph-0.8.0/src/sidegraph/nearest_anchored.py +305 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/retrieval.py +89 -3
- sidegraph-0.8.0/src/sidegraph/seed_ladder.py +604 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/server.py +278 -75
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/stats/model.py +62 -8
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/stats/render.py +20 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/sync.py +6 -5
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/verify.py +38 -3
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/conftest.py +19 -0
- sidegraph-0.8.0/tests/githooks_support.py +194 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_doctor.py +3 -2
- sidegraph-0.8.0/tests/test_cli_init_hooks.py +598 -0
- sidegraph-0.8.0/tests/test_doctor_integrity.py +206 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_scan.py +20 -0
- sidegraph-0.8.0/tests/test_git_config_isolation.py +51 -0
- sidegraph-0.8.0/tests/test_githooks.py +977 -0
- sidegraph-0.8.0/tests/test_host_integrity.py +1024 -0
- sidegraph-0.8.0/tests/test_integrity.py +731 -0
- sidegraph-0.8.0/tests/test_integrity_refresh_hook.py +296 -0
- sidegraph-0.8.0/tests/test_integrity_replay.py +113 -0
- sidegraph-0.8.0/tests/test_integrity_stranded.py +864 -0
- sidegraph-0.8.0/tests/test_nearest_anchored.py +59 -0
- sidegraph-0.8.0/tests/test_reader_member_name_lookup.py +193 -0
- sidegraph-0.8.0/tests/test_retrieval_guessed.py +442 -0
- sidegraph-0.8.0/tests/test_seed_ladder.py +1073 -0
- sidegraph-0.8.0/tests/test_server_commit_hint.py +217 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_graph_freshness.py +32 -18
- sidegraph-0.8.0/tests/test_server_nearest_anchored.py +731 -0
- sidegraph-0.8.0/tests/test_server_tolerant_seeds.py +650 -0
- sidegraph-0.8.0/tests/test_stats_health.py +205 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_render.py +42 -2
- sidegraph-0.8.0/tests/test_store_git_root_symlink.py +355 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/uv.lock +11 -11
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.gitignore +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.gitleaks.toml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/.python-version +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/AGENTS.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/LICENSE +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/README.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/SECURITY.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/data-model.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/bootstrap.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/claude-code-setup.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/codex-setup.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/installation.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/quickstart.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/capturing-decisions.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/integrations/codex.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/configuration.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/operations.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/releasing.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/config.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/schema.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/store.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/__init__.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_config.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doc_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_stop.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_importer.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_okf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_ratify_policy.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_compact_review.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_verify_snapshot.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.7.0 → sidegraph-0.8.0}/tools/check_no_session_links.py +0 -0
|
@@ -7,6 +7,132 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] — 2026-10-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`get_task_context` says where the memory is when your file has none.** A file seed the graph
|
|
15
|
+
lacks, or one that resolved with no current record anchored to it, now gets a `## Nearest anchored`
|
|
16
|
+
sentence naming up to three files that do carry records: the graph neighbours first (the two
|
|
17
|
+
with the most records), then the files under the nearest directory that has any, skipping a
|
|
18
|
+
directory that holds more than a quarter of all anchored files (and more than four) and never
|
|
19
|
+
the repository root.
|
|
20
|
+
When the answer has no decision memory at all, the records of those files follow under `##
|
|
21
|
+
Nearest anchored records (not anchored to your files)`, labelled as not about your files, with
|
|
22
|
+
the same supersede line the main answer carries. An empty answer carries the sentence under `##
|
|
23
|
+
Why this is empty`. At most three seeds get a sentence. The records count as shown in
|
|
24
|
+
`sidegraph-stats`, and the neighbour files are never recorded as seeds. See
|
|
25
|
+
[the tool reference](docs/reference/mcp-tools.md#the-nearest-anchored-records).
|
|
26
|
+
|
|
27
|
+
- **Records that never reach the team are now visible.** A record follows the branch and
|
|
28
|
+
checkout it was written on, and on one field corpus two supersessions sat uncommitted for five
|
|
29
|
+
days and 32 proposals lived only on branches that `main`'s session start never saw. Two new
|
|
30
|
+
checks run at session start. `store-uncommitted` (degraded, with a notice, also in
|
|
31
|
+
`sidegraph-doctor` and `sidegraph-stats`) reports store files nobody committed for a day, aged
|
|
32
|
+
by the ULID in a new file's name (a `git stash` cannot rewrite it) and by the modification time
|
|
33
|
+
otherwise; fully staged files do not count, so `sidegraph-doctor --check` in a pre-commit hook
|
|
34
|
+
never blocks the fixing commit. `branch-only-records` (advisory) scans every unmerged local branch,
|
|
35
|
+
oldest first, for open records the default branch lacks (each counted once, for the newest
|
|
36
|
+
branch that holds it), and sends a notice when such a branch is more than a week old: the fix is
|
|
37
|
+
to merge it. The write tools (`add_decision`,
|
|
38
|
+
`supersede_decision`, `add_fact`, `supersede_fact`, `add_anchors`, `add_domain`,
|
|
39
|
+
`supersede_domain`, and the written elements of `propose_decisions` and `propose_domains`) add a
|
|
40
|
+
`commit_hint` to their result when the store is inside a git repository, except a store that is a
|
|
41
|
+
symlink to a directory outside it: git commits the link, not the records behind it. Where records
|
|
42
|
+
are written does not change. See the
|
|
43
|
+
[troubleshooting guide](docs/guides/troubleshooting.md#store-uncommitted) and the
|
|
44
|
+
[MCP tools reference](docs/reference/mcp-tools.md#commit-hint).
|
|
45
|
+
|
|
46
|
+
- **Sidegraph tells you when it needs attention, not only the model.** One list of integrity
|
|
47
|
+
checks now runs at every session start and in `sidegraph-doctor` and `sidegraph-stats`. The model
|
|
48
|
+
still gets a status line per problem, with the five existing lines unchanged and in the same
|
|
49
|
+
order. Problems that need a person also reach you as a `systemMessage`, which Claude Code shows as
|
|
50
|
+
a warning: at most once a day for each check, again at once when a problem gets worse, and not
|
|
51
|
+
again once the check finds nothing. New checks: a store that cannot be opened (a merge conflict
|
|
52
|
+
left in `.sidegraph/`, a damaged index, a store written by another version) now says so and
|
|
53
|
+
names the fix instead of switching memory off silently; a missing or unreadable code graph;
|
|
54
|
+
open records whose every code anchor is orphaned (degraded, with a notice, when three or more were
|
|
55
|
+
written in the last 14 days; advisory otherwise); and store files the last reload could not
|
|
56
|
+
index. A proposal that has waited 30 days earns a notice too. `sidegraph-doctor` gains an
|
|
57
|
+
`orphaned-record` finding and, with no graph, a skipped-checks line (`"graph"` in `--json`'s
|
|
58
|
+
`skipped`) instead of a finding, so `--check` does not start failing CI jobs that run without
|
|
59
|
+
one. `sidegraph-stats` opens with a `HEALTH` line (`health` in `--json`). The checks, their
|
|
60
|
+
severities and fixes are in the new [troubleshooting guide](docs/guides/troubleshooting.md), and
|
|
61
|
+
the output is in the [hooks reference](docs/reference/hooks.md#notices-for-the-human).
|
|
62
|
+
|
|
63
|
+
- **`sidegraph-init` asks whether to keep the code graph fresh, and installs the hook that does
|
|
64
|
+
it.** A graph nobody rebuilds goes stale, and on one field corpus it fell 314 commits behind
|
|
65
|
+
because the setup hint was printed and skipped. In a terminal, init now asks once (default yes);
|
|
66
|
+
`--hooks` installs without asking, `--no-hooks` declines and records it
|
|
67
|
+
(`git config sidegraph.graphRefresh false`), and `--remove-hooks` takes everything out and exits
|
|
68
|
+
without creating a store (it exits 1, and says the removal was partial, when a hook is a symlink
|
|
69
|
+
or has damaged markers and so keeps its block). The hook is a marked block in `post-commit`, `post-merge` and
|
|
70
|
+
`post-checkout`, inserted right after the shebang line so that a foreign hook that ends in `exit`
|
|
71
|
+
cannot skip it, plus a helper that rebuilds the graph in the background, in the main checkout
|
|
72
|
+
only (a linked worktree reads its graph), one rebuild at a time. It never replaces a hook: one that
|
|
73
|
+
is a symlink, not executable, CRLF or not a shell script is left alone and the line to add by hand
|
|
74
|
+
is printed. With `core.hooksPath` set it writes no hook file and prints the lines instead. Without
|
|
75
|
+
a terminal nothing is written, and a new advisory check, `refresh-hook-missing`, tells the model
|
|
76
|
+
to ask you, and tells you once a day, until the hook is installed or declined. A call you add by hand
|
|
77
|
+
counts only when its hook is executable and the call is not in a comment. The three flags are
|
|
78
|
+
a Committed surface ([stability](docs/reference/stability.md)); see
|
|
79
|
+
[keeping the graph fresh](docs/integrations/graphify.md#keeping-the-graph-fresh-git-hooks) and the
|
|
80
|
+
[troubleshooting guide](docs/guides/troubleshooting.md#refresh-hook-missing).
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
|
|
84
|
+
- **`get_task_context` reads a wrong seed the way you meant it, and an empty answer says why.**
|
|
85
|
+
A seed the graph does not hold as written used to come back as "No context found." Now `./x.py`,
|
|
86
|
+
`x.py:12`, an absolute path inside the repository, a missing or invented directory prefix, a bare
|
|
87
|
+
file name, a directory, and a `Type.member` with no file are read through a short ladder, and a
|
|
88
|
+
`## How your seeds were read` block says what each one became and that a rewrite is a guess. A
|
|
89
|
+
file that exists on disk but not in the graph is never swapped for a namesake. A directory reads
|
|
90
|
+
as up to eight files, or is listed when it holds more than 24. A path that differs from a graph
|
|
91
|
+
file only by letter case reads as that file, even on a case-insensitive filesystem. A path or
|
|
92
|
+
name that could mean several is reported and read as none. Guessed seeds rank in the related
|
|
93
|
+
tier below the seeds you got right. The not-in-graph block now names the normalised path, so
|
|
94
|
+
`./pkg/n.py` gets the stale-or-new advice instead of "check the path". A name with no file that
|
|
95
|
+
matches several symbols is no longer expanded to all of them: it is reported as ambiguous. A call
|
|
96
|
+
with no seeds at all names the accepted domains you can drill into. Telemetry records a rewritten
|
|
97
|
+
path under the path that was read and a directory under its normalised key, and keeps a seed
|
|
98
|
+
whose name starts with `..` that it used to drop. See
|
|
99
|
+
[the tool reference](docs/reference/mcp-tools.md#seeds-are-read-tolerantly).
|
|
100
|
+
|
|
101
|
+
### Fixed
|
|
102
|
+
|
|
103
|
+
- **A symlinked store's capture commit, code drift and refresh-hook check come from the project
|
|
104
|
+
that holds the link.** A store can be a symlink (`.sidegraph -> ../shared/store`). Its records
|
|
105
|
+
are anchored to code in the project that holds the link, but git resolved the link and answered
|
|
106
|
+
for the repository it points into: `provenance.commit` named that repository's `HEAD`, or was
|
|
107
|
+
empty when the target sits in no repository, so the code-drift check passed silently or never
|
|
108
|
+
ran, and the refresh-hook check read the wrong hooks. Capture now stamps the project's `HEAD`
|
|
109
|
+
(empty while the project has no commits), the code-drift check diffs it in the project's
|
|
110
|
+
repository, and the refresh-hook check reads the project's hooks and recorded choice, the ones
|
|
111
|
+
`sidegraph-init` writes. A store that is not a symlink behaves as before, and
|
|
112
|
+
`--against` (`sidegraph-verify`, `sidegraph-doctor`) still diffs the history of the repository
|
|
113
|
+
that holds the store's files. Three behaviour changes come with it. A store directory that is itself a repository or
|
|
114
|
+
submodule inside another repository now stamps the enclosing project's `HEAD` and measures drift
|
|
115
|
+
there, and its refresh-hook check now runs against the enclosing project; a top-level store
|
|
116
|
+
repository with no enclosing one is unchanged. A record stamped before the fix with the link
|
|
117
|
+
target's (or the nested repository's) `HEAD` now gets `sidegraph-doctor`'s existing
|
|
118
|
+
`code-drift: git unavailable — check skipped` note for that commit, where it used to pass
|
|
119
|
+
silently. And the records of a symlinked store now match in git-bindings rule (a) and in
|
|
120
|
+
`sidegraph-blame`, which read `provenance.commit`. See [the store
|
|
121
|
+
format](docs/reference/store-format.md).
|
|
122
|
+
|
|
123
|
+
### Security
|
|
124
|
+
|
|
125
|
+
- **The lockfile moves `PyJWT` from 2.13.0 to 2.15.1 and `virtualenv` from 21.7.0 to
|
|
126
|
+
21.14.4.** The PyJWT 2.14.0 and 2.15.0 fixes cover one critical advisory (an asymmetric
|
|
127
|
+
PEM key with mutated whitespace skips the HMAC key-confusion guard), five high ones (key
|
|
128
|
+
material accepted as HMAC secrets, JWKS redirects, a BOM bypass) and several moderate
|
|
129
|
+
ones. The virtualenv fixes cover seed wheels that were not integrity-checked and
|
|
130
|
+
activation scripts that run commands embedded in a path or a prompt. PyJWT reaches Sidegraph only
|
|
131
|
+
through the MCP SDK's `crypto` extra, and Sidegraph never decodes a token; virtualenv is
|
|
132
|
+
a development dependency through pre-commit. The published package pins neither, so this
|
|
133
|
+
changes development and CI environments and installs made from `uv.lock`; a fresh install
|
|
134
|
+
already resolves fixed versions.
|
|
135
|
+
|
|
10
136
|
## [0.7.0] — 2026-10-02
|
|
11
137
|
|
|
12
138
|
### 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.8.0) — the full loop (capture, ratification, mistakes-first
|
|
17
17
|
retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
|
|
18
18
|
facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
|
|
19
19
|
a stable release. See
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine.
|
|
5
5
|
Project-URL: Homepage, https://github.com/SantyagoSeaman/sidegraph
|
|
6
6
|
Project-URL: Repository, https://github.com/SantyagoSeaman/sidegraph
|
|
@@ -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).
|
|
@@ -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
|
|
@@ -80,8 +80,16 @@ seeds that resolve to the right part of the graph:
|
|
|
80
80
|
- An **entity seed** (`entities=[{"name": "Trader", "file_path": "trader/exec.py"}]`) resolves
|
|
81
81
|
through the same name+file matching `add_decision`'s anchors use.
|
|
82
82
|
|
|
83
|
+
A seed does not have to be spelled the way the graph spells it. `./trader/exec.py`,
|
|
84
|
+
`trader/exec.py:42`, `exec.py` and an absolute path inside the repository all read as the same
|
|
85
|
+
file, a directory (`trader/`) reads as up to eight of its files, and `Trader.place` finds the
|
|
86
|
+
method with no file at all. Each such rewrite is a guess, and the reply says so in a
|
|
87
|
+
`## How your seeds were read` block. When a name could mean several files or symbols, the tool
|
|
88
|
+
lists them and reads none: pass the repo-relative path.
|
|
89
|
+
|
|
83
90
|
Vague, non-task questions ("what does this project do") don't give the tool anything to seed
|
|
84
|
-
on — be concrete about the file or symbol so the retrieval has something to resolve.
|
|
91
|
+
on — be concrete about the file or symbol so the retrieval has something to resolve. A call with
|
|
92
|
+
no seeds at all says so, and names the domains you can drill into.
|
|
85
93
|
|
|
86
94
|
## Reading the output blocks
|
|
87
95
|
|
|
@@ -97,11 +105,14 @@ entirely if empty:
|
|
|
97
105
|
| `## Related` | Accepted decisions reached indirectly, plus one-line superseded history for seed entities. |
|
|
98
106
|
| `## Unratified proposals` | Proposed decisions and facts, always after accepted memory and omitted by the proposal policy when required. |
|
|
99
107
|
|
|
100
|
-
If nothing resolves at all, the tool returns the literal string `No context found
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
108
|
+
If nothing resolves at all, the tool returns the literal string `No context found.`, followed
|
|
109
|
+
by a block that says why. A seed that was read some other way than written gets a
|
|
110
|
+
`## How your seeds were read` line (guessed, normalised, a directory, ambiguous, or a name that
|
|
111
|
+
matches no symbol). If a file you passed is not in the code graph, a trailing
|
|
112
|
+
`## Not in the code graph` block says why: the graph is stale and needs `graphify update .`, the
|
|
113
|
+
file is newer than the build or one the engine skips, or the path names no file in the
|
|
114
|
+
repository (see [`get_task_context`](../reference/mcp-tools.md#get_task_context)). A call with no
|
|
115
|
+
seeds gets a `## Why this is empty` block. With no
|
|
105
116
|
code graph at all, a trailing `## No code graph` block names the path that was looked at and says
|
|
106
117
|
to build it: the graph is missing, so memory anchored to code could not be looked up. In a
|
|
107
118
|
linked worktree the graph is the main checkout's, and a file that exists only on the branch is
|
|
@@ -31,7 +31,8 @@ graphify update .
|
|
|
31
31
|
graphify extract . --backend claude
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
`graphify update .` stays your per-commit default
|
|
34
|
+
`graphify update .` stays your per-commit default, and it is what the graph refresh hook runs
|
|
35
|
+
after each commit in the main checkout (`sidegraph-init --hooks`; see
|
|
35
36
|
[`integrations/graphify.md`](../integrations/graphify.md#keeping-the-graph-fresh-git-hooks)).
|
|
36
37
|
`graphify extract` is a separate, explicit step — run it after documentation changes
|
|
37
38
|
meaningfully, not on every commit.
|
|
@@ -33,6 +33,28 @@ might Graphify's `graph.json` — that one really is regenerated on every build;
|
|
|
33
33
|
store is the opposite, deliberately durable, and is the one piece of Sidegraph's state that
|
|
34
34
|
must survive a laptop being wiped.
|
|
35
35
|
|
|
36
|
+
## Writes that never reach the team
|
|
37
|
+
|
|
38
|
+
A record follows the branch and the checkout it was written on, because the store is committed
|
|
39
|
+
with the repository. Two things strand one without anyone noticing:
|
|
40
|
+
|
|
41
|
+
- **It was never committed.** An agent wrote a decision or a supersession into the checkout, a
|
|
42
|
+
later session took it for a foreign change and kept it out of every pull request, and it sat
|
|
43
|
+
there for days. Other checkouts and teammates never saw it, and a `git clean` or a re-clone
|
|
44
|
+
would lose it.
|
|
45
|
+
- **It sits on a branch nobody merges.** A proposal made on a feature branch is invisible to
|
|
46
|
+
`main`'s session start, which counts the proposals it can see, until the branch merges.
|
|
47
|
+
|
|
48
|
+
Sidegraph says so instead of changing where records go. A write tool's result carries a
|
|
49
|
+
`commit_hint` when the store is inside a git repository ([MCP tools](../reference/mcp-tools.md#commit-hint)).
|
|
50
|
+
At session start, two checks look: `store-uncommitted` reports store files that stayed
|
|
51
|
+
uncommitted for a day, and `branch-only-records` reports records that exist only on unmerged
|
|
52
|
+
local branches, with a notice when such a branch is more than a week old
|
|
53
|
+
([troubleshooting](troubleshooting.md#store-uncommitted)). The fix is the ordinary one: commit
|
|
54
|
+
`.sidegraph/` in the same pull request as the work that produced the records, and merge the
|
|
55
|
+
branch that holds the rest. A pre-commit hook that runs `sidegraph-doctor --check` is safe, since
|
|
56
|
+
files that are fully staged do not count.
|
|
57
|
+
|
|
36
58
|
## Ratification as part of PR review
|
|
37
59
|
|
|
38
60
|
Because each decision is its own small file, a raw `git diff` on a branch that ratified
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Troubleshooting: what Sidegraph tells you, and what to do
|
|
2
|
+
|
|
3
|
+
Sidegraph used to degrade without a word. The graph fell hundreds of commits behind, records
|
|
4
|
+
were written with every anchor orphaned, a merge conflict in `.sidegraph/` switched memory off,
|
|
5
|
+
and the only place any of it showed was a line in the model's context. Now one list of integrity
|
|
6
|
+
checks runs at every session start and says what needs fixing, to the person as well as to the
|
|
7
|
+
model.
|
|
8
|
+
|
|
9
|
+
- **The model** gets one status line per problem, at every session start, in the context the hook
|
|
10
|
+
injects. The model forgets between sessions, so these are not rationed.
|
|
11
|
+
- **You** get a notice, shown by the host as a warning, for the problems that need you. A notice
|
|
12
|
+
comes at most once a day for each check, comes again at once when a problem gets worse, and
|
|
13
|
+
stops when the check finds nothing. The text names the fix.
|
|
14
|
+
|
|
15
|
+
`sidegraph-doctor` lists the same problems record by record, and `sidegraph-stats` leads with a
|
|
16
|
+
`HEALTH` line. Both read the store without writing to it.
|
|
17
|
+
|
|
18
|
+
## The checks
|
|
19
|
+
|
|
20
|
+
| Check | Severity | What it means | Shows in | Fix |
|
|
21
|
+
|---|---|---|---|---|
|
|
22
|
+
| `store-unreadable` | broken | The store cannot be opened, so memory is off for the session | session notice and line | `sidegraph-verify`, or remove the damaged index |
|
|
23
|
+
| `pending-ratification` | advisory | Proposals await a human's verdict | session line; a notice once the oldest is 30 days old | `sidegraph-ratify` |
|
|
24
|
+
| `code-drift` | advisory | Records are anchored to code that changed after their capture | session line | `sidegraph-doctor` |
|
|
25
|
+
| `graph-borrowed` | advisory | A linked worktree reads the main checkout's graph | session line | none needed |
|
|
26
|
+
| `graph-stale` | degraded | The graph was built at a commit `HEAD` has moved past | session line and notice, doctor, stats | `graphify update .` |
|
|
27
|
+
| `stray-store` | degraded | A subdirectory launch created a second, empty store | session line and notice | remove the empty store |
|
|
28
|
+
| `graph-missing` | advisory | There is no graph, or it cannot be read | session line | `graphify update .` |
|
|
29
|
+
| `orphaned-records` | degraded or advisory | Open records whose every code anchor is orphaned | session line; notice and stats when degraded; doctor | `sidegraph-doctor` |
|
|
30
|
+
| `store-files-skipped` | degraded | Store files the last reload could not index | session line and notice, stats | `sidegraph-verify` |
|
|
31
|
+
| `refresh-hook-missing` | advisory | No git hook keeps the code graph fresh | session line and notice | `sidegraph-init --hooks`, or `--no-hooks` to stop the reminder |
|
|
32
|
+
| `store-uncommitted` | degraded | Store files nobody committed for a day | session line and notice, doctor, stats | commit `.sidegraph/` in a pull request |
|
|
33
|
+
| `branch-only-records` | advisory | Records that exist only on unmerged branches | session line; a notice when a branch is a week old | merge the branch |
|
|
34
|
+
|
|
35
|
+
Severity decides who is told. **Broken** means memory does not work now. **Degraded** means it
|
|
36
|
+
works worse than it should, so you get a notice and `sidegraph-stats` shows it. **Advisory**
|
|
37
|
+
means something worth knowing, which the model's line and the commands above report. Three
|
|
38
|
+
advisory checks also send a notice, because the fix is yours to decide: a proposal queue that
|
|
39
|
+
has waited 30 days, a missing refresh hook, and records on a branch that has not moved for a
|
|
40
|
+
week.
|
|
41
|
+
|
|
42
|
+
### store-unreadable
|
|
43
|
+
|
|
44
|
+
Sidegraph could not open `.sidegraph/`. The notice names the store path, the exception and a fix
|
|
45
|
+
that depends on the exception:
|
|
46
|
+
|
|
47
|
+
- A merge conflict left in a record file, or a record that does not validate: run
|
|
48
|
+
`sidegraph-verify` from the repository root to find the file, then resolve the conflict.
|
|
49
|
+
- A damaged or read-only `index.db`: it is derived and safe to delete. Remove
|
|
50
|
+
`.sidegraph/index.db` and start a new session; it is rebuilt from the committed files. When
|
|
51
|
+
there is no `index.db` to remove, or the database could not be opened at all (a read-only store
|
|
52
|
+
directory, a `.sidegraph` that is a plain file), the advice is the generic one below instead.
|
|
53
|
+
- A store written by a different Sidegraph version: upgrade Sidegraph, or use the version that
|
|
54
|
+
wrote it. Migration tooling is deferred.
|
|
55
|
+
- Anything else: `sidegraph-verify` gives the details.
|
|
56
|
+
|
|
57
|
+
A lock that another process holds is not a broken store. The hook stays silent for it, and the
|
|
58
|
+
next session start opens the store.
|
|
59
|
+
|
|
60
|
+
### pending-ratification
|
|
61
|
+
|
|
62
|
+
Proposals nobody has ratified. The model's line gives the counts and the age of the oldest. When
|
|
63
|
+
the oldest is 30 days old, you also get a notice. Review the queue with `sidegraph-ratify`, or ask
|
|
64
|
+
the agent to use the ratify tool. `SIDEGRAPH_RATIFY_NUDGE=off` silences both the line and the
|
|
65
|
+
notice.
|
|
66
|
+
|
|
67
|
+
### code-drift
|
|
68
|
+
|
|
69
|
+
Records whose anchored files changed after their capture. The line says how many. It is the
|
|
70
|
+
agent's work to supersede the ones that no longer hold, so there is no notice. `sidegraph-doctor`
|
|
71
|
+
lists them as `code-drift` findings, and the `sidegraph:triage-drift` skill walks them.
|
|
72
|
+
`SIDEGRAPH_DRIFT_NUDGE=off` silences the line.
|
|
73
|
+
|
|
74
|
+
### graph-borrowed
|
|
75
|
+
|
|
76
|
+
A linked worktree has no graph of its own and reads the main checkout's. Code that exists only on
|
|
77
|
+
the worktree's branch is not in that graph. Nothing is wrong, and nothing needs doing unless you
|
|
78
|
+
want the graph to include the branch: build one in the worktree with `graphify update .`.
|
|
79
|
+
|
|
80
|
+
### graph-stale
|
|
81
|
+
|
|
82
|
+
The graph's build commit is behind `HEAD`, and a file the graph should hold has changed or
|
|
83
|
+
appeared since. Memory cannot see or anchor to code added after the build. Run
|
|
84
|
+
`graphify update .` from the repository root. In a worktree that borrows the main checkout's
|
|
85
|
+
graph, rebuild it there. A graph that cannot be compared with `HEAD` (no recorded build commit, a
|
|
86
|
+
graph outside a git repository, git unavailable) is not reported, and a recorded notice survives
|
|
87
|
+
the start where it could not be compared.
|
|
88
|
+
|
|
89
|
+
### stray-store
|
|
90
|
+
|
|
91
|
+
An older Sidegraph created an empty store beside the directory a session was started in, and the
|
|
92
|
+
repository's own store, with the records, sits above it. The session uses the empty one. Remove
|
|
93
|
+
the empty store, as the notice names it, to use the repository's.
|
|
94
|
+
|
|
95
|
+
### graph-missing
|
|
96
|
+
|
|
97
|
+
No code graph where Sidegraph looked, or one that could not be read. Memory still works from the
|
|
98
|
+
store, but it cannot match files to records or anchor new ones. Build the graph from the
|
|
99
|
+
repository root: `graphify update .`. This is advisory, because a corpus of documents only runs
|
|
100
|
+
without a graph. It is a model line only, and `sidegraph-doctor` reports it as a skipped check,
|
|
101
|
+
never as a finding.
|
|
102
|
+
|
|
103
|
+
### orphaned-records
|
|
104
|
+
|
|
105
|
+
Open decisions and facts whose every leaf anchor is orphaned: retrieval reaches them only through
|
|
106
|
+
their file or domain. If the graph is stale, rebuilding it re-anchors them. Otherwise
|
|
107
|
+
`sidegraph-doctor` lists each record as an `orphaned-record` finding, and the
|
|
108
|
+
`sidegraph:heal-anchors` skill repairs them, by re-anchoring with `add_anchors` or by superseding a
|
|
109
|
+
record whose code is gone.
|
|
110
|
+
|
|
111
|
+
The severity depends on how old the records are. **Three or more written in the last 14 days** is
|
|
112
|
+
degraded: anchoring is failing now, as when a batch of proposals lands with its anchors orphaned
|
|
113
|
+
at once. Anything older is advisory, curation debt that does not need a notice. The thresholds are
|
|
114
|
+
unmeasured beyond two points.
|
|
115
|
+
|
|
116
|
+
The statuses live in the derived index and are recomputed by a sync. Right after a reload, such as
|
|
117
|
+
a `git pull` that changed a record, every anchor reads live until the next sync, so the check does
|
|
118
|
+
not run then and a recorded notice is kept. `sidegraph-doctor` lists `orphaned-records` among its
|
|
119
|
+
skipped checks until then; `sidegraph-sync` recomputes the statuses.
|
|
120
|
+
|
|
121
|
+
### store-files-skipped
|
|
122
|
+
|
|
123
|
+
Files under `.sidegraph/` that the last reload could not index, usually because a record's id does
|
|
124
|
+
not match its file name. They are left out of memory. The notice names the first file and the
|
|
125
|
+
reason. Run `sidegraph-verify` to list them all, then fix or restore them with git.
|
|
126
|
+
|
|
127
|
+
### refresh-hook-missing
|
|
128
|
+
|
|
129
|
+
No git hook rebuilds the code graph when it goes stale, so it will fall behind as code changes.
|
|
130
|
+
The helper `sidegraph-graph-refresh` is missing, or one of `post-commit`, `post-merge` and
|
|
131
|
+
`post-checkout` does not call it (in the `core.hooksPath` directory when that is set). The
|
|
132
|
+
model's line tells the agent to ask you and not to install anything unasked. Run
|
|
133
|
+
`sidegraph-init --hooks` to install the hook, or `sidegraph-init --no-hooks` to stop the
|
|
134
|
+
reminder (it records `sidegraph.graphRefresh=false` in the repository's git config; a global
|
|
135
|
+
`false` works too). What the hook does and where it goes:
|
|
136
|
+
[keeping the graph fresh](../integrations/graphify.md#keeping-the-graph-fresh-git-hooks).
|
|
137
|
+
|
|
138
|
+
If the hook is installed and the graph still goes stale, read `sidegraph-graph-refresh.log` in
|
|
139
|
+
the repository's git directory (the output of the last rebuild), then re-run
|
|
140
|
+
`sidegraph-init --hooks`: it rewrites the helper and clears a lock that a job which died left
|
|
141
|
+
behind (the helper also clears one by itself, by its pid or, when the job never wrote one, after
|
|
142
|
+
ten minutes). One case is not detected: after a reboot a recorded pid can belong to a live,
|
|
143
|
+
unrelated process, and the hook then waits until that process exits.
|
|
144
|
+
|
|
145
|
+
The check does not run in a repository without a graph, so a corpus of documents is never
|
|
146
|
+
nagged, nor when the graph is somewhere other than `graphify-out/graph.json` at the main
|
|
147
|
+
checkout's root, the only one the hook rebuilds. A linked worktree that borrows the main
|
|
148
|
+
checkout's graph is checked, because the hooks are shared; one with a graph of its own, a store
|
|
149
|
+
in a subdirectory, and a bare repository with worktrees (no main checkout) are not. A call added
|
|
150
|
+
by hand to a hook counts as installed, which
|
|
151
|
+
is how a hooks-manager setup (Husky, lefthook, pre-commit) clears it. A hook counts only when git
|
|
152
|
+
would run it and the call would run: the file is executable and the helper's name is on a line
|
|
153
|
+
that does not start with `#`, so a comment that names it, or a hook without the executable bit,
|
|
154
|
+
leaves the reminder on. It has no doctor finding, because a CI checkout has no hooks.
|
|
155
|
+
|
|
156
|
+
### store-uncommitted
|
|
157
|
+
|
|
158
|
+
Files under `.sidegraph/` that nobody committed for 24 hours. A record follows the branch and the
|
|
159
|
+
checkout it was written on, so one that stays uncommitted is invisible to every other checkout and
|
|
160
|
+
teammate, and a `git clean` or a re-clone loses it. The text gives how many files there are, how
|
|
161
|
+
old the oldest is and what kinds they are (decisions, facts, domains, bindings, entities, other),
|
|
162
|
+
and names the path to commit. Commit `.sidegraph/` in a pull request, in the same change as the
|
|
163
|
+
work that produced the records. The write tools remind the agent with a
|
|
164
|
+
[`commit_hint`](../reference/mcp-tools.md#commit-hint).
|
|
165
|
+
|
|
166
|
+
- **Age.** A new record or entity file is aged by the ULID in its name, which `git stash -u` and
|
|
167
|
+
`pop` cannot rewrite; a modified file, or anything under `bindings/`, by its modification time;
|
|
168
|
+
a deleted file by the modification time of its subdirectory, which is a lower bound. A name
|
|
169
|
+
that is not a plausible ULID (dated before 2020, or more than a day ahead of the clock) is aged
|
|
170
|
+
by its modification time too. New `archive/` files beside deleted records read as "a
|
|
171
|
+
compaction" (`sidegraph-compact`).
|
|
172
|
+
- **Fully staged files do not count.** They are being committed now, so a
|
|
173
|
+
`sidegraph-doctor --check` in a pre-commit hook never blocks the commit that fixes the problem.
|
|
174
|
+
A file that was staged and then edited again still counts.
|
|
175
|
+
- **Where it runs.** Not run outside a git repository, when `git` is missing or slower than two
|
|
176
|
+
seconds. Doctor lists one `store-uncommitted` finding at the store path, and `--check` exits `2`
|
|
177
|
+
on it. A fresh CI checkout has nothing uncommitted.
|
|
178
|
+
|
|
179
|
+
### branch-only-records
|
|
180
|
+
|
|
181
|
+
Open records that exist only on local branches that are not merged into the default branch. They
|
|
182
|
+
reach it when the branch merges, which is normal for work in progress. The line names the number
|
|
183
|
+
of records, how many await ratification, and up to three branches by their counts. A notice
|
|
184
|
+
comes only when a branch holding records has a tip older than a week: that is work that may
|
|
185
|
+
never merge. The fix is to merge the branch. Ratifying the records there does not help, because
|
|
186
|
+
an accepted record on an unmerged branch is as stranded as a proposed one.
|
|
187
|
+
|
|
188
|
+
- **The default branch** is `origin/HEAD` when it resolves (in a pull-request flow the local
|
|
189
|
+
`main` lags), otherwise the first of `origin/main`, `origin/master`, `main` and `master` that
|
|
190
|
+
exists. With none of them the check does not run.
|
|
191
|
+
- **What counts.** Every record a branch adds under `decisions/`, `facts/` and `domains/`
|
|
192
|
+
whose status is not terminal, and which the default branch does not already hold (a branch that
|
|
193
|
+
was squash- or rebase-merged stays "unmerged" to git while its records are on the default
|
|
194
|
+
branch). The branch you are on is left out. A record counts once, for the newest branch that
|
|
195
|
+
holds it (a branch cut from another carries the first one's records too), and that branch's
|
|
196
|
+
copy decides its status.
|
|
197
|
+
- **Delete branches you have squash-merged.** If the records were compacted away on the default
|
|
198
|
+
branch afterwards (`sidegraph-compact`), they no longer exist there, and the leftover branch
|
|
199
|
+
reads as holding records that never arrived.
|
|
200
|
+
- **Cost.** Every unmerged branch is scanned, oldest first, within two seconds. A scan that runs
|
|
201
|
+
out of time says "at least" before the count and that the scan ran out of time; a partial scan
|
|
202
|
+
that found nothing is not run, so a recorded notice is kept.
|
|
203
|
+
- It has no doctor finding, because a CI checkout has no local branches, and no stats item.
|
|
204
|
+
|
|
205
|
+
## How a notice behaves
|
|
206
|
+
|
|
207
|
+
- It comes **at most once every 24 hours** for each check. A second session start inside the day
|
|
208
|
+
still carries the model's line, and no notice.
|
|
209
|
+
- It comes **again at once** when the check's severity is higher than the one last reported.
|
|
210
|
+
- It **stops** when the check runs and finds nothing, and a problem that comes back after a fix is
|
|
211
|
+
reported at once. A check that did not run, because its evidence was missing or a switch is
|
|
212
|
+
off, changes nothing.
|
|
213
|
+
- Two registrations of the hook for one session do not both notify.
|
|
214
|
+
|
|
215
|
+
There is no switch for notices. The existing `SIDEGRAPH_RATIFY_NUDGE` and `SIDEGRAPH_DRIFT_NUDGE`
|
|
216
|
+
still silence their own checks. The record of what was reported lives in the derived `index.db`,
|
|
217
|
+
as `integrity_notice:<check>` meta rows, so deleting the index repeats the notices once.
|
|
218
|
+
|
|
219
|
+
See [`hooks.md`](../reference/hooks.md#notices-for-the-human) for the exact output,
|
|
220
|
+
[`cli.md`](../reference/cli.md#sidegraph-doctor) for the doctor findings and the stats `HEALTH`
|
|
221
|
+
line.
|
|
@@ -158,7 +158,10 @@ or blocks the tool call: any failure (or the store simply having nothing to offe
|
|
|
158
158
|
### Silent degradation
|
|
159
159
|
|
|
160
160
|
All three hooks are written to **never crash the session** and never block a tool call. Any
|
|
161
|
-
exception inside `session_start` prints `{}` (Claude Code proceeds with no injected context)
|
|
161
|
+
exception inside `session_start` prints `{}` (Claude Code proceeds with no injected context),
|
|
162
|
+
except that a store which cannot be opened prints a `systemMessage` naming the cause and the fix
|
|
163
|
+
(and a model line saying memory tools will fail) instead, and a lock another process holds still
|
|
164
|
+
prints `{}`;
|
|
162
165
|
any exception inside `stop` prints `{}` (Claude Code proceeds to stop normally); any exception
|
|
163
166
|
inside `pre_tool_use` — or the nudge conditions simply not holding — also prints `{}` (the
|
|
164
167
|
tool call proceeds through the normal permission flow). A missing store, missing graph, or
|
|
@@ -176,9 +176,9 @@ and Graphify's is the noisier, unbounded one.
|
|
|
176
176
|
install`** — you already have the graph-orientation and read-nudge behaviour, done more
|
|
177
177
|
conservatively. If you specifically want Graphify's own `graphify query` reflex on top, keep
|
|
178
178
|
its hooks but set `SIDEGRAPH_GREP_NUDGE=off` (see [`claude-code.md`](claude-code.md)) so the
|
|
179
|
-
two don't double-nudge on reads. This is separate from
|
|
180
|
-
[
|
|
181
|
-
|
|
179
|
+
two don't double-nudge on reads. This is separate from the git hook that rebuilds `graph.json`: Sidegraph installs its own
|
|
180
|
+
([below](#keeping-the-graph-fresh-git-hooks)), which differs from Graphify's `graphify hook
|
|
181
|
+
install` in rebuilding in the main checkout only.
|
|
182
182
|
|
|
183
183
|
`graphify update .` prints "Re-extracting code files" / "Code graph updated" even on a
|
|
184
184
|
pure-markdown corpus with no code files at all — expected engine chatter, not a sign the
|
|
@@ -190,29 +190,74 @@ by design, it is the only place Graphify specifics may live in Sidegraph.
|
|
|
190
190
|
|
|
191
191
|
## Keeping the graph fresh: git hooks
|
|
192
192
|
|
|
193
|
-
|
|
193
|
+
Let `sidegraph-init` install the refresh hook, once, in the target repo. It asks, in a terminal,
|
|
194
|
+
and `--hooks` installs without asking (`--no-hooks` declines, and records that so the
|
|
195
|
+
reminder stops):
|
|
194
196
|
|
|
195
197
|
```bash
|
|
196
|
-
|
|
198
|
+
sidegraph-init --hooks
|
|
197
199
|
```
|
|
198
200
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
`
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
the
|
|
201
|
+
It writes a small helper, `sidegraph-graph-refresh`, into the repository's `hooks/` directory
|
|
202
|
+
(inside the common git directory, so every worktree shares it), and a marked three-line block
|
|
203
|
+
into `post-commit`, `post-merge` and `post-checkout` that calls it. The helper runs
|
|
204
|
+
`graphify update .`, a **code-only AST rebuild** (no LLM). Prose/ADR extraction is a model pass
|
|
205
|
+
and is not re-run automatically: re-run `graphify update .` (or the `/graphify` skill's
|
|
206
|
+
`--update` form) whenever the docs change.
|
|
207
|
+
|
|
208
|
+
- **Which events.** After a commit, after a merge (a fast-forward `git pull` fires
|
|
209
|
+
`post-merge`, which Graphify's own hook does not cover) and after a branch switch. A file
|
|
210
|
+
checkout (`git checkout -- file`) and a `git switch -c` that stays on the same commit do not
|
|
211
|
+
rebuild.
|
|
212
|
+
- **One graph.** The helper rebuilds `graphify-out/graph.json` at the main checkout's root, and
|
|
213
|
+
init installs it only where that is the graph the store reads. A store in a subdirectory, a
|
|
214
|
+
typed `--graph`, a linked worktree with a graph of its own and a bare repository with worktrees
|
|
215
|
+
(no main checkout) get `graph refresh hook: skipped`, naming the graph the hook would rebuild.
|
|
216
|
+
- **The main checkout only.** A linked worktree reads the main checkout's graph (see
|
|
217
|
+
[above](#linked-worktrees-read-the-main-checkouts-graph)), so a commit in one does nothing.
|
|
218
|
+
Rebuilding there as well costs about 18 MB and 43 s for a cold build on one field corpus with
|
|
219
|
+
25 worktrees, and agents commit in worktrees constantly.
|
|
220
|
+
- **In the background, one at a time.** Git never waits for the rebuild. A lock directory keeps
|
|
221
|
+
one rebuild running; a hook that fires while it runs makes it go once more when it finishes, so
|
|
222
|
+
the graph never settles on a tree older than the last request. A lock left by a job that died
|
|
223
|
+
is detected and cleared: by its pid, or, when the job died before writing one (a full disk, a
|
|
224
|
+
quota), by its age, ten minutes. `sidegraph-init --hooks` clears such a lock at once. One risk
|
|
225
|
+
remains: after a reboot a pid can belong to a live, unrelated process, and the hook then waits
|
|
226
|
+
until that process exits.
|
|
227
|
+
- **Where the output goes.** The last rebuild's output is `sidegraph-graph-refresh.log` in the
|
|
228
|
+
common git directory (`.git/` in a normal clone).
|
|
229
|
+
- **No `sidegraph-sync` in the hook.** The next memory call notices the new graph version and
|
|
230
|
+
re-anchors before it answers, the same lazy check described below. Chaining `sidegraph-sync`
|
|
231
|
+
into a hook would race the background rebuild.
|
|
232
|
+
- **It never replaces a hook.** The block goes right after the hook's shebang line, so a
|
|
233
|
+
foreign hook that ends in `exit` or `exec` cannot skip it, and every other byte of the file
|
|
234
|
+
stays as it was. A second `--hooks` leaves the files byte-identical. A hook that is a
|
|
235
|
+
symlink, is not executable, has CRLF line endings or is not a shell script (a Python or Node
|
|
236
|
+
hook) is left untouched, and init prints the one line to add by hand. Damaged markers (a lone
|
|
237
|
+
marker, reversed markers, two pairs) are reported and left alone.
|
|
238
|
+
- **`core.hooksPath`.** When it is set, a hooks manager such as Husky, lefthook or pre-commit
|
|
239
|
+
owns that directory and regenerates it, so init writes nothing there. It installs the helper
|
|
240
|
+
and prints the line to add to each of the three hooks in that directory; a call added by hand
|
|
241
|
+
counts as installed, provided the hook is executable and the call is not in a comment.
|
|
242
|
+
- **Removal.** `sidegraph-init --remove-hooks` removes exactly the block's bytes (a file that
|
|
243
|
+
Sidegraph created is deleted, a foreign hook ends as it was before), deletes the helper and its
|
|
244
|
+
lock files, and clears the recorded choice.
|
|
245
|
+
- **The reminder.** Without the hook, a session start tells the model and, once a day, you
|
|
246
|
+
(the `refresh-hook-missing` check in the [troubleshooting guide](../guides/troubleshooting.md#refresh-hook-missing)).
|
|
247
|
+
It stays quiet in a repository with no graph, and after `--no-hooks`.
|
|
248
|
+
|
|
249
|
+
**Graphify's own hook** (`graphify hook install`) is not needed and is not what Sidegraph
|
|
250
|
+
installs. It rebuilds in every linked worktree that commits, writes no `post-merge` hook, and
|
|
251
|
+
appends its block after any existing content. If both are installed, the main checkout rebuilds
|
|
252
|
+
twice on every commit (Graphify's lock serialises them), and linked worktrees rebuild too. Init
|
|
253
|
+
reports it when it finds one, and never touches it; `graphify hook uninstall` removes it and
|
|
254
|
+
leaves Sidegraph's block as it was.
|
|
255
|
+
|
|
256
|
+
The lazy check keeps the store honest whichever way the graph was rebuilt: `graph_version` is
|
|
257
|
+
compared on every read path (`get_task_context`, `SessionStart`), so a graph that was rebuilt in
|
|
258
|
+
the background, or by hand, is caught by the next read, which re-syncs before serving context
|
|
259
|
+
(entities remembered under `pending_uncommitted_moves` are still re-verified once `HEAD` has
|
|
260
|
+
moved).
|
|
216
261
|
|
|
217
262
|
A graph that was **never rebuilt** is a different case, and the lazy check cannot see it: it
|
|
218
263
|
compares `graph.json` with the store's last sync, so a graph that stopped at an old commit
|