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.
Files changed (419) hide show
  1. {sidegraph-0.7.0 → sidegraph-0.8.0}/CHANGELOG.md +126 -0
  2. {sidegraph-0.7.0 → sidegraph-0.8.0}/CLAUDE.md +1 -1
  3. {sidegraph-0.7.0 → sidegraph-0.8.0}/PKG-INFO +1 -1
  4. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/README.md +1 -0
  5. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/retrieval.md +14 -4
  6. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/retrieval-in-sessions.md +17 -6
  7. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/semantic-docs.md +2 -1
  8. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/team-workflow.md +22 -0
  9. sidegraph-0.8.0/docs/guides/troubleshooting.md +221 -0
  10. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/integrations/claude-code.md +4 -1
  11. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/integrations/graphify.md +67 -22
  12. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/llms.txt +1 -0
  13. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/cli.md +93 -10
  14. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/git-bindings.md +5 -3
  15. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/hooks.md +118 -6
  16. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/mcp-tools.md +150 -14
  17. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/stability.md +4 -3
  18. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/store-format.md +11 -0
  19. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  20. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  21. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/SKILL.md +11 -6
  22. {sidegraph-0.7.0 → sidegraph-0.8.0}/pyproject.toml +1 -1
  23. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/__init__.py +1 -1
  24. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/capture.py +20 -21
  25. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/cli.py +319 -9
  26. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/doctor.py +96 -49
  27. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/engine/reader.py +48 -0
  28. sidegraph-0.8.0/src/sidegraph/githooks.py +556 -0
  29. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/host/hooks.py +262 -104
  30. sidegraph-0.8.0/src/sidegraph/integrity.py +1098 -0
  31. sidegraph-0.8.0/src/sidegraph/nearest_anchored.py +305 -0
  32. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/retrieval.py +89 -3
  33. sidegraph-0.8.0/src/sidegraph/seed_ladder.py +604 -0
  34. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/server.py +278 -75
  35. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/stats/model.py +62 -8
  36. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/stats/render.py +20 -0
  37. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/sync.py +6 -5
  38. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/verify.py +38 -3
  39. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/conftest.py +19 -0
  40. sidegraph-0.8.0/tests/githooks_support.py +194 -0
  41. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_doctor.py +3 -2
  42. sidegraph-0.8.0/tests/test_cli_init_hooks.py +598 -0
  43. sidegraph-0.8.0/tests/test_doctor_integrity.py +206 -0
  44. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_scan.py +20 -0
  45. sidegraph-0.8.0/tests/test_git_config_isolation.py +51 -0
  46. sidegraph-0.8.0/tests/test_githooks.py +977 -0
  47. sidegraph-0.8.0/tests/test_host_integrity.py +1024 -0
  48. sidegraph-0.8.0/tests/test_integrity.py +731 -0
  49. sidegraph-0.8.0/tests/test_integrity_refresh_hook.py +296 -0
  50. sidegraph-0.8.0/tests/test_integrity_replay.py +113 -0
  51. sidegraph-0.8.0/tests/test_integrity_stranded.py +864 -0
  52. sidegraph-0.8.0/tests/test_nearest_anchored.py +59 -0
  53. sidegraph-0.8.0/tests/test_reader_member_name_lookup.py +193 -0
  54. sidegraph-0.8.0/tests/test_retrieval_guessed.py +442 -0
  55. sidegraph-0.8.0/tests/test_seed_ladder.py +1073 -0
  56. sidegraph-0.8.0/tests/test_server_commit_hint.py +217 -0
  57. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_graph_freshness.py +32 -18
  58. sidegraph-0.8.0/tests/test_server_nearest_anchored.py +731 -0
  59. sidegraph-0.8.0/tests/test_server_tolerant_seeds.py +650 -0
  60. sidegraph-0.8.0/tests/test_stats_health.py +205 -0
  61. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_render.py +42 -2
  62. sidegraph-0.8.0/tests/test_store_git_root_symlink.py +355 -0
  63. {sidegraph-0.7.0 → sidegraph-0.8.0}/uv.lock +11 -11
  64. {sidegraph-0.7.0 → sidegraph-0.8.0}/.agents/plugins/marketplace.json +0 -0
  65. {sidegraph-0.7.0 → sidegraph-0.8.0}/.claude-plugin/marketplace.json +0 -0
  66. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/CODEOWNERS +0 -0
  67. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  68. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  69. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  70. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  71. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/secret_scanning.yml +0 -0
  72. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/ci.yml +0 -0
  73. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/publish.yml +0 -0
  74. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/scorecard.yml +0 -0
  75. {sidegraph-0.7.0 → sidegraph-0.8.0}/.github/workflows/session-link-gate.yml +0 -0
  76. {sidegraph-0.7.0 → sidegraph-0.8.0}/.gitignore +0 -0
  77. {sidegraph-0.7.0 → sidegraph-0.8.0}/.gitleaks.toml +0 -0
  78. {sidegraph-0.7.0 → sidegraph-0.8.0}/.pre-commit-config.yaml +0 -0
  79. {sidegraph-0.7.0 → sidegraph-0.8.0}/.python-version +0 -0
  80. {sidegraph-0.7.0 → sidegraph-0.8.0}/AGENTS.md +0 -0
  81. {sidegraph-0.7.0 → sidegraph-0.8.0}/CODE_OF_CONDUCT.md +0 -0
  82. {sidegraph-0.7.0 → sidegraph-0.8.0}/CONTRIBUTING.md +0 -0
  83. {sidegraph-0.7.0 → sidegraph-0.8.0}/LICENSE +0 -0
  84. {sidegraph-0.7.0 → sidegraph-0.8.0}/README.md +0 -0
  85. {sidegraph-0.7.0 → sidegraph-0.8.0}/SECURITY.md +0 -0
  86. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/anchoring.md +0 -0
  87. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/data-model.md +0 -0
  88. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/decision-memory.md +0 -0
  89. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/concepts/mind-model.md +0 -0
  90. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/bootstrap.md +0 -0
  91. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/claude-code-setup.md +0 -0
  92. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/codex-setup.md +0 -0
  93. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/installation.md +0 -0
  94. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/getting-started/quickstart.md +0 -0
  95. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/capturing-decisions.md +0 -0
  96. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/ci-cd-maintenance.md +0 -0
  97. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/naming-your-domains.md +0 -0
  98. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/surviving-refactors.md +0 -0
  99. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/guides/verifying-your-setup.md +0 -0
  100. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/integrations/codex.md +0 -0
  101. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/README.md +0 -0
  102. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/corpus_fit.py +0 -0
  103. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/judge-prompt.md +0 -0
  104. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/questions-prompt.md +0 -0
  105. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/pilot-kit/rubric-template.md +0 -0
  106. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/configuration.md +0 -0
  107. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/operations.md +0 -0
  108. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/reference/releasing.md +0 -0
  109. {sidegraph-0.7.0 → sidegraph-0.8.0}/docs/whitepaper/index.md +0 -0
  110. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/.mcp.json +0 -0
  111. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/hooks.json +0 -0
  112. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/mcp.json +0 -0
  113. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  114. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  115. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  116. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  117. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  118. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  119. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  120. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  121. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  122. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  123. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  124. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  125. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  126. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  127. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  128. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
  129. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  130. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
  131. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  132. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  133. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  134. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  135. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
  136. {sidegraph-0.7.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  137. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/anchoring.py +0 -0
  138. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  139. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/apply.py +0 -0
  140. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  141. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/cli.py +0 -0
  142. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/integrations.py +0 -0
  143. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/model.py +0 -0
  144. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/planner.py +0 -0
  145. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/proof.py +0 -0
  146. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/review.py +0 -0
  147. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/scan.py +0 -0
  148. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/config.py +0 -0
  149. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/doc_import.py +0 -0
  150. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/domains.py +0 -0
  151. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/engine/__init__.py +0 -0
  152. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/freshness.py +0 -0
  153. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/gitenv.py +0 -0
  154. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/gitio.py +0 -0
  155. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/host/__init__.py +0 -0
  156. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/host/claude_settings.py +0 -0
  157. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/importer.py +0 -0
  158. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/okf.py +0 -0
  159. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/profiles.py +0 -0
  160. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/schema.py +0 -0
  161. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/stats/__init__.py +0 -0
  162. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/store.py +0 -0
  163. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/__init__.py +0 -0
  164. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  165. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/model.py +0 -0
  166. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/render.py +0 -0
  167. {sidegraph-0.7.0 → sidegraph-0.8.0}/src/sidegraph/viz/template.html +0 -0
  168. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/__init__.py +0 -0
  169. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  170. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bitfinex_slice.json +0 -0
  171. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  172. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  173. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  174. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  175. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  176. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/graph.json +0 -0
  177. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  178. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  179. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  180. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  181. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  182. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  183. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  184. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  185. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  186. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  187. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  188. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  189. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  190. {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
  191. {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
  192. {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
  193. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  194. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  195. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  196. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  197. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  198. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  199. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  200. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  201. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design.md +0 -0
  202. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  203. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  204. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  205. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  206. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  207. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  208. {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
  209. {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
  210. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  211. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  212. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  213. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  214. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  215. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  216. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  217. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/member_names_python_graph.json +0 -0
  218. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/member_names_swift_graph.json +0 -0
  219. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/fixtures/mini_graph.json +0 -0
  220. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_anchoring.py +0 -0
  221. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  222. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_apply.py +0 -0
  223. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_catalog.py +0 -0
  224. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_cli.py +0 -0
  225. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_integrations.py +0 -0
  226. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_model.py +0 -0
  227. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_planner.py +0 -0
  228. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_proof.py +0 -0
  229. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_review.py +0 -0
  230. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_bootstrap_scan.py +0 -0
  231. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_auto_accept.py +0 -0
  232. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_facts.py +0 -0
  233. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_initiative.py +0 -0
  234. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_integration.py +0 -0
  235. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_neighbors.py +0 -0
  236. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_propose.py +0 -0
  237. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_capture_redact.py +0 -0
  238. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_compact.py +0 -0
  239. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_domains.py +0 -0
  240. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_graph_paths.py +0 -0
  241. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_import.py +0 -0
  242. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_init.py +0 -0
  243. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_okf.py +0 -0
  244. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_ratify.py +0 -0
  245. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_ratify_facts.py +0 -0
  246. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_stats.py +0 -0
  247. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_sync.py +0 -0
  248. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_sync_check.py +0 -0
  249. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_unreadable_paths.py +0 -0
  250. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_cli_viz.py +0 -0
  251. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_codex_plugin.py +0 -0
  252. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_community_baseline.py +0 -0
  253. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_config.py +0 -0
  254. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_config_ancestor_lookup.py +0 -0
  255. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_config_borrowed_graph.py +0 -0
  256. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_corpus_expected_renders.py +0 -0
  257. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_corpus_self_corpus.py +0 -0
  258. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  259. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_digest_integrity.py +0 -0
  260. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doc_corpus_integration.py +0 -0
  261. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doc_import.py +0 -0
  262. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_docs_claims.py +0 -0
  263. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor.py +0 -0
  264. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_auto_share.py +0 -0
  265. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_code_drift.py +0 -0
  266. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_dangling_supports.py +0 -0
  267. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_duplicate_entity.py +0 -0
  268. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  269. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_graph_stale.py +0 -0
  270. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_never_surfaced.py +0 -0
  271. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_stale_instructions.py +0 -0
  272. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_doctor_unratified_accept.py +0 -0
  273. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_domains.py +0 -0
  274. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_entity_duplicate_resolution.py +0 -0
  275. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_entity_get_or_create_race.py +0 -0
  276. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_env_isolation.py +0 -0
  277. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_fact_reachability_gate.py +0 -0
  278. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_flow_profile.py +0 -0
  279. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_bindings_blame.py +0 -0
  280. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_bindings_hook.py +0 -0
  281. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_bindings_provenance.py +0 -0
  282. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_git_env.py +0 -0
  283. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_graph_freshness.py +0 -0
  284. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_hook_spawn_guard.py +0 -0
  285. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_agent_state.py +0 -0
  286. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_borrowed_graph.py +0 -0
  287. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_claude_settings.py +0 -0
  288. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_drift_nudge.py +0 -0
  289. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_pretool.py +0 -0
  290. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_session_key.py +0 -0
  291. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_session_start.py +0 -0
  292. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_session_start_concurrent.py +0 -0
  293. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_stop.py +0 -0
  294. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_subdirectory_launch.py +0 -0
  295. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_host_touch_events.py +0 -0
  296. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_importer.py +0 -0
  297. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_member_anchor_wiring.py +0 -0
  298. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_mind_model_additive_fields.py +0 -0
  299. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_okf.py +0 -0
  300. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_openspec_profile.py +0 -0
  301. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  302. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  303. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_proposal_lifecycle.py +0 -0
  304. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  305. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_ratify_policy.py +0 -0
  306. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_community_labels.py +0 -0
  307. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_doc_nodes.py +0 -0
  308. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_graph.py +0 -0
  309. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_integration.py +0 -0
  310. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_member_names.py +0 -0
  311. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_nodes_in_file.py +0 -0
  312. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_perf.py +0 -0
  313. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_rationale.py +0 -0
  314. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_read.py +0 -0
  315. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_resolve.py +0 -0
  316. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_subdir_mismatch.py +0 -0
  317. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_reader_version.py +0 -0
  318. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_redaction_seeded.py +0 -0
  319. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_repoint_integration.py +0 -0
  320. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_budget_counters.py +0 -0
  321. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_context.py +0 -0
  322. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_drift_marker.py +0 -0
  323. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_drilldown.py +0 -0
  324. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_facts.py +0 -0
  325. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_ids.py +0 -0
  326. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_integration.py +0 -0
  327. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_rank.py +0 -0
  328. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_seeds.py +0 -0
  329. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_shown_ids.py +0 -0
  330. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  331. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_thin_tools.py +0 -0
  332. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_toc.py +0 -0
  333. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_toptier.py +0 -0
  334. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_retrieval_unratified.py +0 -0
  335. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sandbox_hygiene.py +0 -0
  336. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_schema_descriptor.py +0 -0
  337. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_schema_domain.py +0 -0
  338. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_schema_fact.py +0 -0
  339. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_add_anchors.py +0 -0
  340. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_anchoring.py +0 -0
  341. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_borrowed_graph.py +0 -0
  342. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_capture.py +0 -0
  343. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_coverage_events.py +0 -0
  344. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_domains.py +0 -0
  345. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_drilldown.py +0 -0
  346. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_facts.py +0 -0
  347. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_find_entity.py +0 -0
  348. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_get_store.py +0 -0
  349. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_get_task_context.py +0 -0
  350. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_graph_path.py +0 -0
  351. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_import.py +0 -0
  352. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_mcp_smoke.py +0 -0
  353. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  354. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_ratify_facts.py +0 -0
  355. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_redaction.py +0 -0
  356. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_render_events.py +0 -0
  357. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_supersede.py +0 -0
  358. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_sync_anchors.py +0 -0
  359. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_telemetry.py +0 -0
  360. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_thin_tools.py +0 -0
  361. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_server_verify.py +0 -0
  362. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_graph.py +0 -0
  363. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_model.py +0 -0
  364. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_skill.py +0 -0
  365. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_stats_snapshot.py +0 -0
  366. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store.py +0 -0
  367. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_agent_state.py +0 -0
  368. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  369. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_binding_index.py +0 -0
  370. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_canonical_stat.py +0 -0
  371. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_compact.py +0 -0
  372. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_compact_review.py +0 -0
  373. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_concurrent_open.py +0 -0
  374. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_coverage_telemetry.py +0 -0
  375. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_derived_community.py +0 -0
  376. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_domains.py +0 -0
  377. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_entities.py +0 -0
  378. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_fact_cascade.py +0 -0
  379. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_facts.py +0 -0
  380. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_meta.py +0 -0
  381. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_migration.py +0 -0
  382. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_mutation_guard.py +0 -0
  383. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_mutation_immediate.py +0 -0
  384. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  385. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_persistence.py +0 -0
  386. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_ratification.py +0 -0
  387. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_rebuild_atomicity.py +0 -0
  388. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_record_identity.py +0 -0
  389. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_render_events.py +0 -0
  390. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_retrieval.py +0 -0
  391. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_slug_conflicts.py +0 -0
  392. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_stamping_marker.py +0 -0
  393. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_symlinks.py +0 -0
  394. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_telemetry.py +0 -0
  395. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_threading.py +0 -0
  396. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_tmp_sweep_age.py +0 -0
  397. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_store_update_meta_if.py +0 -0
  398. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_canonical_writes.py +0 -0
  399. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_clean.py +0 -0
  400. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_domains.py +0 -0
  401. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_drift_cache.py +0 -0
  402. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_fresh_clone.py +0 -0
  403. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_integration.py +0 -0
  404. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_moved_adoption.py +0 -0
  405. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_rebind.py +0 -0
  406. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_repoint.py +0 -0
  407. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_report_has_findings.py +0 -0
  408. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_run.py +0 -0
  409. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_toc_cache.py +0 -0
  410. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_volatile_heal.py +0 -0
  411. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_sync_wiring.py +0 -0
  412. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_telemetry_retention.py +0 -0
  413. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_verify_snapshot.py +0 -0
  414. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_verify_transitions.py +0 -0
  415. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_asset_packaged.py +0 -0
  416. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_model.py +0 -0
  417. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_render_html.py +0 -0
  418. {sidegraph-0.7.0 → sidegraph-0.8.0}/tests/test_viz_render_json.py +0 -0
  419. {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.7.0) — the full loop (capture, ratification, mistakes-first
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.7.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)); an ambiguous ref keeps
99
- *all* candidates rather than guessing or dropping the seed.
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 after a
321
- missed post-commit sync is caught by the next read, and it's what keeps each accepted domain's
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.` If a file
101
- you passed is not in the code graph, a trailing `## Not in the code graph` block says why: the
102
- graph is stale and needs `graphify update .`, the file is newer than the build or one the engine
103
- skips, or the path is not a normalized repo-relative path to a file (an absolute path, `./x` and a
104
- directory are not; see [`get_task_context`](../reference/mcp-tools.md#get_task_context)). With no
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 (wire it into the post-commit hook per
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 `graphify hook install` (the
180
- [post-commit git hook](#keeping-the-graph-fresh-git-hooks) that rebuilds `graph.json`) — that
181
- one is orthogonal and fine to keep.
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
- Install Graphify's own hook once, in the target repo:
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
- graphify hook install # post-commit (and post-checkout) → rebuilds graph.json
198
+ sidegraph-init --hooks
197
199
  ```
198
200
 
199
- This installs a **code-only AST rebuild** (no LLM) into `.git/hooks/post-commit` as a marked
200
- block. Prose/ADR extraction is a model pass and is not re-run automatically — re-run
201
- `graphify update .` (or the `/graphify` skill's `--update` form) whenever the docs change.
202
-
203
- Chain Sidegraph's sync **after** Graphify's block, in the same hook, so the graph rebuild
204
- always finishes first:
205
-
206
- ```bash
207
- # .git/hooks/post-commit, appended after Graphify's marked block:
208
- sidegraph-sync
209
- ```
210
-
211
- This is a convenience, not a dependency: `sidegraph-sync` re-resolves anchors and skips the
212
- full pass when the graph version hasn't changed (entities remembered under
213
- `pending_uncommitted_moves` are still re-verified once `HEAD` has moved). Because the same `graph_version` check also runs
214
- lazily on every read path (`get_task_context`, `SessionStart`), a graph that was rebuilt while
215
- the hook missed its sync is caught by the next read, which re-syncs before serving context.
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