sidegraph 0.7.0__tar.gz → 0.9.0__tar.gz

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