sidegraph 0.8.0__tar.gz → 0.10.0__tar.gz

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