sidegraph 0.8.0__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. {sidegraph-0.8.0 → sidegraph-0.9.0}/CHANGELOG.md +220 -0
  2. {sidegraph-0.8.0 → sidegraph-0.9.0}/CLAUDE.md +6 -3
  3. {sidegraph-0.8.0 → sidegraph-0.9.0}/PKG-INFO +5 -3
  4. {sidegraph-0.8.0 → sidegraph-0.9.0}/README.md +2 -2
  5. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/data-model.md +1 -1
  6. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/bootstrap.md +1 -1
  7. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/claude-code-setup.md +89 -14
  8. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/codex-setup.md +25 -9
  9. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/installation.md +19 -8
  10. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/getting-started/quickstart.md +9 -0
  11. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/retrieval-in-sessions.md +4 -3
  12. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/troubleshooting.md +118 -12
  13. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/integrations/claude-code.md +87 -30
  14. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/integrations/codex.md +46 -14
  15. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/integrations/graphify.md +20 -10
  16. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/llms.txt +2 -2
  17. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/cli.md +15 -9
  18. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/configuration.md +10 -8
  19. sidegraph-0.9.0/docs/reference/hooks.md +928 -0
  20. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/mcp-tools.md +12 -4
  21. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/operations.md +15 -8
  22. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/releasing.md +5 -3
  23. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/stability.md +3 -3
  24. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/store-format.md +34 -10
  25. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  26. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  27. sidegraph-0.9.0/plugin/sidegraph/codex/hooks.json +34 -0
  28. sidegraph-0.9.0/plugin/sidegraph/hooks/hooks.json +79 -0
  29. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-decision/SKILL.md +1 -1
  30. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-fact/SKILL.md +4 -3
  31. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/setup/SKILL.md +14 -3
  32. {sidegraph-0.8.0 → sidegraph-0.9.0}/pyproject.toml +6 -1
  33. sidegraph-0.9.0/src/sidegraph/__init__.py +76 -0
  34. sidegraph-0.9.0/src/sidegraph/bash_paths.py +553 -0
  35. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/integrations.py +11 -2
  36. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/capture.py +1 -1
  37. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/cli.py +24 -4
  38. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/config.py +2 -2
  39. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/doctor.py +59 -7
  40. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/host/claude_settings.py +137 -0
  41. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/host/hooks.py +841 -277
  42. sidegraph-0.9.0/src/sidegraph/host/launch.py +106 -0
  43. sidegraph-0.9.0/src/sidegraph/host/subagent.py +100 -0
  44. sidegraph-0.9.0/src/sidegraph/hot_index.py +321 -0
  45. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/integrity.py +23 -15
  46. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/retrieval.py +12 -65
  47. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/schema.py +4 -29
  48. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/server.py +79 -6
  49. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/store.py +307 -144
  50. sidegraph-0.9.0/src/sidegraph/store_layout.py +191 -0
  51. sidegraph-0.9.0/src/sidegraph/text_paths.py +176 -0
  52. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/verify.py +39 -14
  53. sidegraph-0.9.0/tests/test_agent_brief_manifests.py +79 -0
  54. sidegraph-0.9.0/tests/test_bash_paths.py +336 -0
  55. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_integrations.py +64 -0
  56. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_compact.py +32 -0
  57. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_doctor.py +17 -0
  58. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_codex_plugin.py +3 -3
  59. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor.py +33 -0
  60. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_hook_spawn_guard.py +15 -12
  61. sidegraph-0.9.0/tests/test_host_agent_brief.py +490 -0
  62. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_agent_state.py +48 -42
  63. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_integrity.py +48 -9
  64. sidegraph-0.9.0/tests/test_host_launch.py +331 -0
  65. sidegraph-0.9.0/tests/test_host_pretool.py +372 -0
  66. sidegraph-0.9.0/tests/test_host_pretool_records.py +771 -0
  67. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_stop.py +141 -2
  68. sidegraph-0.9.0/tests/test_host_subagent_start.py +304 -0
  69. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_subdirectory_launch.py +4 -2
  70. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_touch_events.py +16 -2
  71. sidegraph-0.9.0/tests/test_host_wiring_checks.py +719 -0
  72. sidegraph-0.9.0/tests/test_hot_index.py +642 -0
  73. sidegraph-0.9.0/tests/test_hot_index_hook.py +173 -0
  74. sidegraph-0.9.0/tests/test_hot_path_imports.py +319 -0
  75. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity.py +35 -0
  76. sidegraph-0.9.0/tests/test_lazy_root.py +49 -0
  77. sidegraph-0.9.0/tests/test_public_hook_launch.py +445 -0
  78. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_ratify_policy.py +21 -13
  79. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_add_anchors.py +27 -0
  80. sidegraph-0.9.0/tests/test_server_refresh.py +208 -0
  81. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_supersede.py +82 -1
  82. sidegraph-0.9.0/tests/test_stop_hot_path.py +80 -0
  83. sidegraph-0.9.0/tests/test_stop_rearm.py +505 -0
  84. sidegraph-0.9.0/tests/test_store_bad_file.py +590 -0
  85. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_compact_review.py +5 -2
  86. sidegraph-0.9.0/tests/test_subagent_start_manifests.py +62 -0
  87. sidegraph-0.9.0/tests/test_text_paths.py +414 -0
  88. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_verify_snapshot.py +166 -1
  89. {sidegraph-0.8.0 → sidegraph-0.9.0}/uv.lock +5 -1
  90. sidegraph-0.8.0/docs/reference/hooks.md +0 -566
  91. sidegraph-0.8.0/plugin/sidegraph/codex/hooks.json +0 -24
  92. sidegraph-0.8.0/plugin/sidegraph/hooks/hooks.json +0 -35
  93. sidegraph-0.8.0/src/sidegraph/__init__.py +0 -37
  94. sidegraph-0.8.0/tests/test_host_pretool.py +0 -379
  95. {sidegraph-0.8.0 → sidegraph-0.9.0}/.agents/plugins/marketplace.json +0 -0
  96. {sidegraph-0.8.0 → sidegraph-0.9.0}/.claude-plugin/marketplace.json +0 -0
  97. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/CODEOWNERS +0 -0
  98. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  99. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  100. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  101. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  102. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/secret_scanning.yml +0 -0
  103. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/ci.yml +0 -0
  104. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/publish.yml +0 -0
  105. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/scorecard.yml +0 -0
  106. {sidegraph-0.8.0 → sidegraph-0.9.0}/.github/workflows/session-link-gate.yml +0 -0
  107. {sidegraph-0.8.0 → sidegraph-0.9.0}/.gitignore +0 -0
  108. {sidegraph-0.8.0 → sidegraph-0.9.0}/.gitleaks.toml +0 -0
  109. {sidegraph-0.8.0 → sidegraph-0.9.0}/.pre-commit-config.yaml +0 -0
  110. {sidegraph-0.8.0 → sidegraph-0.9.0}/.python-version +0 -0
  111. {sidegraph-0.8.0 → sidegraph-0.9.0}/AGENTS.md +0 -0
  112. {sidegraph-0.8.0 → sidegraph-0.9.0}/CODE_OF_CONDUCT.md +0 -0
  113. {sidegraph-0.8.0 → sidegraph-0.9.0}/CONTRIBUTING.md +0 -0
  114. {sidegraph-0.8.0 → sidegraph-0.9.0}/LICENSE +0 -0
  115. {sidegraph-0.8.0 → sidegraph-0.9.0}/SECURITY.md +0 -0
  116. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/README.md +0 -0
  117. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/anchoring.md +0 -0
  118. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/decision-memory.md +0 -0
  119. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/mind-model.md +0 -0
  120. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/concepts/retrieval.md +0 -0
  121. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/capturing-decisions.md +0 -0
  122. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/ci-cd-maintenance.md +0 -0
  123. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/naming-your-domains.md +0 -0
  124. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/semantic-docs.md +0 -0
  125. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/surviving-refactors.md +0 -0
  126. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/team-workflow.md +0 -0
  127. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/guides/verifying-your-setup.md +0 -0
  128. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/README.md +0 -0
  129. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/corpus_fit.py +0 -0
  130. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/judge-prompt.md +0 -0
  131. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/questions-prompt.md +0 -0
  132. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/pilot-kit/rubric-template.md +0 -0
  133. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/reference/git-bindings.md +0 -0
  134. {sidegraph-0.8.0 → sidegraph-0.9.0}/docs/whitepaper/index.md +0 -0
  135. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/.mcp.json +0 -0
  136. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/codex/mcp.json +0 -0
  137. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  138. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  139. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  140. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  141. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  142. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  143. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  144. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  145. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  146. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  147. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  148. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  149. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  150. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  151. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  152. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  153. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  154. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  155. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  156. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
  157. {sidegraph-0.8.0 → sidegraph-0.9.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  158. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/anchoring.py +0 -0
  159. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  160. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/apply.py +0 -0
  161. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  162. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/cli.py +0 -0
  163. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/model.py +0 -0
  164. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/planner.py +0 -0
  165. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/proof.py +0 -0
  166. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/review.py +0 -0
  167. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/bootstrap/scan.py +0 -0
  168. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/doc_import.py +0 -0
  169. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/domains.py +0 -0
  170. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/engine/__init__.py +0 -0
  171. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/engine/reader.py +0 -0
  172. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/freshness.py +0 -0
  173. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/gitenv.py +0 -0
  174. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/githooks.py +0 -0
  175. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/gitio.py +0 -0
  176. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/host/__init__.py +0 -0
  177. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/importer.py +0 -0
  178. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/nearest_anchored.py +0 -0
  179. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/okf.py +0 -0
  180. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/profiles.py +0 -0
  181. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/seed_ladder.py +0 -0
  182. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/stats/__init__.py +0 -0
  183. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/stats/model.py +0 -0
  184. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/stats/render.py +0 -0
  185. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/sync.py +0 -0
  186. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/__init__.py +0 -0
  187. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  188. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/model.py +0 -0
  189. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/render.py +0 -0
  190. {sidegraph-0.8.0 → sidegraph-0.9.0}/src/sidegraph/viz/template.html +0 -0
  191. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/__init__.py +0 -0
  192. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/conftest.py +0 -0
  193. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  194. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bitfinex_slice.json +0 -0
  195. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  196. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  197. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  198. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  199. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  200. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/graph.json +0 -0
  201. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  202. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  203. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  204. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  205. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  206. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  207. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  208. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  209. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  210. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  211. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  212. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  213. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  214. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  215. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  216. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  217. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  218. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  219. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  220. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  221. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  222. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  223. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  224. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  225. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/design.md +0 -0
  226. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  227. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  228. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  229. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  230. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  231. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  232. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  233. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  234. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  235. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  236. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  237. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  238. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  239. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  240. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  241. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/member_names_python_graph.json +0 -0
  242. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/member_names_swift_graph.json +0 -0
  243. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/fixtures/mini_graph.json +0 -0
  244. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/githooks_support.py +0 -0
  245. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_anchoring.py +0 -0
  246. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  247. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_apply.py +0 -0
  248. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_catalog.py +0 -0
  249. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_cli.py +0 -0
  250. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_model.py +0 -0
  251. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_planner.py +0 -0
  252. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_proof.py +0 -0
  253. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_review.py +0 -0
  254. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_bootstrap_scan.py +0 -0
  255. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_auto_accept.py +0 -0
  256. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_facts.py +0 -0
  257. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_initiative.py +0 -0
  258. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_integration.py +0 -0
  259. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_neighbors.py +0 -0
  260. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_propose.py +0 -0
  261. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_capture_redact.py +0 -0
  262. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_domains.py +0 -0
  263. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_graph_paths.py +0 -0
  264. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_import.py +0 -0
  265. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_init.py +0 -0
  266. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_init_hooks.py +0 -0
  267. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_okf.py +0 -0
  268. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_ratify.py +0 -0
  269. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_ratify_facts.py +0 -0
  270. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_stats.py +0 -0
  271. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_sync.py +0 -0
  272. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_sync_check.py +0 -0
  273. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_unreadable_paths.py +0 -0
  274. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_cli_viz.py +0 -0
  275. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_community_baseline.py +0 -0
  276. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_config.py +0 -0
  277. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_config_ancestor_lookup.py +0 -0
  278. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_config_borrowed_graph.py +0 -0
  279. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_corpus_expected_renders.py +0 -0
  280. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_corpus_self_corpus.py +0 -0
  281. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  282. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_digest_integrity.py +0 -0
  283. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doc_corpus_integration.py +0 -0
  284. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doc_import.py +0 -0
  285. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_docs_claims.py +0 -0
  286. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_auto_share.py +0 -0
  287. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_code_drift.py +0 -0
  288. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_dangling_supports.py +0 -0
  289. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_duplicate_entity.py +0 -0
  290. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  291. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_graph_stale.py +0 -0
  292. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_integrity.py +0 -0
  293. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_never_surfaced.py +0 -0
  294. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_scan.py +0 -0
  295. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_stale_instructions.py +0 -0
  296. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_doctor_unratified_accept.py +0 -0
  297. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_domains.py +0 -0
  298. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_entity_duplicate_resolution.py +0 -0
  299. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_entity_get_or_create_race.py +0 -0
  300. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_env_isolation.py +0 -0
  301. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_fact_reachability_gate.py +0 -0
  302. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_flow_profile.py +0 -0
  303. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_bindings_blame.py +0 -0
  304. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_bindings_hook.py +0 -0
  305. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_bindings_provenance.py +0 -0
  306. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_config_isolation.py +0 -0
  307. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_git_env.py +0 -0
  308. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_githooks.py +0 -0
  309. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_graph_freshness.py +0 -0
  310. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_borrowed_graph.py +0 -0
  311. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_claude_settings.py +0 -0
  312. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_drift_nudge.py +0 -0
  313. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_session_key.py +0 -0
  314. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_session_start.py +0 -0
  315. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_host_session_start_concurrent.py +0 -0
  316. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_importer.py +0 -0
  317. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity_refresh_hook.py +0 -0
  318. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity_replay.py +0 -0
  319. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_integrity_stranded.py +0 -0
  320. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_member_anchor_wiring.py +0 -0
  321. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_mind_model_additive_fields.py +0 -0
  322. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_nearest_anchored.py +0 -0
  323. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_okf.py +0 -0
  324. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_openspec_profile.py +0 -0
  325. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  326. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  327. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_proposal_lifecycle.py +0 -0
  328. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  329. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_community_labels.py +0 -0
  330. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_doc_nodes.py +0 -0
  331. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_graph.py +0 -0
  332. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_integration.py +0 -0
  333. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_member_name_lookup.py +0 -0
  334. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_member_names.py +0 -0
  335. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_nodes_in_file.py +0 -0
  336. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_perf.py +0 -0
  337. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_rationale.py +0 -0
  338. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_read.py +0 -0
  339. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_resolve.py +0 -0
  340. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_subdir_mismatch.py +0 -0
  341. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_reader_version.py +0 -0
  342. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_redaction_seeded.py +0 -0
  343. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_repoint_integration.py +0 -0
  344. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_budget_counters.py +0 -0
  345. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_context.py +0 -0
  346. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_drift_marker.py +0 -0
  347. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_drilldown.py +0 -0
  348. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_facts.py +0 -0
  349. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_guessed.py +0 -0
  350. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_ids.py +0 -0
  351. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_integration.py +0 -0
  352. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_rank.py +0 -0
  353. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_seeds.py +0 -0
  354. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_shown_ids.py +0 -0
  355. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  356. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_thin_tools.py +0 -0
  357. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_toc.py +0 -0
  358. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_toptier.py +0 -0
  359. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_retrieval_unratified.py +0 -0
  360. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sandbox_hygiene.py +0 -0
  361. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_schema_descriptor.py +0 -0
  362. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_schema_domain.py +0 -0
  363. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_schema_fact.py +0 -0
  364. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_seed_ladder.py +0 -0
  365. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_anchoring.py +0 -0
  366. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_borrowed_graph.py +0 -0
  367. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_capture.py +0 -0
  368. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_commit_hint.py +0 -0
  369. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_coverage_events.py +0 -0
  370. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_domains.py +0 -0
  371. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_drilldown.py +0 -0
  372. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_facts.py +0 -0
  373. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_find_entity.py +0 -0
  374. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_get_store.py +0 -0
  375. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_get_task_context.py +0 -0
  376. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_graph_freshness.py +0 -0
  377. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_graph_path.py +0 -0
  378. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_import.py +0 -0
  379. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_mcp_smoke.py +0 -0
  380. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_nearest_anchored.py +0 -0
  381. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  382. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_ratify_facts.py +0 -0
  383. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_redaction.py +0 -0
  384. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_render_events.py +0 -0
  385. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_sync_anchors.py +0 -0
  386. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_telemetry.py +0 -0
  387. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_thin_tools.py +0 -0
  388. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_tolerant_seeds.py +0 -0
  389. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_server_verify.py +0 -0
  390. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_graph.py +0 -0
  391. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_health.py +0 -0
  392. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_model.py +0 -0
  393. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_render.py +0 -0
  394. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_skill.py +0 -0
  395. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_stats_snapshot.py +0 -0
  396. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store.py +0 -0
  397. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_agent_state.py +0 -0
  398. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  399. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_binding_index.py +0 -0
  400. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_canonical_stat.py +0 -0
  401. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_compact.py +0 -0
  402. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_concurrent_open.py +0 -0
  403. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_coverage_telemetry.py +0 -0
  404. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_derived_community.py +0 -0
  405. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_domains.py +0 -0
  406. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_entities.py +0 -0
  407. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_fact_cascade.py +0 -0
  408. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_facts.py +0 -0
  409. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_git_root_symlink.py +0 -0
  410. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_meta.py +0 -0
  411. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_migration.py +0 -0
  412. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_mutation_guard.py +0 -0
  413. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_mutation_immediate.py +0 -0
  414. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  415. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_persistence.py +0 -0
  416. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_ratification.py +0 -0
  417. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_rebuild_atomicity.py +0 -0
  418. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_record_identity.py +0 -0
  419. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_render_events.py +0 -0
  420. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_retrieval.py +0 -0
  421. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_slug_conflicts.py +0 -0
  422. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_stamping_marker.py +0 -0
  423. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_symlinks.py +0 -0
  424. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_telemetry.py +0 -0
  425. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_threading.py +0 -0
  426. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_tmp_sweep_age.py +0 -0
  427. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_store_update_meta_if.py +0 -0
  428. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_canonical_writes.py +0 -0
  429. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_clean.py +0 -0
  430. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_domains.py +0 -0
  431. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_drift_cache.py +0 -0
  432. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_fresh_clone.py +0 -0
  433. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_integration.py +0 -0
  434. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_moved_adoption.py +0 -0
  435. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_rebind.py +0 -0
  436. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_repoint.py +0 -0
  437. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_report_has_findings.py +0 -0
  438. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_run.py +0 -0
  439. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_toc_cache.py +0 -0
  440. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_volatile_heal.py +0 -0
  441. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_sync_wiring.py +0 -0
  442. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_telemetry_retention.py +0 -0
  443. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_verify_transitions.py +0 -0
  444. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_asset_packaged.py +0 -0
  445. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_model.py +0 -0
  446. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_render_html.py +0 -0
  447. {sidegraph-0.8.0 → sidegraph-0.9.0}/tests/test_viz_render_json.py +0 -0
  448. {sidegraph-0.8.0 → sidegraph-0.9.0}/tools/check_no_session_links.py +0 -0
@@ -7,6 +7,226 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.0] — 2026-10-04
11
+
12
+ ### Added
13
+
14
+ - **Host wiring that silently switched memory off is now visible.** Two field failures went
15
+ unnoticed for weeks: hooks that ran an old install under a newer plugin, and sessions started in
16
+ a subdirectory where the plugin was off. `SessionStart` now prints `Sidegraph <version>` right
17
+ after the standing instruction, and two advisory checks report the wiring, each with a notice
18
+ at most once a day (`plugin-off-in-subdirectories` only when a nested directory's own settings
19
+ leave the plugin off).
20
+ - `version-skew` compares the running package with the plugin manifest under
21
+ `$CLAUDE_PLUGIN_ROOT` (or else `$PLUGIN_ROOT`, which Codex sets) by numeric parts, and says
22
+ which side is stale. It does not run without a plugin root, a manifest named `sidegraph`, or a
23
+ version.
24
+ - `plugin-off-in-subdirectories` applies Claude Code's settings model (a launch directory's own
25
+ project settings only, the repository root's `.claude/settings.local.json` for every launch,
26
+ `enabledPlugins` merged key by key over user settings) to the directories of the repository.
27
+ It reports a plugin enabled only in the root's `.claude/settings.json`, and nested directories
28
+ whose own `enabledPlugins` leave it off. User settings are read from
29
+ `$CLAUDE_CONFIG_DIR/settings.json` when that variable is set, else from `~/.claude/settings.json`. It also lists in `sidegraph-doctor` under the finding code
30
+ `plugin-off-in-subdirectories`, and **`--check` exits `2` on it** like any finding.
31
+ The getting-started pages now say that enabling the plugin at user scope, or in the root's
32
+ `.claude/settings.local.json`, covers every subdirectory, and the setup skill reads the doctor
33
+ finding. See [troubleshooting](docs/guides/troubleshooting.md#version-skew).
34
+
35
+ - **A subagent's brief carries the records for the files it names.** The task a subagent works
36
+ on is in the brief its parent wrote, which the `SubagentStart` brief cannot see. The
37
+ `sidegraph-pre-tool-use` entry point now also handles `Agent` (and `Task`, the older name): it
38
+ reads the files the brief names, and the files named in a `.md`, `.txt` or `.rst` document the
39
+ brief names (one hop, the first 64 KB), finds the records anchored to them, and returns the
40
+ call's own input with a block appended to `prompt` (`updatedInput`; no `permissionDecision`).
41
+ The subagent finds the block at the end of its first message. **The parent's view of its own
42
+ call does not show it**: its transcript keeps the prompt it wrote. A path resolves exactly when
43
+ it is an existing regular file inside the project root, and otherwise by a unique suffix among
44
+ the anchored files (`sub/x.py` for `pkg/sub/x.py`; an ambiguous suffix names nothing), tried
45
+ from the directory the agent was launched in before the root. A document is followed only when
46
+ it is a regular file inside the root, and **no hop goes through a project-instruction file**
47
+ (`CLAUDE.md`, `AGENTS.md` and their `.public` twins): they are still shown when records are
48
+ anchored to them, but the files they list are not followed. The block is grouped by file, two
49
+ records each, at most six record lines and 3,000 characters, and it ends with a
50
+ `More: get_task_context(files=[…])` line for the files shown; a file that misses the sixth
51
+ line by one still gets its first record there. It is **on by default**;
52
+ `SIDEGRAPH_AGENT_BRIEF=off` disables it. The plugin manifests (Claude Code only, the Codex ones
53
+ are unchanged) and the manual recipe gain a third `PreToolUse` group, matcher `Agent|Task`, on
54
+ the same command; a hand-wired setup needs that group added. Not tested: agent-team teammates
55
+ and `fork` spawns. See the
56
+ [hooks reference](docs/reference/hooks.md#subagent-briefs).
57
+
58
+ - **Every subagent starts knowing that memory exists and how to ask it.** A subagent gets no
59
+ `SessionStart` context, and Explore and Plan agents load no `CLAUDE.md` either, so nothing
60
+ standing told one that decision memory exists. The new `sidegraph-subagent-start` hook, wired
61
+ to `SubagentStart` in the Claude Code and Codex plugins, answers with a short brief: the same
62
+ standing `get_task_context(files=[…])` call `SessionStart` gives the main agent, and one
63
+ sentence of what memory holds ("N records anchored to code in M files, K of them recorded
64
+ mistakes"). The counts are what `get_task_context` could return: live records that may surface,
65
+ with a live or degraded binding to an entity that names a file. It carries no records, prints
66
+ `{}` where there is nothing anchored to code, and, like `PreToolUse`, reads the index directly
67
+ and builds no `Store`. `SIDEGRAPH_SUBAGENT_BRIEF=off` disables it. Codex records trust per hook
68
+ definition, so approve the new hook once in `/hooks`; manual recipes for both hosts gain the
69
+ entry. See the [hooks reference](docs/reference/hooks.md#sidegraph-subagent-start).
70
+
71
+ ### Changed
72
+
73
+ - **The capture nudge comes back after more work, instead of firing once per session.** A session
74
+ that runs for a day and spawns subagents used to get one chance to record what it decided, at
75
+ its first substantial `Stop`, often before the work worth recording. A session that was already
76
+ nudged is now nudged again when at least 30 minutes have passed since its last nudge and at
77
+ least 10 commits authored since then are reachable from a local branch or `HEAD`; the text of
78
+ that nudge ends with `Since the last capture prompt: N commits.`, and the first nudge is
79
+ unchanged. The count is one `git log --branches HEAD`, run in the project the store belongs to
80
+ with a 2-second timeout, and it goes by author dates, so a rebase or cherry-pick of old commits
81
+ is not new work. A git failure means no re-arm. The last nudge is the meta key
82
+ `capture_rearm:<session>`, which the first nudge writes too and SessionStart expires after 30
83
+ days; a session captured by an older version has no key and counts from the `captured_at` of its
84
+ `capture_sessions` row. The new stamp is written with a compare-and-swap, so two parallel `Stop`
85
+ hooks cannot both nudge. A `Stop` inside the 30 minutes still exits on the read-only peek and
86
+ runs no git: a subprocess measured on a copy of this repository's store with a 1,000-commit
87
+ repository takes about 39 ms inside the gap and about 47 ms past it with too few commits. The
88
+ nudge's length bound is 850 characters, up from 800, for the added sentence. The count includes
89
+ commits that other sessions or people make on the same machine's branches.
90
+ `SIDEGRAPH_CAPTURE_NUDGE=off` silences re-armed nudges too. See the
91
+ [hooks reference](docs/reference/hooks.md#re-arm-after-more-work).
92
+
93
+ - **`PreToolUse` hands the agent the records of a file when it reads or edits it, instead of
94
+ asking it to fetch them.** The hook used to print a one-line nudge (a count, or the titles of
95
+ two records) and ask the agent to call `get_task_context`, which for a tool the host lists only
96
+ by name means loading it first. In the field study the one nudge that named a record worked and
97
+ the five that named counts did not, Edit and Write never nudged, and Bash, which is how current
98
+ Claude Code reads and searches, was never wired. The hook now prints the records themselves: the
99
+ guard line, then for each file a header and its top two records (three when the first two are
100
+ mistakes), each as `- [kind] title — first sentence of the choice (id …)`, accepted mistakes
101
+ first, proposals last and marked `[unratified]`, and a `More: get_task_context(files=[…])` line
102
+ when records were left out. It covers `Read`, `Grep`, `Edit` and `Write`, and four Bash read
103
+ commands, `sed`, `grep`, `rg` and `cat`, wired as four `if` entries on one command (`if` needs
104
+ Claude Code 2.1.89 for correct matching; an older host runs the hook on every Bash call, which
105
+ exits early with no output). A Bash line delivers the first three files it reads that have
106
+ records. Each file arrives once per agent, and an agent receives at most ten files: one SQL
107
+ statement counts and inserts a `pretool_file:<session>:<agent>:<path>` key, where `<agent>` is
108
+ `-` for the session's own agent, so concurrent hooks cannot exceed the cap. The counting form
109
+ (`this project has a decision memory … N domains, M decisions`) is gone, the `pretool_nudge:`
110
+ and `pretool_nudge_path:` keys are no longer written (SessionStart still prunes them, and the
111
+ new keys after 30 days), and a Bash read is still not a touch event. **`SIDEGRAPH_GREP_NUDGE=off`
112
+ keeps its name and now turns off all of this**, on every tool that reads (not the `Agent`
113
+ brief below, which has its own switch); it stops neither the hook from
114
+ launching on a Bash call nor touch recording. A subprocess median of nine on this repository's
115
+ store: about 26 ms when nothing is delivered, about 35 ms for a `Read` of the file with the most
116
+ records, about 38 ms for a Bash line naming three anchored files. A hand-wired
117
+ `.claude/settings.json` gains the Bash group (see the
118
+ [setup guide](docs/getting-started/claude-code-setup.md#2-add-the-hooks)). The `PreToolUse`
119
+ commands, in the plugin and in that snippet, no longer set `SIDEGRAPH_GRAPH`, which the hook
120
+ never read: Graphify's `graphify claude install` and `uninstall` remove a `Bash` entry whose
121
+ text mentions `graphify`, and would otherwise have removed the hand-wired group. See the
122
+ [hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
123
+
124
+ - **The plugin's hot hooks start from the commit `SessionStart` resolved, not from `@main`.**
125
+ `uv` re-resolves a branch reference on every call, about 0.8 s on a warm cache, and `Stop` and
126
+ `PreToolUse` run many times a session. `SessionStart` now records the commit `uv` resolved for
127
+ an `@main` install in `${XDG_CACHE_HOME:-$HOME/.cache}/sidegraph/launch-commit`: 40 hex bytes,
128
+ one file per machine, never written by an install pinned to a tag or SHA, an editable install
129
+ or a PyPI install. The public `Stop` and `PreToolUse` commands (Claude Code) and `Stop` (Codex)
130
+ launch `uvx --from` that commit, which `uv` serves from its cache in about 0.2 s, and fall back
131
+ to `@main` when there is no valid file, as before. A plugin pinned to a tag or commit ignores
132
+ the file and launches its own ref. `SessionStart` and the MCP server still run `@main`. A release therefore reaches a running session at the next `SessionStart` on the
133
+ machine, in any project and either host, not at its next hook call. The Codex `Stop` command is
134
+ wrapped in `sh -c '…'` so a fish login shell parses one literal. Codex records trust per hook
135
+ definition, so approve the changed `Stop` hook once in `/hooks`; the command no longer changes
136
+ between releases. `sidegraph-bootstrap`'s verification finds an entry point inside such a
137
+ `sh -c` script. See [troubleshooting](docs/guides/troubleshooting.md#the-launch-commit-file).
138
+
139
+ - **`PreToolUse` and `Stop` start about three times faster, and a tool call no longer creates a
140
+ store.** `import sidegraph.<anything>` used to load pydantic, ulid and every model, and
141
+ `PreToolUse` constructed a `Store`, which walks every record file, once for the touch row and
142
+ once for the nudge. The package root now resolves its re-exports on first access;
143
+ `PreToolUse` reads and writes `index.db` through one raw SQLite handle, with the same nudge
144
+ text, the same one-shot claim and the same touch row; and `Stop` imports `Store` only past its
145
+ early exits. On this repository's own store (about 1,500 record files), a subprocess median of
146
+ nine: a hook call that does nothing falls from about 83 ms to about 25 ms, an `Edit` from about
147
+ 96 ms to about 30 ms, a `Read` from about 127 ms to about 35 ms, and the two `Stop` early exits
148
+ from about 87 ms to about 34 ms. The handle trusts the index as the last full open left it and
149
+ does nothing, printing `{}`, when the index is missing, a store-owned entry is a symlink, the
150
+ `schema_version` is not this version's, `retrieval_events` has no `agent` column, or opening it
151
+ fails. A `Store` open (a `SessionStart`, a command, a started MCP server) repairs a missing, empty or
152
+ older-layout index and refuses a symlinked entry or an unknown `schema_version`, as before; a
153
+ running server does not recreate a deleted index. A write that waits out the one-second lock timeout is not
154
+ retried in that run. **Behaviour change:** a `Read` or
155
+ `Edit` in a project without a store no longer creates `.sidegraph/`, and the nudge path no
156
+ longer prints "creating new store"; `SessionStart` and the MCP server still create the store.
157
+ A record that arrives mid-session can be missing from the nudge's titles until the next MCP
158
+ call. See the [hooks reference](docs/reference/hooks.md#sidegraph-pre-tool-use).
159
+
160
+ ### Fixed
161
+
162
+ - **A finished background agent, an agent-team message or a `!` command's output no longer counts
163
+ as a typed prompt.** Claude Code writes each of these into the transcript as a `type: "user"`
164
+ line without the `isMeta` flag, so the `Stop` gate counted it: a session with one request and two
165
+ background agents passed the two-prompt gate at its first stop, and the capture nudge, which fires
166
+ once per session, was spent before there was anything to record. The gate now skips content that
167
+ starts `<task-notification>`, `<teammate-message` (the tag carries attributes, and is how a
168
+ teammate's own session receives a message), `Another Claude session sent a message` (how the
169
+ lead's session receives one) or `<bash-stdout>`, next to the three slash-command wrappers it
170
+ already skipped. It also skips a line that newer Claude Code marks with
171
+ `origin.kind: "task-notification"` or `promptSource: "system"`, which catches task
172
+ notifications written in plain prose. A slash command the
173
+ person typed, which starts `<command-message>`, and a `!` command's own `<bash-input>` still
174
+ count. Codex rollouts share the prefixes. See the
175
+ [hooks reference](docs/reference/hooks.md#sidegraph-stop).
176
+ - **A running MCP server sees a record that arrives mid-session.** The server keeps one `Store`,
177
+ and a `Store` checks the record files only when it is opened, so after a `git pull`
178
+ `get_task_context` and `retrieve_decisions` kept answering from the index as it stood until the
179
+ server restarted. The `PreToolUse` hook, which opened a `Store` on every call, was what
180
+ refreshed it, by accident. Every tool call now first re-checks the record files: a digest walk
181
+ (about 8 ms on 1,500 files), and a rebuild only when something changed. A filesystem error during
182
+ that check, such as a checkout deleting a record file mid-walk, does not fail the call: the tool
183
+ answers from the previous index and one line goes to stderr.
184
+ - **One record file that does not parse no longer switches memory off.** A merge that left
185
+ conflict markers in a decision, entity, fact or bindings file made the index rebuild raise, so
186
+ the store could not be opened: every hook fell back to "cannot open its store", and the MCP
187
+ server served nothing. The rebuild now skips such a file, whether it is invalid JSON, invalid
188
+ UTF-8, a wrong shape, rejected by its model or impossible to serialise, lists it as
189
+ `parse-error`, and loads the rest. The usual notice names the first such file, and
190
+ `sidegraph-verify` reports each of them; a file that fails validation no longer hides its
191
+ archived copy. A bindings file is skipped whole, so a half-valid file never leaves half of its
192
+ anchors in the index, and its record stays retrievable without them. A file that cannot be
193
+ opened at all (a permission or I/O error) still fails the open.
194
+ - **An archive line that cannot be read costs that line, not the store.** A line of an archive
195
+ segment that is not valid UTF-8 or JSON, or whose decision or domain fails its model, is skipped
196
+ with a warning in the rebuild, the rest of the segment loads, and the segment is listed as
197
+ `bad-archive-segment`. `sidegraph-verify` reports each such line with its segment and line
198
+ number. `sidegraph-compact` keeps the strict rule: it refuses to run over a segment it cannot
199
+ fully read and names the segment and the line (`--dry-run` included, with exit code 1 and no
200
+ traceback), and a hot file the rebuild left out no longer makes `--dry-run` fail with a bare
201
+ `JSONDecodeError`.
202
+ - **A file the rebuild left out is never overwritten.** With the store open again, a write that
203
+ recomputes a record's bindings from the index (`add_anchors`, `add_binding`) would have replaced
204
+ a conflicted bindings file with only the new anchor. All six canonical writers now refuse to
205
+ replace a listed file, with an error that names it. `add_anchors` checks first, so its refusal
206
+ leaves no orphan entity file behind. `supersede_decision` and `supersede_fact` refuse to inherit
207
+ anchors from a predecessor whose bindings file is skipped, since the successor would silently
208
+ start with none. `sidegraph-doctor` now says a skipped bindings file is skipped (unreadable),
209
+ not absent or empty. While an entity file is skipped, an anchor to the
210
+ same name mints a second entity, which `sidegraph-doctor`'s `duplicate-entity` check shows once
211
+ the file is fixed.
212
+ - **The skip warning no longer says "remove".** Removing a record file breaks the append-only
213
+ store, and removing an archive segment destroys every archived record in it. The warning now
214
+ says to restore the file with git or fix it by hand, and never to delete a segment. The
215
+ `store-files-skipped` notice says the same when the first listed file is an archive segment:
216
+ its lines that could not be read are left out, restore it with git, never delete it.
217
+ - **`sidegraph-verify` and `sidegraph-doctor` report what the rebuild leaves out.** They read an
218
+ archive segment as one string, so a line of invalid UTF-8 made them exit 1 with "store not
219
+ readable" and no file, and a line whose decision or domain fails its model was not reported at
220
+ all. They now split a segment into lines as bytes and report each bad line as
221
+ `bad-archive-segment`, with its segment and line number. A record file of invalid UTF-8, one
222
+ nested past the recursion limit and one that validates but cannot be serialised (a lone
223
+ surrogate) are `parse-error`s naming the file, where the first two exited 1 and the third
224
+ reported clean. A title holding U+2028 or U+0085 no longer gives a false `bad-archive-segment`.
225
+ - **Compacting a decision whose title holds U+2028 or U+0085 no longer leaves a store that will
226
+ not open.** The archive reader split a segment with `str.splitlines`, which breaks a line at
227
+ those characters (the segment holds them raw), so the next rebuild raised "corrupt archive
228
+ segment". A segment is now split as bytes, at `\n` and `\r` only.
229
+
10
230
  ## [0.8.0] — 2026-10-03
11
231
 
12
232
  ### Added
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
13
13
  continuing participant in the project. A core feature must preserve, organize, or deliver
14
14
  accumulated project understanding. Document search by itself is not the product.
15
15
 
16
- Sidegraph is pre-1.0 (v0.8.0) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.9.0) — the full loop (capture, ratification, mistakes-first
17
17
  retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
18
18
  facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
19
19
  a stable release. See
@@ -53,11 +53,14 @@ src/sidegraph/
53
53
  ├── schema.py # Pydantic models: Entity, Decision, Fact, AnchorBinding, Domain, Initiative
54
54
  ├── store.py # owned append-only store (file-per-record JSON); enforces invariants on write
55
55
  ├── retrieval.py # multi-altitude, budget-bounded, task-aware read path (mistakes first)
56
+ ├── hot_index.py # raw-sqlite handle on index.db for the hook hot path (no Store, no pydantic)
57
+ ├── store_layout.py # store constants and rules shared with the hot path (pydantic-free)
56
58
  ├── server.py # FastMCP decision MCP — the tools agents call
57
59
  ├── engine/ # ── ENGINE SEAM ── the ONLY place Graphify specifics may live
58
60
  │ └── reader.py # GraphifyReader: reads graph.json (read-only input; no MCP)
59
- └── host/ # ── HOST SEAM ── Claude Code integration (SessionStart/Stop/PreToolUse)
60
- └── hooks.py # host-specific; portable core never reaches in here
61
+ └── host/ # ── HOST SEAM ── Claude Code integration (SessionStart/Stop/PreToolUse/SubagentStart)
62
+ ├── hooks.py # host-specific; portable core never reaches in here
63
+ └── subagent.py # SubagentStart: the memory brief for a starting subagent
61
64
  ```
62
65
 
63
66
  - **Portable core** (`schema`, `store`, `retrieval`, `server`) knows nothing about Graphify
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sidegraph
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine.
5
5
  Project-URL: Homepage, https://github.com/SantyagoSeaman/sidegraph
6
6
  Project-URL: Repository, https://github.com/SantyagoSeaman/sidegraph
@@ -21,7 +21,9 @@ Classifier: Programming Language :: Python :: 3.14
21
21
  Classifier: Topic :: Software Development :: Documentation
22
22
  Classifier: Topic :: Software Development :: Libraries
23
23
  Requires-Python: >=3.13
24
+ Requires-Dist: anyio>=4
24
25
  Requires-Dist: fastmcp>=3.4
26
+ Requires-Dist: mcp>=1.24
25
27
  Requires-Dist: pydantic>=2.9
26
28
  Requires-Dist: python-ulid>=3.0
27
29
  Description-Content-Type: text/markdown
@@ -73,7 +75,7 @@ only ever reads `graph.json`, so the plain install above is all it needs.
73
75
 
74
76
  ```
75
77
  # 2. Inside a Claude Code session in that repo: install the plugin — MCP server + all
76
- # three hooks, wired automatically.
78
+ # four hooks, wired automatically.
77
79
  /plugin marketplace add SantyagoSeaman/sidegraph
78
80
  /plugin install sidegraph@sidegraph
79
81
  ```
@@ -167,7 +169,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
167
169
  next session ◀── SessionStart TOC anchored to entities in the
168
170
  of named domains ◀── get_task_context ◀────── engine's graph (read-only);
169
171
  mistakes first drill_down re-anchored after refactors
170
- blind Read/Grep ──▶ nudged back to get_task_context (each form once per agent)
172
+ Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
171
173
  ```
172
174
 
173
175
  Two layers age differently: the **structure** layer (the code graph — entities,
@@ -45,7 +45,7 @@ only ever reads `graph.json`, so the plain install above is all it needs.
45
45
 
46
46
  ```
47
47
  # 2. Inside a Claude Code session in that repo: install the plugin — MCP server + all
48
- # three hooks, wired automatically.
48
+ # four hooks, wired automatically.
49
49
  /plugin marketplace add SantyagoSeaman/sidegraph
50
50
  /plugin install sidegraph@sidegraph
51
51
  ```
@@ -139,7 +139,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
139
139
  next session ◀── SessionStart TOC anchored to entities in the
140
140
  of named domains ◀── get_task_context ◀────── engine's graph (read-only);
141
141
  mistakes first drill_down re-anchored after refactors
142
- blind Read/Grep ──▶ nudged back to get_task_context (each form once per agent)
142
+ Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
143
143
  ```
144
144
 
145
145
  Two layers age differently: the **structure** layer (the code graph — entities,
@@ -238,7 +238,7 @@ for how this differs from a `Domain`.
238
238
 
239
239
  ## `schema_version` — a public contract
240
240
 
241
- `SCHEMA_VERSION` (currently `0.6.0` in `schema.py`) is stamped into the store's `meta` table
241
+ `SCHEMA_VERSION` (currently `0.6.0`, defined in `store_layout.py` and re-exported by `schema.py`) is stamped into the store's `meta` table
242
242
  once, at creation, and checked for an **exact** match on the fast (digest-matches) freshness
243
243
  path — a mismatch there normally raises immediately rather than silently reading mismatched
244
244
  data. The one exception: a store stamped with a version in `_RELOADABLE_SCHEMA_VERSIONS`
@@ -180,5 +180,5 @@ Continue through the maintenance loop:
180
180
 
181
181
  The visual launch demo must show discovery and review, production proof, new-session capture
182
182
  and ratification, and later organic retrieval. An import-only recording does not satisfy the
183
- release package. The existing concrete-title PreToolUse nudge is part of normal delivery; its
183
+ release package. The existing PreToolUse records block is part of normal delivery; its
184
184
  effect is measured separately and is not new Bootstrap functionality.
@@ -21,14 +21,24 @@ The commands below follow the current development branch. For durable environmen
21
21
  /plugin install sidegraph@sidegraph
22
22
  ```
23
23
 
24
- Installs the MCP server and all three hooks (`SessionStart`, `Stop`, `PreToolUse`) in one
25
- step, pointed at `SIDEGRAPH_DIR=.sidegraph`/`SIDEGRAPH_GRAPH=graphify-out/graph.json` by
26
- default. It runs everything via `uvx --from git+https://github.com/SantyagoSeaman/
27
- sidegraph.git@main` under the hood, so it builds straight from this repository — no PyPI
28
- publish needed, works today. See
24
+ Installs the MCP server and all four hooks (`SessionStart`, `Stop`, `PreToolUse`,
25
+ `SubagentStart`) in one step, pointed at `SIDEGRAPH_DIR=.sidegraph`/`SIDEGRAPH_GRAPH=graphify-out/graph.json` by
26
+ default. It builds straight from this repository — no PyPI publish needed, works today: the MCP
27
+ server and `SessionStart` run `uvx --from git+https://github.com/SantyagoSeaman/
28
+ sidegraph.git@main` under the hood, and `Stop`, `PreToolUse` and `SubagentStart` start from the
29
+ commit `SessionStart` resolved. See
29
30
  [the plugin install path](../integrations/claude-code.md#plugin-install-path) for exactly
30
31
  what gets registered and the cwd-pinning details. Skip to [Verify](#verify) once installed.
31
32
 
33
+ **Scope.** `/plugin install` offers three scopes: user, local and project. From a terminal the
34
+ flag is `claude plugin install sidegraph@sidegraph --scope user|project|local`, and the default
35
+ is user. Enable the plugin at user scope, or in the repository root's
36
+ `.claude/settings.local.json`, and it covers sessions started in any subdirectory. Project scope
37
+ (`.claude/settings.json`) covers only the directory it was installed from: Claude Code reads a
38
+ launch directory's own project settings and no parent's, so a plugin installed at the repository
39
+ root leaves sessions started below it without it. `sidegraph-doctor` reports the gap as
40
+ [`plugin-off-in-subdirectories`](../guides/troubleshooting.md#plugin-off-in-subdirectories).
41
+
32
42
  ## Option B — manual registration
33
43
 
34
44
  Prefer explicit `.mcp.json`/`.claude/settings.json` files (e.g. for review in a PR), or want
@@ -111,7 +121,51 @@ Add to `.claude/settings.json` (merge into an existing file):
111
121
  "hooks": [
112
122
  {
113
123
  "type": "command",
114
- "command": "SIDEGRAPH_DIR=.sidegraph SIDEGRAPH_GRAPH=graphify-out/graph.json uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
124
+ "command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "matcher": "Bash",
130
+ "hooks": [
131
+ {
132
+ "type": "command",
133
+ "if": "Bash(sed *)",
134
+ "command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
135
+ },
136
+ {
137
+ "type": "command",
138
+ "if": "Bash(grep *)",
139
+ "command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
140
+ },
141
+ {
142
+ "type": "command",
143
+ "if": "Bash(rg *)",
144
+ "command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
145
+ },
146
+ {
147
+ "type": "command",
148
+ "if": "Bash(cat *)",
149
+ "command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
150
+ }
151
+ ]
152
+ },
153
+ {
154
+ "matcher": "Agent|Task",
155
+ "hooks": [
156
+ {
157
+ "type": "command",
158
+ "command": "SIDEGRAPH_DIR=.sidegraph uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-pre-tool-use || printf '{}\\n'"
159
+ }
160
+ ]
161
+ }
162
+ ],
163
+ "SubagentStart": [
164
+ {
165
+ "hooks": [
166
+ {
167
+ "type": "command",
168
+ "command": "SIDEGRAPH_DIR=.sidegraph SIDEGRAPH_GRAPH=graphify-out/graph.json uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-subagent-start || printf '{}\\n'"
115
169
  }
116
170
  ]
117
171
  }
@@ -120,6 +174,10 @@ Add to `.claude/settings.json` (merge into an existing file):
120
174
  }
121
175
  ```
122
176
 
177
+ These recipes keep plain `@main` on every command, which is simpler to copy. The plugin's own
178
+ `Stop`, `PreToolUse` and `SubagentStart` commands start from the commit `SessionStart` resolved,
179
+ which is faster on each call; see [the plugin install path](../integrations/claude-code.md#plugin-install-path).
180
+
123
181
  From a source checkout, replace each `uvx --from git+... <entrypoint>` above with `uv run
124
182
  --project /ABSOLUTE/PATH/TO/sidegraph <entrypoint>` (see the note in step 1). Keep the trailing
125
183
  `|| printf …` on each command: Claude Code treats a hook that exits 2 with text on stderr as a
@@ -136,18 +194,35 @@ The env vars are inlined into the command because Claude Code hook entries have
136
194
  standing instruction to call `get_task_context` before any search — bash grep/rg/find and
137
195
  MCP structure-query tools included, not just `Read`/`Grep` (see
138
196
  [`reference/hooks.md`](../reference/hooks.md#sidegraph-session-start)).
139
- - `Stop` nudges the agent, at most once per session and only once the session has produced
197
+ - `Stop` nudges the agent, once per session and only once the session has produced
140
198
  **>= 2 real user prompts** (a substance gate — a session's very first `Stop` no longer
141
- triggers it), to propose durable decisions via `propose_decisions` before it finishes; set
199
+ triggers it), to propose durable decisions via `propose_decisions` before it finishes, and
200
+ again after 30 minutes and 10 new commits; set
142
201
  `SIDEGRAPH_CAPTURE_NUDGE=off` (alongside the other env vars in the command) to disable it
143
202
  entirely. See [`reference/hooks.md`](../reference/hooks.md#sidegraph-stop) for the exact
144
203
  nudge text and the substance gate's mechanics.
145
- - `PreToolUse` redirects a blind `Read`/`Grep` on a source file toward
146
- `get_task_context`/`drill_down` with a one-line, non-blocking nudge: a generic form and a
147
- path-specific form, each firing at most once per agent on its own one-shot key, so the
148
- session's own agent can see up to two, and so can each subagent it starts, only when the
149
- store actually has decision memory to offer. Set
150
- `SIDEGRAPH_GREP_NUDGE=off` (alongside the other env vars in the command) to disable it.
204
+ - `PreToolUse` hands the agent the records anchored to a file when it reads or edits it — a
205
+ `Read`, `Grep`, `Edit` or `Write`, or a Bash line whose `sed`, `grep`, `rg` or `cat` names it —
206
+ as a non-blocking block: the top two records (three when the first two are mistakes) with their
207
+ ids, and a line naming `get_task_context` for the rest. Each file arrives once per agent, at
208
+ most three files per call and ten per agent, and the session's own agent and every subagent it
209
+ starts count separately; a file with no records prints nothing. Bash is wired as four entries
210
+ (`if` is `Bash(sed *)`, `Bash(grep *)`, `Bash(rg *)`, `Bash(cat *)`) with the same command, and
211
+ needs Claude Code 2.1.89 for correct matching. Set `SIDEGRAPH_GREP_NUDGE=off` (alongside the
212
+ other env vars in the command) to turn off all of it. See
213
+ [`reference/hooks.md`](../reference/hooks.md#sidegraph-pre-tool-use).
214
+ - The `Agent|Task` group runs that same command when the agent spawns a subagent. It appends the
215
+ records for the files the subagent's brief names (and for the files named in a plan or notes
216
+ document that the brief names) to the brief, so the subagent starts with them. The subagent sees the block in
217
+ its first message; the parent's view of its own call is unchanged. Set
218
+ `SIDEGRAPH_AGENT_BRIEF=off` (alongside the other env vars in the command) to turn it off. See
219
+ [`reference/hooks.md`](../reference/hooks.md#subagent-briefs).
220
+ - `SubagentStart` gives every subagent a short brief, because a subagent gets no `SessionStart`
221
+ context and Explore and Plan agents load no `CLAUDE.md`: the same `get_task_context` call the
222
+ `SessionStart` instruction names, and one sentence on how many records memory holds and on how
223
+ many files. Without this entry your subagents start unaware that memory exists. Set
224
+ `SIDEGRAPH_SUBAGENT_BRIEF=off` (alongside the other env vars in the command) to disable it. See
225
+ [`reference/hooks.md`](../reference/hooks.md#sidegraph-subagent-start).
151
226
 
152
227
  > **Don't also run `graphify claude install`.** It writes its own `PreToolUse` hooks into
153
228
  > `.claude/settings.json` that nudge toward `graphify query` on every read — redundant with
@@ -25,17 +25,19 @@ The commands below follow the current development branch. For durable environmen
25
25
  /plugin install sidegraph@sidegraph
26
26
  ```
27
27
 
28
- Installs the MCP server, the `SessionStart`/`Stop` hooks, and all 12 skills in one step,
28
+ Installs the MCP server, the `SessionStart`/`Stop`/`SubagentStart` hooks, and all 12 skills in one step,
29
29
  pointed at `SIDEGRAPH_DIR=.sidegraph`/`SIDEGRAPH_GRAPH=graphify-out/graph.json` by default.
30
- It runs everything via `uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main`
31
- under the hood, so it builds straight from this repository, no PyPI publish needed. See
30
+ It builds straight from this repository, no PyPI publish needed: the MCP server and `SessionStart`
31
+ run `uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main` under the hood, and
32
+ `Stop` and `SubagentStart` start from the commit `SessionStart` resolved. See
32
33
  [the plugin install path](../integrations/codex.md#plugin-install-path) for exactly what
33
34
  gets registered and the cwd-pinning details, and what has and hasn't been verified live.
34
35
 
35
- 1. Trust the hooks: start an interactive `codex` session in the repo. Codex detects the two
36
- new Sidegraph hook definitions (`SessionStart`, `Stop`) and prompts you in the terminal to
37
- trust them. Approve to complete it. Skip or decline and the MCP tools still work, but
38
- retrieval at session start and the capture reminder at session end stay silent. A hook
36
+ 1. Trust the hooks: start an interactive `codex` session in the repo. Codex detects the new
37
+ Sidegraph hook definitions (`SessionStart`, `Stop`, `SubagentStart`) and prompts you in the
38
+ terminal to trust them. Approve to complete it. Skip or decline and the MCP tools still work,
39
+ but retrieval at session start, the capture reminder at session end and the memory brief a
40
+ subagent gets at its start stay silent. A hook
39
41
  definition change in a later release needs a fresh approval. Review or re-approve anytime
40
42
  with `/hooks`.
41
43
 
@@ -110,6 +112,16 @@ Create `.codex/hooks.json` in the repo:
110
112
  }
111
113
  ]
112
114
  }
115
+ ],
116
+ "SubagentStart": [
117
+ {
118
+ "hooks": [
119
+ {
120
+ "type": "command",
121
+ "command": "cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" && SIDEGRAPH_DIR=.sidegraph SIDEGRAPH_GRAPH=graphify-out/graph.json uv run --project /ABSOLUTE/PATH/TO/sidegraph sidegraph-subagent-start || printf '{}\\n'"
122
+ }
123
+ ]
124
+ }
113
125
  ]
114
126
  }
115
127
  }
@@ -122,6 +134,10 @@ working on a non-git corpus too (Sidegraph doesn't require the corpus to be a gi
122
134
  [`integrations/graphify.md`](../integrations/graphify.md#non-git-and-doc-only-corpora)), where a
123
135
  bare `git rev-parse --show-toplevel` would fail and leave `cd` with no argument.
124
136
 
137
+ The `SubagentStart` entry gives each subagent a short brief (the `get_task_context` call to make,
138
+ and what memory holds), because a subagent gets no `SessionStart` context; see
139
+ [`reference/hooks.md`](../reference/hooks.md#sidegraph-subagent-start).
140
+
125
141
  The trailing `|| printf …` is a guard, and it should stay. On `Stop`, Codex feeds a hook's stderr
126
142
  back to the model when the hook exits 2, and `uv` exits 2 on some of its own errors (a project it
127
143
  cannot find, a cache it cannot write), so a command that never reaches Python could keep
@@ -131,8 +147,8 @@ answers a `systemMessage` telling you to run the hook command in a terminal to s
131
147
  every hook command in the plugin; see [`integrations/codex.md`](../integrations/codex.md#hooks-ga).
132
148
 
133
149
  No `PreToolUse` entry is included above. Codex can invoke that event for local function tools,
134
- but it has no stable `Read`/`Grep` tool pair to which Sidegraph's Claude-specific redirect can
135
- attach. Therefore Claude Code's Read/Grep redirect nudge
150
+ but it has no stable `Read`/`Grep` tool pair to which Sidegraph's Claude-specific records block
151
+ can attach. Therefore Claude Code's `PreToolUse` delivery of a file's records
136
152
  (`sidegraph-pre-tool-use`) has no Codex counterpart to wire up yet — see
137
153
  [`integrations/codex.md`](../integrations/codex.md) for details.
138
154
 
@@ -45,16 +45,26 @@ Inside an interactive host session, in the repo you want memory over:
45
45
  /plugin install sidegraph@sidegraph
46
46
  ```
47
47
 
48
- The Claude Code host installs the MCP server and all three hooks (`SessionStart`, `Stop`,
49
- `PreToolUse`). Codex installs the MCP server, `SessionStart`/`Stop`, and the bundled skills;
50
- its tool surface has no equivalent target for the Claude-specific Read/Grep nudge. The
51
- plugin's bundled config runs everything via `uvx --from
52
- git+https://github.com/SantyagoSeaman/sidegraph.git@main`: unlike the package install, the
53
- plugin deliberately follows the public repository's `main` branch and does not use the
54
- PyPI package. See
48
+ The Claude Code host installs the MCP server and all four hooks (`SessionStart`, `Stop`,
49
+ `PreToolUse`, `SubagentStart`). Codex installs the MCP server, `SessionStart`/`Stop`/
50
+ `SubagentStart`, and the bundled skills;
51
+ its tool surface has no equivalent target for the Claude-specific `PreToolUse` records block. The
52
+ plugin's bundled config installs from the public repository, not PyPI: the MCP server and
53
+ `SessionStart` run `uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main`, and the
54
+ `Stop`, `PreToolUse` and `SubagentStart` hooks start from the commit `SessionStart` resolved. Unlike the package
55
+ install, the plugin deliberately follows the public repository's `main` branch. See
55
56
  the integration details for [Claude Code](../integrations/claude-code.md#plugin-install-path)
56
57
  or [Codex](../integrations/codex.md#plugin-install-path).
57
58
 
59
+ **Scope.** `/plugin install` offers three scopes: user, local and project. From a terminal the
60
+ flag is `claude plugin install sidegraph@sidegraph --scope user|project|local`, and the default
61
+ is user. Enable the plugin at user scope, or in the repository root's
62
+ `.claude/settings.local.json`, and it covers sessions started in any subdirectory. Project scope
63
+ (`.claude/settings.json`) covers only the directory it was installed from: Claude Code reads a
64
+ launch directory's own project settings and no parent's, so a plugin installed at the repository
65
+ root leaves sessions started below it without it. `sidegraph-doctor` reports the gap as
66
+ [`plugin-off-in-subdirectories`](../guides/troubleshooting.md#plugin-off-in-subdirectories).
67
+
58
68
  ### Option C — uvx directly from git
59
69
 
60
70
  Prefer manual wiring, or need an entry point outside Claude Code (e.g. `sidegraph-init` from
@@ -114,7 +124,8 @@ setup, scripted/CI use, and the two deliberately human-run jobs (`sidegraph-impo
114
124
  | `sidegraph-mcp` | The decision MCP server (stdio transport). |
115
125
  | `sidegraph-session-start` | `SessionStart` hook — injects project memory. |
116
126
  | `sidegraph-stop` | `Stop` hook — nudges the agent to distill decisions. |
117
- | `sidegraph-pre-tool-use` | `PreToolUse` hook — redirects a blind `Read`/`Grep` toward `get_task_context`/`drill_down`. |
127
+ | `sidegraph-pre-tool-use` | `PreToolUse` hook — hands the agent the records anchored to a file when it reads or edits it (`Read`, `Grep`, `Edit`, `Write`, and `sed`/`grep`/`rg`/`cat` in Bash). |
128
+ | `sidegraph-subagent-start` | `SubagentStart` hook — tells a starting subagent that decision memory exists and how to ask it. |
118
129
  | `sidegraph-bootstrap` | Guided CLI — scan one of six supported ADR/spec profiles, preview and review candidates, write only after confirmation, verify anchors/host integration, and prove production retrieval. |
119
130
  | `sidegraph-init` | CLI — bootstrap `.sidegraph/` in a repo: create the store, check for the graph, print the plugin install path (and the no-plugin `claude mcp add` alternative). |
120
131
  | `sidegraph-ratify` | CLI — review/accept/drop proposed decisions, facts, and domains. |
@@ -33,6 +33,15 @@ Start a new interactive session in the repository and approve the hook trust pro
33
33
  manual or source-checkout setup, use the host-specific page:
34
34
  [Claude Code](claude-code-setup.md) or [Codex](codex-setup.md).
35
35
 
36
+ **Scope.** `/plugin install` offers three scopes: user, local and project. From a terminal the
37
+ flag is `claude plugin install sidegraph@sidegraph --scope user|project|local`, and the default
38
+ is user. Enable the plugin at user scope, or in the repository root's
39
+ `.claude/settings.local.json`, and it covers sessions started in any subdirectory. Project scope
40
+ (`.claude/settings.json`) covers only the directory it was installed from: Claude Code reads a
41
+ launch directory's own project settings and no parent's, so a plugin installed at the repository
42
+ root leaves sessions started below it without it. `sidegraph-doctor` reports the gap as
43
+ [`plugin-off-in-subdirectories`](../guides/troubleshooting.md#plugin-off-in-subdirectories).
44
+
36
45
  ## 3. Record one real gotcha
37
46
 
38
47
  Choose a real file or symbol in the repository. Tell the agent:
@@ -35,9 +35,10 @@ search instruction**, once, ahead of the rest of the text (not inside either ren
35
35
  > are indexed here. Before a non-trivial change, run the sidegraph check-plan skill if it is
36
36
  > available. If the tool is listed only by name, load it first.
37
37
 
38
- Unlike the `PreToolUse` nudge (`Read`/`Grep` only, each of its two forms at most once per
39
- agent — see below), this line is unconditional and covers every search surface behaviorally, not just those two tools — bash
40
- `grep`/`rg`/`find` and MCP structure-query tools included.
38
+ Unlike the `PreToolUse` records block (the files a `Read`, `Edit`, `Write`, `Grep` or
39
+ `sed`/`grep`/`rg`/`cat` line names, each at most once per agent — see below), this line is
40
+ unconditional and covers every search surface behaviorally, not just calls that name a file with
41
+ records — bash `find` and MCP structure-query tools included.
41
42
 
42
43
  Both renderers also inject:
43
44