sidegraph 0.6.0__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. {sidegraph-0.6.0 → sidegraph-0.8.0}/CHANGELOG.md +321 -0
  2. {sidegraph-0.6.0 → sidegraph-0.8.0}/CLAUDE.md +1 -1
  3. {sidegraph-0.6.0 → sidegraph-0.8.0}/PKG-INFO +2 -2
  4. {sidegraph-0.6.0 → sidegraph-0.8.0}/README.md +1 -1
  5. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/README.md +1 -0
  6. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/anchoring.md +34 -6
  7. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/mind-model.md +7 -7
  8. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/retrieval.md +70 -27
  9. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/claude-code-setup.md +13 -6
  10. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/codex-setup.md +10 -2
  11. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/capturing-decisions.md +19 -7
  12. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/retrieval-in-sessions.md +26 -5
  13. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/semantic-docs.md +5 -3
  14. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/surviving-refactors.md +41 -5
  15. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/team-workflow.md +22 -0
  16. sidegraph-0.8.0/docs/guides/troubleshooting.md +221 -0
  17. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/verifying-your-setup.md +3 -2
  18. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/integrations/claude-code.md +73 -26
  19. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/integrations/codex.md +53 -6
  20. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/integrations/graphify.md +130 -26
  21. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/llms.txt +1 -0
  22. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/cli.md +109 -13
  23. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/configuration.md +27 -9
  24. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/git-bindings.md +5 -3
  25. sidegraph-0.8.0/docs/reference/hooks.md +566 -0
  26. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/mcp-tools.md +187 -9
  27. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/operations.md +1 -1
  28. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/stability.md +4 -3
  29. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/store-format.md +21 -1
  30. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  31. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  32. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/hooks.json +2 -2
  33. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/hooks/hooks.json +3 -3
  34. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/SKILL.md +9 -6
  35. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/SKILL.md +5 -3
  36. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/SKILL.md +11 -6
  37. {sidegraph-0.6.0 → sidegraph-0.8.0}/pyproject.toml +1 -1
  38. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/__init__.py +1 -1
  39. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/capture.py +20 -21
  40. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/cli.py +319 -9
  41. sidegraph-0.8.0/src/sidegraph/config.py +533 -0
  42. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/doctor.py +101 -18
  43. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/engine/reader.py +380 -6
  44. sidegraph-0.8.0/src/sidegraph/freshness.py +59 -0
  45. sidegraph-0.8.0/src/sidegraph/githooks.py +556 -0
  46. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/host/hooks.py +648 -150
  47. sidegraph-0.8.0/src/sidegraph/integrity.py +1098 -0
  48. sidegraph-0.8.0/src/sidegraph/nearest_anchored.py +305 -0
  49. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/retrieval.py +246 -74
  50. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/schema.py +12 -1
  51. sidegraph-0.8.0/src/sidegraph/seed_ladder.py +604 -0
  52. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/server.py +478 -71
  53. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/stats/model.py +77 -8
  54. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/stats/render.py +43 -3
  55. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/store.py +135 -12
  56. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/sync.py +232 -54
  57. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/verify.py +38 -3
  58. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/conftest.py +19 -0
  59. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/auto_policy/parity_goldens.json +1 -1
  60. sidegraph-0.8.0/tests/fixtures/member_names_python_graph.json +109 -0
  61. sidegraph-0.8.0/tests/fixtures/member_names_swift_graph.json +77 -0
  62. sidegraph-0.8.0/tests/githooks_support.py +194 -0
  63. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_doctor.py +3 -2
  64. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_graph_paths.py +1 -1
  65. sidegraph-0.8.0/tests/test_cli_init_hooks.py +598 -0
  66. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_sync.py +7 -4
  67. sidegraph-0.8.0/tests/test_config_ancestor_lookup.py +265 -0
  68. sidegraph-0.8.0/tests/test_config_borrowed_graph.py +279 -0
  69. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_digest_integrity.py +23 -0
  70. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_docs_claims.py +33 -0
  71. sidegraph-0.8.0/tests/test_doctor_graph_stale.py +90 -0
  72. sidegraph-0.8.0/tests/test_doctor_integrity.py +206 -0
  73. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_scan.py +20 -0
  74. sidegraph-0.8.0/tests/test_git_config_isolation.py +51 -0
  75. sidegraph-0.8.0/tests/test_githooks.py +977 -0
  76. sidegraph-0.8.0/tests/test_graph_freshness.py +552 -0
  77. sidegraph-0.8.0/tests/test_hook_spawn_guard.py +291 -0
  78. sidegraph-0.8.0/tests/test_host_agent_state.py +300 -0
  79. sidegraph-0.8.0/tests/test_host_borrowed_graph.py +288 -0
  80. sidegraph-0.8.0/tests/test_host_integrity.py +1024 -0
  81. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_pretool.py +6 -6
  82. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_session_start.py +171 -6
  83. sidegraph-0.8.0/tests/test_host_session_start_concurrent.py +151 -0
  84. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_stop.py +658 -24
  85. sidegraph-0.8.0/tests/test_host_subdirectory_launch.py +282 -0
  86. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_touch_events.py +1 -1
  87. sidegraph-0.8.0/tests/test_integrity.py +731 -0
  88. sidegraph-0.8.0/tests/test_integrity_refresh_hook.py +296 -0
  89. sidegraph-0.8.0/tests/test_integrity_replay.py +113 -0
  90. sidegraph-0.8.0/tests/test_integrity_stranded.py +864 -0
  91. sidegraph-0.8.0/tests/test_member_anchor_wiring.py +320 -0
  92. sidegraph-0.8.0/tests/test_nearest_anchored.py +59 -0
  93. sidegraph-0.8.0/tests/test_reader_member_name_lookup.py +193 -0
  94. sidegraph-0.8.0/tests/test_reader_member_names.py +369 -0
  95. sidegraph-0.8.0/tests/test_retrieval_guessed.py +442 -0
  96. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_toc.py +180 -3
  97. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_schema_descriptor.py +34 -0
  98. sidegraph-0.8.0/tests/test_seed_ladder.py +1073 -0
  99. sidegraph-0.8.0/tests/test_server_borrowed_graph.py +543 -0
  100. sidegraph-0.8.0/tests/test_server_commit_hint.py +217 -0
  101. sidegraph-0.8.0/tests/test_server_graph_freshness.py +387 -0
  102. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_graph_path.py +3 -2
  103. sidegraph-0.8.0/tests/test_server_nearest_anchored.py +731 -0
  104. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_render_events.py +1 -1
  105. sidegraph-0.8.0/tests/test_server_tolerant_seeds.py +650 -0
  106. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_graph.py +47 -0
  107. sidegraph-0.8.0/tests/test_stats_health.py +205 -0
  108. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_render.py +139 -2
  109. sidegraph-0.8.0/tests/test_store_agent_state.py +282 -0
  110. sidegraph-0.8.0/tests/test_store_binding_index.py +91 -0
  111. sidegraph-0.8.0/tests/test_store_git_root_symlink.py +355 -0
  112. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_mutation_guard.py +19 -1
  113. sidegraph-0.8.0/tests/test_store_update_meta_if.py +60 -0
  114. sidegraph-0.8.0/tests/test_sync_canonical_writes.py +171 -0
  115. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_clean.py +11 -10
  116. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_integration.py +10 -7
  117. sidegraph-0.8.0/tests/test_sync_moved_adoption.py +708 -0
  118. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_rebind.py +25 -16
  119. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_run.py +11 -8
  120. sidegraph-0.8.0/tests/test_sync_toc_cache.py +251 -0
  121. {sidegraph-0.6.0 → sidegraph-0.8.0}/uv.lock +11 -11
  122. sidegraph-0.6.0/docs/reference/hooks.md +0 -302
  123. sidegraph-0.6.0/src/sidegraph/config.py +0 -259
  124. sidegraph-0.6.0/tests/test_sync_toc_cache.py +0 -125
  125. {sidegraph-0.6.0 → sidegraph-0.8.0}/.agents/plugins/marketplace.json +0 -0
  126. {sidegraph-0.6.0 → sidegraph-0.8.0}/.claude-plugin/marketplace.json +0 -0
  127. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/CODEOWNERS +0 -0
  128. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  129. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  130. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  131. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  132. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/secret_scanning.yml +0 -0
  133. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/ci.yml +0 -0
  134. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/publish.yml +0 -0
  135. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/scorecard.yml +0 -0
  136. {sidegraph-0.6.0 → sidegraph-0.8.0}/.github/workflows/session-link-gate.yml +0 -0
  137. {sidegraph-0.6.0 → sidegraph-0.8.0}/.gitignore +0 -0
  138. {sidegraph-0.6.0 → sidegraph-0.8.0}/.gitleaks.toml +0 -0
  139. {sidegraph-0.6.0 → sidegraph-0.8.0}/.pre-commit-config.yaml +0 -0
  140. {sidegraph-0.6.0 → sidegraph-0.8.0}/.python-version +0 -0
  141. {sidegraph-0.6.0 → sidegraph-0.8.0}/AGENTS.md +0 -0
  142. {sidegraph-0.6.0 → sidegraph-0.8.0}/CODE_OF_CONDUCT.md +0 -0
  143. {sidegraph-0.6.0 → sidegraph-0.8.0}/CONTRIBUTING.md +0 -0
  144. {sidegraph-0.6.0 → sidegraph-0.8.0}/LICENSE +0 -0
  145. {sidegraph-0.6.0 → sidegraph-0.8.0}/SECURITY.md +0 -0
  146. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/data-model.md +0 -0
  147. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/concepts/decision-memory.md +0 -0
  148. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/bootstrap.md +0 -0
  149. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/installation.md +0 -0
  150. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/getting-started/quickstart.md +0 -0
  151. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/ci-cd-maintenance.md +0 -0
  152. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/guides/naming-your-domains.md +0 -0
  153. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/README.md +0 -0
  154. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/corpus_fit.py +0 -0
  155. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/judge-prompt.md +0 -0
  156. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/questions-prompt.md +0 -0
  157. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/pilot-kit/rubric-template.md +0 -0
  158. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/reference/releasing.md +0 -0
  159. {sidegraph-0.6.0 → sidegraph-0.8.0}/docs/whitepaper/index.md +0 -0
  160. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/.mcp.json +0 -0
  161. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/codex/mcp.json +0 -0
  162. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  163. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  164. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  165. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  166. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  167. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  168. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  169. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  170. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  171. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  172. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  173. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  174. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  175. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  176. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  177. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  178. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  179. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  180. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  181. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
  182. {sidegraph-0.6.0 → sidegraph-0.8.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  183. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/anchoring.py +0 -0
  184. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  185. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/apply.py +0 -0
  186. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  187. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/cli.py +0 -0
  188. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/integrations.py +0 -0
  189. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/model.py +0 -0
  190. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/planner.py +0 -0
  191. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/proof.py +0 -0
  192. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/review.py +0 -0
  193. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/bootstrap/scan.py +0 -0
  194. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/doc_import.py +0 -0
  195. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/domains.py +0 -0
  196. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/engine/__init__.py +0 -0
  197. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/gitenv.py +0 -0
  198. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/gitio.py +0 -0
  199. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/host/__init__.py +0 -0
  200. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/host/claude_settings.py +0 -0
  201. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/importer.py +0 -0
  202. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/okf.py +0 -0
  203. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/profiles.py +0 -0
  204. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/stats/__init__.py +0 -0
  205. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/__init__.py +0 -0
  206. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  207. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/model.py +0 -0
  208. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/render.py +0 -0
  209. {sidegraph-0.6.0 → sidegraph-0.8.0}/src/sidegraph/viz/template.html +0 -0
  210. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/__init__.py +0 -0
  211. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bitfinex_slice.json +0 -0
  212. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  213. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  214. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  215. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  216. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  217. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/graph.json +0 -0
  218. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  219. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  220. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  221. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  222. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  223. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  224. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  225. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  226. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  227. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  228. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  229. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  230. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  231. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  232. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  233. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  234. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  235. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  236. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  237. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  238. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  239. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  240. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  241. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  242. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/design.md +0 -0
  243. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  244. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  245. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  246. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  247. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  248. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  249. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  250. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  251. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  252. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  253. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  254. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  255. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  256. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  257. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  258. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/fixtures/mini_graph.json +0 -0
  259. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_anchoring.py +0 -0
  260. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  261. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_apply.py +0 -0
  262. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_catalog.py +0 -0
  263. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_cli.py +0 -0
  264. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_integrations.py +0 -0
  265. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_model.py +0 -0
  266. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_planner.py +0 -0
  267. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_proof.py +0 -0
  268. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_review.py +0 -0
  269. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_bootstrap_scan.py +0 -0
  270. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_auto_accept.py +0 -0
  271. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_facts.py +0 -0
  272. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_initiative.py +0 -0
  273. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_integration.py +0 -0
  274. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_neighbors.py +0 -0
  275. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_propose.py +0 -0
  276. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_capture_redact.py +0 -0
  277. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_compact.py +0 -0
  278. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_domains.py +0 -0
  279. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_import.py +0 -0
  280. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_init.py +0 -0
  281. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_okf.py +0 -0
  282. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_ratify.py +0 -0
  283. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_ratify_facts.py +0 -0
  284. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_stats.py +0 -0
  285. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_sync_check.py +0 -0
  286. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_unreadable_paths.py +0 -0
  287. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_cli_viz.py +0 -0
  288. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_codex_plugin.py +0 -0
  289. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_community_baseline.py +0 -0
  290. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_config.py +0 -0
  291. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_corpus_expected_renders.py +0 -0
  292. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_corpus_self_corpus.py +0 -0
  293. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  294. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doc_corpus_integration.py +0 -0
  295. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doc_import.py +0 -0
  296. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor.py +0 -0
  297. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_auto_share.py +0 -0
  298. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_code_drift.py +0 -0
  299. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_dangling_supports.py +0 -0
  300. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_duplicate_entity.py +0 -0
  301. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  302. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_never_surfaced.py +0 -0
  303. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_stale_instructions.py +0 -0
  304. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_doctor_unratified_accept.py +0 -0
  305. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_domains.py +0 -0
  306. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_entity_duplicate_resolution.py +0 -0
  307. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_entity_get_or_create_race.py +0 -0
  308. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_env_isolation.py +0 -0
  309. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_fact_reachability_gate.py +0 -0
  310. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_flow_profile.py +0 -0
  311. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_bindings_blame.py +0 -0
  312. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_bindings_hook.py +0 -0
  313. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_bindings_provenance.py +0 -0
  314. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_git_env.py +0 -0
  315. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_claude_settings.py +0 -0
  316. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_drift_nudge.py +0 -0
  317. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_host_session_key.py +0 -0
  318. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_importer.py +0 -0
  319. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_mind_model_additive_fields.py +0 -0
  320. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_okf.py +0 -0
  321. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_openspec_profile.py +0 -0
  322. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  323. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  324. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_proposal_lifecycle.py +0 -0
  325. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  326. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_ratify_policy.py +0 -0
  327. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_community_labels.py +0 -0
  328. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_doc_nodes.py +0 -0
  329. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_graph.py +0 -0
  330. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_integration.py +0 -0
  331. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_nodes_in_file.py +0 -0
  332. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_perf.py +0 -0
  333. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_rationale.py +0 -0
  334. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_read.py +0 -0
  335. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_resolve.py +0 -0
  336. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_subdir_mismatch.py +0 -0
  337. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_reader_version.py +0 -0
  338. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_redaction_seeded.py +0 -0
  339. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_repoint_integration.py +0 -0
  340. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_budget_counters.py +0 -0
  341. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_context.py +0 -0
  342. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_drift_marker.py +0 -0
  343. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_drilldown.py +0 -0
  344. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_facts.py +0 -0
  345. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_ids.py +0 -0
  346. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_integration.py +0 -0
  347. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_rank.py +0 -0
  348. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_seeds.py +0 -0
  349. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_shown_ids.py +0 -0
  350. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  351. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_thin_tools.py +0 -0
  352. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_toptier.py +0 -0
  353. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_retrieval_unratified.py +0 -0
  354. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sandbox_hygiene.py +0 -0
  355. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_schema_domain.py +0 -0
  356. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_schema_fact.py +0 -0
  357. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_add_anchors.py +0 -0
  358. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_anchoring.py +0 -0
  359. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_capture.py +0 -0
  360. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_coverage_events.py +0 -0
  361. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_domains.py +0 -0
  362. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_drilldown.py +0 -0
  363. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_facts.py +0 -0
  364. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_find_entity.py +0 -0
  365. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_get_store.py +0 -0
  366. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_get_task_context.py +0 -0
  367. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_import.py +0 -0
  368. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_mcp_smoke.py +0 -0
  369. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  370. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_ratify_facts.py +0 -0
  371. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_redaction.py +0 -0
  372. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_supersede.py +0 -0
  373. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_sync_anchors.py +0 -0
  374. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_telemetry.py +0 -0
  375. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_thin_tools.py +0 -0
  376. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_server_verify.py +0 -0
  377. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_model.py +0 -0
  378. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_skill.py +0 -0
  379. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_stats_snapshot.py +0 -0
  380. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store.py +0 -0
  381. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  382. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_canonical_stat.py +0 -0
  383. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_compact.py +0 -0
  384. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_compact_review.py +0 -0
  385. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_concurrent_open.py +0 -0
  386. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_coverage_telemetry.py +0 -0
  387. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_derived_community.py +0 -0
  388. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_domains.py +0 -0
  389. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_entities.py +0 -0
  390. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_fact_cascade.py +0 -0
  391. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_facts.py +0 -0
  392. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_meta.py +0 -0
  393. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_migration.py +0 -0
  394. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_mutation_immediate.py +0 -0
  395. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  396. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_persistence.py +0 -0
  397. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_ratification.py +0 -0
  398. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_rebuild_atomicity.py +0 -0
  399. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_record_identity.py +0 -0
  400. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_render_events.py +0 -0
  401. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_retrieval.py +0 -0
  402. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_slug_conflicts.py +0 -0
  403. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_stamping_marker.py +0 -0
  404. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_symlinks.py +0 -0
  405. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_telemetry.py +0 -0
  406. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_threading.py +0 -0
  407. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_store_tmp_sweep_age.py +0 -0
  408. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_domains.py +0 -0
  409. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_drift_cache.py +0 -0
  410. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_fresh_clone.py +0 -0
  411. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_repoint.py +0 -0
  412. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_report_has_findings.py +0 -0
  413. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_volatile_heal.py +0 -0
  414. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_sync_wiring.py +0 -0
  415. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_telemetry_retention.py +0 -0
  416. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_verify_snapshot.py +0 -0
  417. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_verify_transitions.py +0 -0
  418. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_asset_packaged.py +0 -0
  419. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_model.py +0 -0
  420. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_render_html.py +0 -0
  421. {sidegraph-0.6.0 → sidegraph-0.8.0}/tests/test_viz_render_json.py +0 -0
  422. {sidegraph-0.6.0 → sidegraph-0.8.0}/tools/check_no_session_links.py +0 -0
@@ -7,6 +7,327 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.0] — 2026-10-03
11
+
12
+ ### Added
13
+
14
+ - **`get_task_context` says where the memory is when your file has none.** A file seed the graph
15
+ lacks, or one that resolved with no current record anchored to it, now gets a `## Nearest anchored`
16
+ sentence naming up to three files that do carry records: the graph neighbours first (the two
17
+ with the most records), then the files under the nearest directory that has any, skipping a
18
+ directory that holds more than a quarter of all anchored files (and more than four) and never
19
+ the repository root.
20
+ When the answer has no decision memory at all, the records of those files follow under `##
21
+ Nearest anchored records (not anchored to your files)`, labelled as not about your files, with
22
+ the same supersede line the main answer carries. An empty answer carries the sentence under `##
23
+ Why this is empty`. At most three seeds get a sentence. The records count as shown in
24
+ `sidegraph-stats`, and the neighbour files are never recorded as seeds. See
25
+ [the tool reference](docs/reference/mcp-tools.md#the-nearest-anchored-records).
26
+
27
+ - **Records that never reach the team are now visible.** A record follows the branch and
28
+ checkout it was written on, and on one field corpus two supersessions sat uncommitted for five
29
+ days and 32 proposals lived only on branches that `main`'s session start never saw. Two new
30
+ checks run at session start. `store-uncommitted` (degraded, with a notice, also in
31
+ `sidegraph-doctor` and `sidegraph-stats`) reports store files nobody committed for a day, aged
32
+ by the ULID in a new file's name (a `git stash` cannot rewrite it) and by the modification time
33
+ otherwise; fully staged files do not count, so `sidegraph-doctor --check` in a pre-commit hook
34
+ never blocks the fixing commit. `branch-only-records` (advisory) scans every unmerged local branch,
35
+ oldest first, for open records the default branch lacks (each counted once, for the newest
36
+ branch that holds it), and sends a notice when such a branch is more than a week old: the fix is
37
+ to merge it. The write tools (`add_decision`,
38
+ `supersede_decision`, `add_fact`, `supersede_fact`, `add_anchors`, `add_domain`,
39
+ `supersede_domain`, and the written elements of `propose_decisions` and `propose_domains`) add a
40
+ `commit_hint` to their result when the store is inside a git repository, except a store that is a
41
+ symlink to a directory outside it: git commits the link, not the records behind it. Where records
42
+ are written does not change. See the
43
+ [troubleshooting guide](docs/guides/troubleshooting.md#store-uncommitted) and the
44
+ [MCP tools reference](docs/reference/mcp-tools.md#commit-hint).
45
+
46
+ - **Sidegraph tells you when it needs attention, not only the model.** One list of integrity
47
+ checks now runs at every session start and in `sidegraph-doctor` and `sidegraph-stats`. The model
48
+ still gets a status line per problem, with the five existing lines unchanged and in the same
49
+ order. Problems that need a person also reach you as a `systemMessage`, which Claude Code shows as
50
+ a warning: at most once a day for each check, again at once when a problem gets worse, and not
51
+ again once the check finds nothing. New checks: a store that cannot be opened (a merge conflict
52
+ left in `.sidegraph/`, a damaged index, a store written by another version) now says so and
53
+ names the fix instead of switching memory off silently; a missing or unreadable code graph;
54
+ open records whose every code anchor is orphaned (degraded, with a notice, when three or more were
55
+ written in the last 14 days; advisory otherwise); and store files the last reload could not
56
+ index. A proposal that has waited 30 days earns a notice too. `sidegraph-doctor` gains an
57
+ `orphaned-record` finding and, with no graph, a skipped-checks line (`"graph"` in `--json`'s
58
+ `skipped`) instead of a finding, so `--check` does not start failing CI jobs that run without
59
+ one. `sidegraph-stats` opens with a `HEALTH` line (`health` in `--json`). The checks, their
60
+ severities and fixes are in the new [troubleshooting guide](docs/guides/troubleshooting.md), and
61
+ the output is in the [hooks reference](docs/reference/hooks.md#notices-for-the-human).
62
+
63
+ - **`sidegraph-init` asks whether to keep the code graph fresh, and installs the hook that does
64
+ it.** A graph nobody rebuilds goes stale, and on one field corpus it fell 314 commits behind
65
+ because the setup hint was printed and skipped. In a terminal, init now asks once (default yes);
66
+ `--hooks` installs without asking, `--no-hooks` declines and records it
67
+ (`git config sidegraph.graphRefresh false`), and `--remove-hooks` takes everything out and exits
68
+ without creating a store (it exits 1, and says the removal was partial, when a hook is a symlink
69
+ or has damaged markers and so keeps its block). The hook is a marked block in `post-commit`, `post-merge` and
70
+ `post-checkout`, inserted right after the shebang line so that a foreign hook that ends in `exit`
71
+ cannot skip it, plus a helper that rebuilds the graph in the background, in the main checkout
72
+ only (a linked worktree reads its graph), one rebuild at a time. It never replaces a hook: one that
73
+ is a symlink, not executable, CRLF or not a shell script is left alone and the line to add by hand
74
+ is printed. With `core.hooksPath` set it writes no hook file and prints the lines instead. Without
75
+ a terminal nothing is written, and a new advisory check, `refresh-hook-missing`, tells the model
76
+ to ask you, and tells you once a day, until the hook is installed or declined. A call you add by hand
77
+ counts only when its hook is executable and the call is not in a comment. The three flags are
78
+ a Committed surface ([stability](docs/reference/stability.md)); see
79
+ [keeping the graph fresh](docs/integrations/graphify.md#keeping-the-graph-fresh-git-hooks) and the
80
+ [troubleshooting guide](docs/guides/troubleshooting.md#refresh-hook-missing).
81
+
82
+ ### Changed
83
+
84
+ - **`get_task_context` reads a wrong seed the way you meant it, and an empty answer says why.**
85
+ A seed the graph does not hold as written used to come back as "No context found." Now `./x.py`,
86
+ `x.py:12`, an absolute path inside the repository, a missing or invented directory prefix, a bare
87
+ file name, a directory, and a `Type.member` with no file are read through a short ladder, and a
88
+ `## How your seeds were read` block says what each one became and that a rewrite is a guess. A
89
+ file that exists on disk but not in the graph is never swapped for a namesake. A directory reads
90
+ as up to eight files, or is listed when it holds more than 24. A path that differs from a graph
91
+ file only by letter case reads as that file, even on a case-insensitive filesystem. A path or
92
+ name that could mean several is reported and read as none. Guessed seeds rank in the related
93
+ tier below the seeds you got right. The not-in-graph block now names the normalised path, so
94
+ `./pkg/n.py` gets the stale-or-new advice instead of "check the path". A name with no file that
95
+ matches several symbols is no longer expanded to all of them: it is reported as ambiguous. A call
96
+ with no seeds at all names the accepted domains you can drill into. Telemetry records a rewritten
97
+ path under the path that was read and a directory under its normalised key, and keeps a seed
98
+ whose name starts with `..` that it used to drop. See
99
+ [the tool reference](docs/reference/mcp-tools.md#seeds-are-read-tolerantly).
100
+
101
+ ### Fixed
102
+
103
+ - **A symlinked store's capture commit, code drift and refresh-hook check come from the project
104
+ that holds the link.** A store can be a symlink (`.sidegraph -> ../shared/store`). Its records
105
+ are anchored to code in the project that holds the link, but git resolved the link and answered
106
+ for the repository it points into: `provenance.commit` named that repository's `HEAD`, or was
107
+ empty when the target sits in no repository, so the code-drift check passed silently or never
108
+ ran, and the refresh-hook check read the wrong hooks. Capture now stamps the project's `HEAD`
109
+ (empty while the project has no commits), the code-drift check diffs it in the project's
110
+ repository, and the refresh-hook check reads the project's hooks and recorded choice, the ones
111
+ `sidegraph-init` writes. A store that is not a symlink behaves as before, and
112
+ `--against` (`sidegraph-verify`, `sidegraph-doctor`) still diffs the history of the repository
113
+ that holds the store's files. Three behaviour changes come with it. A store directory that is itself a repository or
114
+ submodule inside another repository now stamps the enclosing project's `HEAD` and measures drift
115
+ there, and its refresh-hook check now runs against the enclosing project; a top-level store
116
+ repository with no enclosing one is unchanged. A record stamped before the fix with the link
117
+ target's (or the nested repository's) `HEAD` now gets `sidegraph-doctor`'s existing
118
+ `code-drift: git unavailable — check skipped` note for that commit, where it used to pass
119
+ silently. And the records of a symlinked store now match in git-bindings rule (a) and in
120
+ `sidegraph-blame`, which read `provenance.commit`. See [the store
121
+ format](docs/reference/store-format.md).
122
+
123
+ ### Security
124
+
125
+ - **The lockfile moves `PyJWT` from 2.13.0 to 2.15.1 and `virtualenv` from 21.7.0 to
126
+ 21.14.4.** The PyJWT 2.14.0 and 2.15.0 fixes cover one critical advisory (an asymmetric
127
+ PEM key with mutated whitespace skips the HMAC key-confusion guard), five high ones (key
128
+ material accepted as HMAC secrets, JWKS redirects, a BOM bypass) and several moderate
129
+ ones. The virtualenv fixes cover seed wheels that were not integrity-checked and
130
+ activation scripts that run commands embedded in a path or a prompt. PyJWT reaches Sidegraph only
131
+ through the MCP SDK's `crypto` extra, and Sidegraph never decodes a token; virtualenv is
132
+ a development dependency through pre-commit. The published package pins neither, so this
133
+ changes development and CI environments and installs made from `uv.lock`; a fresh install
134
+ already resolves fixed versions.
135
+
136
+ ## [0.7.0] — 2026-10-02
137
+
138
+ ### Changed
139
+
140
+ - **The hooks and the MCP server look a missing relative store up inside the repository.** The
141
+ precedence between `--db`, `SIDEGRAPH_DIR`, `SIDEGRAPH_DB` and the default is unchanged, and a
142
+ store that exists where its relative path is anchored still wins. What is new: when a relative
143
+ `SIDEGRAPH_DIR` (or the default `.sidegraph`) does not exist there, the three hooks and the MCP
144
+ server visit the parent directories, nearest first, up to and including the repository root (the
145
+ nearest directory holding a `.git` entry, a directory or a file), and use the first store found.
146
+ The lookup never leaves the repository (a `.git` entry at your home directory or above it is not
147
+ a repository root, so a dotfiles repository does not turn `~/.sidegraph` into every project's
148
+ store) and does not run for `--db`, an absolute `SIDEGRAPH_DIR`, `SIDEGRAPH_DB`, a value with a
149
+ `..` part, or an anchor that is a symlink. The CLI, `sidegraph-init`
150
+ and `sidegraph-bootstrap` are unchanged: from a subdirectory they still need `--db`. To keep the
151
+ old outcome on a host surface, pass an absolute `SIDEGRAPH_DIR`.
152
+
153
+ ### Fixed
154
+
155
+ - **A SessionStart hook registered twice on one host no longer injects the map twice.** Two
156
+ copies firing for one session at once both read the old duplicate-check ledger and both emitted;
157
+ the check now decides and stamps inside one write transaction, and a duplicate still answers
158
+ without waiting for a lock. The ledger keeps one row, so a repeat is still let through when
159
+ another session starts in between, or when two sessions with doubled hooks start together.
160
+ - **Sync's moved rung adopts only a real move.** When an anchor's file is gone, sync looks the
161
+ name up across the whole graph and follows a unique hit to its new file. That lookup ignores
162
+ case and decoration, and the check behind it (the old path is out of `HEAD`, the new one is in
163
+ it) did not ask whether the new path was there before. A type deleted together with its file
164
+ could therefore be re-anchored onto an unrelated file that held an old member of the same name:
165
+ a deleted `Priority` followed `.priority` into another file, silently rewriting the entity's
166
+ committed `descriptor.file_path`. Two rules now close it. The hit must be the same name once
167
+ the call decoration (`()`, a leading `.`) is stripped from both sides, with case kept. And git
168
+ must show the new path arriving in the change that removed the old one: the mainline commit that
169
+ deleted the old path (a branch merged with `--no-ff` counts as one change) must have a first
170
+ parent without the new path and must hold it itself. With `SIDEGRAPH_TRUST_DIRTY_TREE=on` and the
171
+ old path still in `HEAD`, the new path must be absent from `HEAD`. Every git failure refuses, as
172
+ does a history with no deletion in it, so a move out of a path git never held (a gitignored
173
+ directory) and a move that a shallow clone cannot prove now end `orphaned`, which
174
+ `sidegraph:heal-anchors` repairs, instead of being adopted. An uncommitted delete onto a path
175
+ that is already in `HEAD` is `orphaned` too, not remembered as a move waiting for a commit: no
176
+ commit can make it one. The search matches the old path literally (a path such as
177
+ `app/[id]/view.tsx` is not a glob) and ignores `log.showSignature`.
178
+
179
+ Some real moves are refused as well, because git's history alone does not show them as one
180
+ change. Each ends `orphaned` and `sidegraph:heal-anchors` re-anchors it:
181
+ - the new file added in one commit and the old one deleted in another on the first-parent line,
182
+ including a branch merged fast-forward or rebase-merged;
183
+ - a second move before any sync ran (`A` to `B` to `C` while the descriptor still names `A`);
184
+ - an old path that was re-added and then deleted again.
185
+
186
+ To check what an earlier release adopted, list the descriptor rewrites:
187
+ `git log -p --diff-filter=M -- .sidegraph/entities/ | grep -E '^(commit |[-+]\s+"file_path")'`.
188
+ A rewrite is a real move only if the new path was added by the commit that deleted the old one
189
+ (`git log --first-parent -m -1 --diff-filter=D -- <old path>` finds that commit; the new path
190
+ must be missing from its first parent and present in it). Re-anchor a wrong one by superseding
191
+ the record with fresh anchors.
192
+
193
+ - **The `SessionStart` instruction names a call the tool accepts, and a domain's mistake count
194
+ counts what the domain holds.** The standing line told the agent to call
195
+ `get_task_context(seeds)`, but the tool takes `files` and `entities` and rejects anything else,
196
+ so an agent that followed it made a call that failed validation. It now says
197
+ `get_task_context(files=[…])` with repo-relative paths, points at the check-plan skill before a
198
+ non-trivial change when it is available, and says to load the tool first if the host lists it
199
+ only by name. Separately, the per-domain count in the `SessionStart` map read "0 mistake(s)"
200
+ over a domain whose gotchas were anchored to its own code, because it counted only decisions
201
+ tagged to the domain itself. It now counts the accepted `gotcha`, `lesson` and `constraint`
202
+ decisions that `drill_down` serves for the domain, so the two show one number. The map's cache
203
+ records the store's digest, so a retrieval call on an unchanged store no longer rebuilds it, and
204
+ `SessionStart` reads the unratified list without building the whole map. The bindings table gains
205
+ an index by entity (an existing store gets it on its next open), which takes a rebuild of the map
206
+ from about 0.1 s to under 0.03 s on a real store, so the cost of a session start is what it was
207
+ before the count changed, also right after a store change and in a linked worktree. A worktree
208
+ builds its map with the main checkout's graph reader, so it counts the same decisions the main
209
+ checkout does. A map written by a path that has no graph reader (ratify, capture) leaves out
210
+ decisions anchored to a whole document until the next sync.
211
+
212
+ - **A Claude Code subagent gets its own read nudges, and its touches are told apart.** A
213
+ subagent's hook payload carries its parent's session id plus an `agent_id` of its own, and
214
+ the `PreToolUse` nudge keys were per session: once the main agent had been nudged, every
215
+ subagent it started read anchored files blind. Each agent, the session's own and every
216
+ subagent, now gets one generic and one path-specific nudge. The
217
+ keys are claimed in a single statement, so a subagent's parallel opening reads cannot both
218
+ nudge, and `SessionStart` expires keys older than 30 days. The `retrieval_events` journal
219
+ gains a nullable `agent` column, added to an existing index on its next open, that records
220
+ which subagent made a touch; the row stays under the parent's session, so `sidegraph-stats`
221
+ counts the same sessions as before. Only `agent_id` counts, never `agent_type`: a main
222
+ session started with `claude --agent <name>` is still the session's own agent.
223
+
224
+ - **An anchor written `Type.member` now resolves to the member.** Graphify labels a method
225
+ `.playClip()` and links it to its type, an agent writes `AudioPlayback.playClip`, and the two
226
+ never met: the anchor was born orphaned, and a seed naming it never reached the record, which
227
+ surfaced only through its community, as an unratified proposal. With a `file_path`, a name
228
+ with no exact match now falls back to a member of the named type in that file. It is for code
229
+ identifiers only (prose, a numbered heading or a hyphenated file name never reads as a
230
+ member). The name is split at the last `.`, `::` or `#` and the member is compared with its
231
+ case kept. A candidate that an edge ties to a different type is refused, and the answer stays
232
+ orphaned, never guessed, when several remain or when the file holds a case-only twin of the
233
+ member (a struct `Message` beside a method `.message()`, which the store treats as one
234
+ anchor). Without a file, and for a path-qualified name (`src/pkg/mod.py`), nothing changes.
235
+ On the read path a seed that names a stored anchor, and every node a seed resolves to, now
236
+ map to their store entities by the engine mapping, in the neighbour walk as well, so such a
237
+ record ranks as a mistake or decision again. The first `sidegraph-sync` after the upgrade
238
+ reruns once on its own (the sync stamp now carries a resolver revision, which a report does
239
+ not show) and heals the orphans this left behind. The skills and guides no longer say
240
+ `Type.member` names never resolve; the bare name with its file stays the preferred form.
241
+
242
+ - **A hook command that cannot start no longer blocks or loops the host.** On `Stop`, both hosts
243
+ feed a hook's stderr back when the hook exits 2: Codex continues the turn, and Claude Code
244
+ continues the conversation, and Claude Code also blocks the tool call on `PreToolUse`. `uv`
245
+ exits 2 on some of its own errors (a project it cannot find, a cache it cannot write) and `dash`
246
+ exits 2 when the `cd` fails, so a hook command that never reached Python could do exactly that,
247
+ over and over in a headless `codex exec` run. Every shipped hook command, in both plugins and in
248
+ the manual recipes in the docs, now ends with a guard: `Stop` and `PreToolUse` answer `{}`, and
249
+ `SessionStart` answers a one-line `systemMessage` that says the hook could not start and to run
250
+ the hook command in a terminal to see the error. A command that starts Python behaves as
251
+ before. **Codex users: approve the two hooks again once after updating.** Codex records trust
252
+ per hook definition and the definition includes its command, so the changed commands do not run
253
+ until you approve them in `/hooks` or at the next interactive session's trust prompt. **If you
254
+ wired the hooks by hand**, append the guard to your own commands in `.claude/settings.json` or
255
+ `.codex/hooks.json`; the recipes in the docs show it. The Codex page also now says how to run a
256
+ headless review without Sidegraph's hooks.
257
+ - **The capture nudge now arms on Codex.** The Stop hook's substance gate understood only Claude
258
+ Code transcripts, so on a Codex rollout it counted zero prompts and never nudged: every Codex
259
+ session ended without the capture reminder. The gate now reads a rollout too. A person's prompt
260
+ is a user message that is not text Codex wrote itself (the project instructions and environment
261
+ blocks, plugin and skill blocks, an aborted-turn note, a Stop hook's own block reason fed back);
262
+ nor does an answer to the agent's question, which arrives mid-turn, count as one. Each prompt
263
+ counts once although Codex mirrors it as an event. A thread arms after two real prompts, never
264
+ on tool calls. Subagent threads, Codex's automatic reviewer and headless `codex exec` runs, including
265
+ ones started through the Codex TypeScript SDK, never arm, so a review panel's `-o` output is
266
+ never replaced by a continuation. The nudge text, the once-per-session ledger and the hook
267
+ definitions are unchanged, so Codex's trust in the installed hooks stays valid. Claude Code
268
+ sessions are counted exactly as before.
269
+ - **A session started in a subdirectory no longer opens a second, empty store.** Claude Code sets
270
+ `CLAUDE_PROJECT_DIR` to the directory it was launched in, so a launch in `repo/pkg` with the
271
+ plugin active created `repo/pkg/.sidegraph` beside the repository's own store, and the session
272
+ saw no memory. The hooks and the MCP server now use `repo/.sidegraph`, record touches relative
273
+ to it (`pkg/a.py`, so they join the anchors) and keep the nested-store case (`.config/sidegraph`)
274
+ repo-relative. The hooks also read the graph the store's project holds, as the CLI and the MCP
275
+ server do, so a store in a nested directory finds its own `graphify-out/graph.json`; a relative
276
+ `SIDEGRAPH_GRAPH` is no longer looked up under `$CLAUDE_PROJECT_DIR`. A store the old behaviour
277
+ already created is not touched: when the store a session uses is empty and the repository's
278
+ store above it holds records, `SessionStart` adds one line naming both. Remove the empty
279
+ `<subdirectory>/.sidegraph` to use the repository's. A stray store that holds any record (one
280
+ proposed decision from an old capture is enough) is not reported and keeps hiding the
281
+ repository's: review it with `sidegraph-ratify --db <subdirectory>/.sidegraph`, record what
282
+ matters again in the repository's store, then remove the stray directory.
283
+
284
+ - **A code graph that never caught up with `HEAD` now says so.** Nothing compared the commit
285
+ `graph.json` was built at (`built_at_commit`) with `HEAD`, so a graph stuck at an old commit
286
+ looked up to date for good, and every `get_task_context` call seeded with a file added since
287
+ returned a bare `No context found.` The comparison now runs in the engine reader and counts a
288
+ graph as stale only when a file it should hold changed or appeared since the build (a commit
289
+ touching only file types the graph does not hold does not, and a graph built from a dirty tree
290
+ and committed afterwards does not). It surfaces in four places:
291
+ - `SessionStart` adds one line when the graph is stale, with the rebuild command
292
+ (`graphify update .` from the repository root);
293
+ - `get_task_context` appends a `## Not in the code graph` block after its answer when a seed is
294
+ not a file the graph holds, saying whether the graph is stale, shows no committed change since
295
+ its build (the file may be newer than the build, or one the engine skips) or could not be
296
+ compared, or whether the path is a directory, missing or not a normalized repo-relative path
297
+ (an absolute path, `./x`). Seeds the graph holds leave the answer byte-identical and cost no git call;
298
+ - `sidegraph-doctor` reports a new advisory finding, `graph-stale`. **`sidegraph-doctor --check`
299
+ now exits `2` on a stale graph**; a CI job that rebuilds the graph before running doctor is
300
+ unaffected;
301
+ - `sidegraph-stats` adds a `stale:` continuation line under the GRAPH counts, and its `--json`
302
+ gains `graph.freshness`, `built_at`, `commits_behind` and `stale_files`.
303
+
304
+ The docs no longer call a missed refresh "self-healing": the lazy check re-syncs a graph that
305
+ was rebuilt, and only a rebuild fixes one that never was.
306
+
307
+ - **A linked worktree reads the main checkout's code graph, and a missing graph is said.**
308
+ `graphify-out/` is gitignored, so a `git worktree add` checkout had the tracked store and no
309
+ graph, and `get_task_context` resolved nothing there. When the store's own graph is missing and
310
+ its repository is a linked worktree of a main checkout, the read tools (`get_task_context`,
311
+ `query_structure`, `query_decisions`, `drill_down`) and `SessionStart` now open the main
312
+ checkout's graph, found from the worktree's `.git` file alone (no git call). That graph is synced
313
+ index-only: a worktree's index starts cold, and without the derived state (domain communities,
314
+ community bindings, engine mappings) `drill_down` lost most of a domain's decisions and
315
+ `get_task_context` its `## Related` section. The sync never rewrites a tracked file (its moved
316
+ rung, the one step that can, abstains), so the worktree's store stays as git checked it out.
317
+ `SessionStart` builds the domain map in memory from the store, adds a line saying whose graph it
318
+ reads, and names the main checkout in its stale-graph line. `get_task_context` tells a file that
319
+ exists only on the branch apart from one the main checkout's graph is stale for. A file the
320
+ branch changed that the main checkout also has is described as it is in the main checkout (its
321
+ symbols and the edges between them), and nothing warns about it.
322
+ `sync_anchors`, `list_domain_candidates`, every write tool and every CLI default keep reading the
323
+ store's own graph. A bare repository (also one cloned into `x/.git`), a git directory that is
324
+ separate and not itself named `.git`, a submodule and a plain `git clone` have no main checkout
325
+ to borrow from.
326
+ - **`get_task_context` says when there is no code graph at all.** With no reader and at least one
327
+ seed, the answer ends with a `## No code graph` block naming the path that was looked at and
328
+ how to build it, instead of an answer that looked like a search with no hits. A graph that is
329
+ there and cannot be read is reported as not readable, not as missing.
330
+
10
331
  ## [0.6.0] — 2026-10-01
11
332
 
12
333
  ### 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.6.0) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.8.0) — the full loop (capture, ratification, mistakes-first
17
17
  retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
18
18
  facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
19
19
  a stable release. See
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sidegraph
3
- Version: 0.6.0
3
+ Version: 0.8.0
4
4
  Summary: Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine.
5
5
  Project-URL: Homepage, https://github.com/SantyagoSeaman/sidegraph
6
6
  Project-URL: Repository, https://github.com/SantyagoSeaman/sidegraph
@@ -167,7 +167,7 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
167
167
  next session ◀── SessionStart TOC anchored to entities in the
168
168
  of named domains ◀── get_task_context ◀────── engine's graph (read-only);
169
169
  mistakes first drill_down re-anchored after refactors
170
- blind Read/Grep ──▶ nudged back to get_task_context (each form once per session)
170
+ blind Read/Grep ──▶ nudged back to get_task_context (each form once per agent)
171
171
  ```
172
172
 
173
173
  Two layers age differently: the **structure** layer (the code graph — entities,
@@ -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 session)
142
+ blind Read/Grep ──▶ nudged back to get_task_context (each form once 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).
@@ -15,6 +15,22 @@ enclosing-module info, so `name` + `file_path` is all identity has to work with.
15
15
  (lowercase, strip a leading `.`, drop call-decoration like `()`), so `.foo()` in a decision's
16
16
  anchor matches the graph node named `foo`.
17
17
 
18
+ **`Type.member` names.** Graphify labels a method `.foo()` and links it to its type with a
19
+ `method` edge (an enum case with `case_of`), so a name written `Type.foo` has no exact match.
20
+ When none is found and the descriptor has a `file_path`, `resolve()` falls back to the member.
21
+ It is for code identifiers only: the owner (its last segment, so `Outer.Inner.foo` reads as
22
+ `Inner`) and the member must both be identifiers, and the candidate must be a `code` node, so
23
+ prose with a dot in it, a numbered heading or `verify-release.sh` never reads as a member.
24
+ The name is split at its last `.`, `::` or `#`, the node in that file whose label is the member
25
+ is found (case kept), a candidate the graph ties to a different type is rejected, and, of
26
+ several, those tied to the named type are kept. Anything that does not narrow to exactly one
27
+ node is `unresolved`, the orphaned, healable leaf a bare miss has always been, never
28
+ `ambiguous`. So is a name with a case-only twin in the file (a struct `Message` beside a
29
+ method `.message()`): the store dedups an anchor by its lowercased name, so the two spellings
30
+ are one entity, and binding either node would put the other's record on it. Without a file the
31
+ fallback never runs, and a path-qualified name (`src/pkg/mod.py`, which reads as the member
32
+ `py`) still never resolves.
33
+
18
34
  ## Lazy `Entity` creation
19
35
 
20
36
  An `Entity` is created the first time a decision references it — via
@@ -121,8 +137,8 @@ node and a file node are both just nodes.
121
137
  The same pattern applies to `concept` nodes from the semantic pass: a concept has no stable id
122
138
  either, so **anchor concept + file together**, not the concept alone. Re-extracting an edited
123
139
  file can rename or drop the concepts inside it — the same churn a code refactor causes to
124
- symbol names — and the rebind ladder below handles it identically: exact match, then unique
125
- name-only match, then orphaned. No special-casing for concepts versus code symbols.
140
+ symbol names — and the rebind ladder below handles it identically: exact match, then a unique
141
+ same-name match in a file that arrived with the old one's removal, then orphaned. No special-casing for concepts versus code symbols.
126
142
 
127
143
  ## What happens on rename or move
128
144
 
@@ -137,10 +153,13 @@ remembered under `pending_uncommitted_moves` are still re-verified once `HEAD` h
137
153
  re-pointing](../guides/surviving-refactors.md#community-re-pointing)).
138
154
  2. **Ambiguous** — leaf bindings flip to `degraded`; the node mapping is left untouched
139
155
  (never guess); community is re-pointed if a shared one is still resolvable.
140
- 3. **Moved** — exact fails but a name-only retry resolves uniquely, *and* the new file has
141
- the same suffix as the old `descriptor.file_path` (e.g. `.py` -> `.py`, `.md` -> `.md`),
142
- *and* the old `file_path` is confirmed gone from the checkout ->
143
- `descriptor.file_path` is updated to follow the file, leaf bindings heal to `live`.
156
+ 3. **Moved** — exact fails but a name-only retry resolves uniquely, *and* the hit is the
157
+ same name (decoration such as `()` or a leading `.` stripped from both sides, **case
158
+ kept**), *and* the new file has the same suffix as the old `descriptor.file_path` (e.g.
159
+ `.py` -> `.py`, `.md` -> `.md`), *and* the old `file_path` is confirmed gone from the
160
+ checkout, *and* git's history shows the new file arriving in the same change that
161
+ removed the old one -> `descriptor.file_path` is updated to follow the file, leaf
162
+ bindings heal to `live`.
144
163
  **Suffix guard:** a unique name-only hit whose file suffix *differs* from the old one
145
164
  (e.g. a vanished code symbol whose name happens to collide with a doc heading) is a
146
165
  **collision, not a move** — it is never adopted, and falls through to orphaned instead.
@@ -148,6 +167,15 @@ remembered under `pending_uncommitted_moves` are still re-verified once `HEAD` h
148
167
  still there — a symbol renamed *inside* a surviving file is not a move, however unique
149
168
  the name-only hit elsewhere looks, and "can't verify" counts as "still there" (see [why
150
169
  `moved` checks the disk](../guides/surviving-refactors.md#why-moved-checks-the-disk)).
170
+ **Name guard:** the name-only lookup ignores case, so a deleted type `Priority` can find
171
+ an old member `.priority` in an unrelated file. That is a different symbol, not a move,
172
+ and is never adopted. **Arrival guard:** a new path that already existed before the old
173
+ one was removed is a collision, not a move. So is an old path git cannot account for
174
+ (never committed, or beyond the history a shallow clone holds): any git answer that is
175
+ not a clear yes refuses. A refused move falls through to orphaned, which
176
+ `sidegraph:heal-anchors` repairs.
177
+ This rung resolves by name only, so a `Type.member` anchor cannot follow its file being
178
+ moved; the bare member name can.
151
179
  4. **Orphaned** — nothing resolves; leaf bindings flip to `orphaned`. Sync still tries to
152
180
  derive the entity's current community from its surviving file's nodes (useful when a
153
181
  symbol renamed but its file didn't move); that derivation only happens when the file's
@@ -39,19 +39,19 @@ that suffices:
39
39
  summary, a mistake count, and a subdomain count (see
40
40
  [retrieval](retrieval.md#sessionstart-toc)). This is what an agent reads before touching
41
41
  anything — "what areas does this project have, and what should I already know about each."
42
- The mistake count is narrower than "mistakes in this area": it counts only decisions
43
- Tier-1-bound to the domain's own `domain:<slug>` entity (captured, or re-anchored, after
44
- the domain was ratified) — a gotcha anchored to a leaf entity that happens to live in the
45
- domain still surfaces in that entity's task context, just not in this count.
42
+ The mistake count is what `drill_down` would serve for the domain: the accepted `gotcha`,
43
+ `lesson` and `constraint` decisions in the union described under `drill_down` below, so a
44
+ gotcha anchored to a leaf entity that lives in the domain is counted too. Proposed and
45
+ superseded records are not.
46
46
  2. **`drill_down(domain_slug)`** — walk one domain: its full summary, its accepted subdomains,
47
47
  a capped sample of the code/doc entities that currently belong to it, and the decisions
48
- about it (mistakes first). Unlike the TOC's narrower mistake count, `drill_down`'s
49
- `decisions` list is the **union** of decisions tagged directly to the `domain:<slug>` entity,
48
+ about it (mistakes first). Its `decisions` list is the **union** of decisions tagged
49
+ directly to the `domain:<slug>` entity,
50
50
  decisions anchored to any code/doc entity that lives in one of the domain's communities
51
51
  (a community-membership join, deduplicated), and decisions anchored to a whole *document*
52
52
  entity whose file_path is one of the domain's covered files — so a gotcha anchored to a leaf
53
53
  entity in the domain, or an imported ADR that anchored to a doc rather than the domain
54
- abstraction, *does* surface here even though it isn't counted in the TOC. The document branch
54
+ abstraction, *does* surface here, and is counted in the TOC. The document branch
55
55
  matters specifically on doc corpora: `sidegraph-import --docs` anchors an ADR to the
56
56
  document's own file-level node, but Graphify clusters every doc file-level node into one hub
57
57
  community, so that node's community is essentially never among the domain's `communities`