sidegraph 0.14.0__tar.gz → 0.15.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 (566) hide show
  1. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/workflows/ci.yml +3 -1
  2. {sidegraph-0.14.0 → sidegraph-0.15.0}/CHANGELOG.md +39 -0
  3. {sidegraph-0.14.0 → sidegraph-0.15.0}/CLAUDE.md +1 -1
  4. {sidegraph-0.14.0 → sidegraph-0.15.0}/PKG-INFO +4 -1
  5. {sidegraph-0.14.0 → sidegraph-0.15.0}/README.md +3 -0
  6. {sidegraph-0.14.0 → sidegraph-0.15.0}/SECURITY.md +11 -0
  7. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/concepts/data-model.md +38 -0
  8. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/concepts/retrieval.md +11 -0
  9. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/getting-started/bootstrap.md +3 -1
  10. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/getting-started/installation.md +2 -1
  11. sidegraph-0.15.0/docs/guides/adr-export.md +134 -0
  12. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/ci-cd-maintenance.md +5 -0
  13. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/retrieval-in-sessions.md +27 -2
  14. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/troubleshooting.md +5 -4
  15. sidegraph-0.15.0/docs/guides/using-0.15.md +42 -0
  16. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/cli.md +58 -4
  17. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/configuration.md +2 -2
  18. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/hooks.md +112 -25
  19. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/mcp-tools.md +69 -11
  20. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/operations.md +16 -1
  21. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/stability.md +3 -3
  22. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/store-format.md +105 -0
  23. {sidegraph-0.14.0 → sidegraph-0.15.0}/package.json +1 -1
  24. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  25. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  26. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/.muse-plugin/plugin.json +1 -1
  27. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/explain-why/SKILL.md +2 -2
  28. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/record-decision/SKILL.md +5 -4
  29. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/record-fact/SKILL.md +6 -5
  30. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +36 -16
  31. {sidegraph-0.14.0 → sidegraph-0.15.0}/pyproject.toml +2 -1
  32. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/__init__.py +1 -1
  33. sidegraph-0.15.0/src/sidegraph/adr.py +295 -0
  34. sidegraph-0.15.0/src/sidegraph/adr_cli.py +246 -0
  35. sidegraph-0.15.0/src/sidegraph/adr_files.py +313 -0
  36. sidegraph-0.15.0/src/sidegraph/adr_identity.py +47 -0
  37. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/model.py +4 -0
  38. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/planner.py +13 -1
  39. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/proof.py +4 -1
  40. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/cli.py +10 -0
  41. sidegraph-0.15.0/src/sidegraph/delivery.py +358 -0
  42. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/doc_import.py +7 -1
  43. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/doctor.py +151 -3
  44. sidegraph-0.15.0/src/sidegraph/drift_checks.py +209 -0
  45. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/gitio.py +31 -17
  46. sidegraph-0.15.0/src/sidegraph/host/diagnostics.py +60 -0
  47. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/host/hooks.py +291 -74
  48. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/host/launch.py +10 -2
  49. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/host/subagent.py +52 -32
  50. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/hot_index.py +171 -47
  51. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/integrity.py +25 -8
  52. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/nearest_anchored.py +33 -10
  53. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/profiles.py +140 -0
  54. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/retrieval.py +224 -30
  55. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/schema.py +71 -1
  56. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/seed_ladder.py +4 -1
  57. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/server.py +280 -16
  58. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/stats/model.py +118 -0
  59. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/stats/render.py +34 -0
  60. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/store.py +92 -0
  61. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/store_layout.py +6 -1
  62. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/validation_errors.py +4 -0
  63. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/verify.py +42 -3
  64. sidegraph-0.15.0/tests/test_adr.py +344 -0
  65. sidegraph-0.15.0/tests/test_adr_files.py +316 -0
  66. sidegraph-0.15.0/tests/test_adr_identity.py +96 -0
  67. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_proof.py +25 -0
  68. sidegraph-0.15.0/tests/test_cli_adr.py +338 -0
  69. sidegraph-0.15.0/tests/test_delivery_evidence.py +297 -0
  70. sidegraph-0.15.0/tests/test_delivery_stats.py +97 -0
  71. sidegraph-0.15.0/tests/test_delivery_surfaces.py +350 -0
  72. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_docs_claims.py +3 -4
  73. sidegraph-0.15.0/tests/test_drift_checks.py +701 -0
  74. sidegraph-0.15.0/tests/test_file_bound_retrieval.py +493 -0
  75. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_flow_profile.py +1 -0
  76. sidegraph-0.15.0/tests/test_hook_body_compaction.py +295 -0
  77. sidegraph-0.15.0/tests/test_hook_failure_diagnostics.py +468 -0
  78. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_hook_showings.py +41 -7
  79. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_drift_nudge.py +3 -3
  80. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_launch.py +2 -2
  81. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_stop.py +1 -1
  82. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_hot_index.py +3 -1
  83. sidegraph-0.15.0/tests/test_hot_index_facts.py +797 -0
  84. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_hot_index_hook.py +2 -2
  85. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_integrity.py +4 -3
  86. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_write_boundary.py +1 -1
  87. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_annotations.py +2 -1
  88. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_session_attribution.py +1 -1
  89. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stats_model.py +21 -1
  90. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_mutation_guard.py +50 -5
  91. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_worktree_seeds.py +17 -25
  92. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/wheel_smoke.py +1 -1
  93. {sidegraph-0.14.0 → sidegraph-0.15.0}/uv.lock +1 -1
  94. {sidegraph-0.14.0 → sidegraph-0.15.0}/.agents/plugins/marketplace.json +0 -0
  95. {sidegraph-0.14.0 → sidegraph-0.15.0}/.claude-plugin/marketplace.json +0 -0
  96. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/CODEOWNERS +0 -0
  97. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  98. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  99. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  100. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  101. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/secret_scanning.yml +0 -0
  102. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/workflows/publish.yml +0 -0
  103. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/workflows/scorecard.yml +0 -0
  104. {sidegraph-0.14.0 → sidegraph-0.15.0}/.github/workflows/session-link-gate.yml +0 -0
  105. {sidegraph-0.14.0 → sidegraph-0.15.0}/.gitignore +0 -0
  106. {sidegraph-0.14.0 → sidegraph-0.15.0}/.gitleaks.toml +0 -0
  107. {sidegraph-0.14.0 → sidegraph-0.15.0}/.opencode/INSTALL.md +0 -0
  108. {sidegraph-0.14.0 → sidegraph-0.15.0}/.pre-commit-config.yaml +0 -0
  109. {sidegraph-0.14.0 → sidegraph-0.15.0}/.python-version +0 -0
  110. {sidegraph-0.14.0 → sidegraph-0.15.0}/AGENTS.md +0 -0
  111. {sidegraph-0.14.0 → sidegraph-0.15.0}/CODE_OF_CONDUCT.md +0 -0
  112. {sidegraph-0.14.0 → sidegraph-0.15.0}/CONTRIBUTING.md +0 -0
  113. {sidegraph-0.14.0 → sidegraph-0.15.0}/LICENSE +0 -0
  114. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/README.md +0 -0
  115. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/concepts/anchoring.md +0 -0
  116. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/concepts/decision-memory.md +0 -0
  117. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/concepts/mind-model.md +0 -0
  118. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/getting-started/claude-code-setup.md +0 -0
  119. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/getting-started/codex-setup.md +0 -0
  120. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/getting-started/quickstart.md +0 -0
  121. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/capturing-decisions.md +0 -0
  122. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/migrating-to-0.14.md +0 -0
  123. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/naming-your-domains.md +0 -0
  124. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/semantic-docs.md +0 -0
  125. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/surviving-refactors.md +0 -0
  126. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/team-workflow.md +0 -0
  127. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/guides/verifying-your-setup.md +0 -0
  128. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/integrations/claude-code.md +0 -0
  129. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/integrations/codex.md +0 -0
  130. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/integrations/graphify.md +0 -0
  131. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/integrations/muse.md +0 -0
  132. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/integrations/opencode.md +0 -0
  133. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/llms.txt +0 -0
  134. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/pilot-kit/README.md +0 -0
  135. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/pilot-kit/corpus_fit.py +0 -0
  136. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/pilot-kit/judge-prompt.md +0 -0
  137. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/pilot-kit/questions-prompt.md +0 -0
  138. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/pilot-kit/rubric-template.md +0 -0
  139. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/git-bindings.md +0 -0
  140. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/reference/releasing.md +0 -0
  141. {sidegraph-0.14.0 → sidegraph-0.15.0}/docs/whitepaper/index.md +0 -0
  142. {sidegraph-0.14.0 → sidegraph-0.15.0}/index.js +0 -0
  143. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/.mcp.json +0 -0
  144. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/codex/hooks.json +0 -0
  145. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/codex/mcp.json +0 -0
  146. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  147. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  148. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  149. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  150. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  151. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  152. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  153. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  154. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  155. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  156. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  157. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  158. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  159. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  160. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  161. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  162. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  163. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  164. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  165. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  166. {sidegraph-0.14.0 → sidegraph-0.15.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  167. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/anchoring.py +0 -0
  168. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bash_paths.py +0 -0
  169. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  170. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/apply.py +0 -0
  171. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  172. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/cli.py +0 -0
  173. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/integrations.py +0 -0
  174. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/review.py +0 -0
  175. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/bootstrap/scan.py +0 -0
  176. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/capture.py +0 -0
  177. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/config.py +0 -0
  178. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/domain_snapshot.py +0 -0
  179. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/domains.py +0 -0
  180. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/engine/__init__.py +0 -0
  181. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/engine/rationale.py +0 -0
  182. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/engine/reader.py +0 -0
  183. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/freshness.py +0 -0
  184. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/gitenv.py +0 -0
  185. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/githooks.py +0 -0
  186. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/host/__init__.py +0 -0
  187. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/host/claude_settings.py +0 -0
  188. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/host/mcp_entry.py +0 -0
  189. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/host/session_identity.py +0 -0
  190. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/importer.py +0 -0
  191. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/input_limits.py +0 -0
  192. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/okf.py +0 -0
  193. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/redaction_scan.py +0 -0
  194. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/redaction_tokens.py +0 -0
  195. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/stats/__init__.py +0 -0
  196. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/sync.py +0 -0
  197. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/text_paths.py +0 -0
  198. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/tool_rate_limit.py +0 -0
  199. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/viz/__init__.py +0 -0
  200. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  201. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/viz/model.py +0 -0
  202. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/viz/render.py +0 -0
  203. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/viz/template.html +0 -0
  204. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/worktree_seeds.py +0 -0
  205. {sidegraph-0.14.0 → sidegraph-0.15.0}/src/sidegraph/write_boundary.py +0 -0
  206. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/__init__.py +0 -0
  207. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/conftest.py +0 -0
  208. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  209. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bitfinex_slice.json +0 -0
  210. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  211. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  212. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  213. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  214. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  215. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/graph.json +0 -0
  216. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  217. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  218. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  219. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  220. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  221. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  222. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  223. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  224. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  225. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  226. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  227. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  228. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  229. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  230. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  231. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  232. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  233. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  234. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  235. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  236. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  237. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  238. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  239. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  240. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/design.md +0 -0
  241. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  242. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  243. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  244. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  245. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  246. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  247. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  248. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  249. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  250. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  251. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  252. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  253. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  254. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  255. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  256. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/member_names_python_graph.json +0 -0
  257. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/member_names_swift_graph.json +0 -0
  258. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/fixtures/mini_graph.json +0 -0
  259. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/githooks_support.py +0 -0
  260. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/graph_fixtures.py +0 -0
  261. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/opencode_plugin_runner.mjs +0 -0
  262. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/snapshot_support.py +0 -0
  263. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_agent_brief_manifests.py +0 -0
  264. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_anchor_descriptor.py +0 -0
  265. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_anchor_paths.py +0 -0
  266. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_anchoring.py +0 -0
  267. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  268. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_anchoring_membership.py +0 -0
  269. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bash_paths.py +0 -0
  270. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_batch_panel_fixes.py +0 -0
  271. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_apply.py +0 -0
  272. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_catalog.py +0 -0
  273. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_cli.py +0 -0
  274. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
  275. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_integrations.py +0 -0
  276. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_model.py +0 -0
  277. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_planner.py +0 -0
  278. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_review.py +0 -0
  279. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_scan.py +0 -0
  280. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_scan_regular.py +0 -0
  281. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bootstrap_unanchored.py +0 -0
  282. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_bounded_listings.py +0 -0
  283. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_capture_auto_accept.py +0 -0
  284. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_capture_facts.py +0 -0
  285. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_capture_initiative.py +0 -0
  286. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_capture_integration.py +0 -0
  287. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_capture_neighbors.py +0 -0
  288. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_capture_propose.py +0 -0
  289. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_capture_redact.py +0 -0
  290. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_compact.py +0 -0
  291. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_doctor.py +0 -0
  292. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_domains.py +0 -0
  293. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_domains_snapshot.py +0 -0
  294. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_graph_paths.py +0 -0
  295. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_import.py +0 -0
  296. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_init.py +0 -0
  297. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_init_hooks.py +0 -0
  298. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_okf.py +0 -0
  299. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_ratify.py +0 -0
  300. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_ratify_facts.py +0 -0
  301. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_stats.py +0 -0
  302. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_sync.py +0 -0
  303. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_sync_check.py +0 -0
  304. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_unreadable_paths.py +0 -0
  305. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_cli_viz.py +0 -0
  306. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_codex_plugin.py +0 -0
  307. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_command_windows.py +0 -0
  308. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_community_baseline.py +0 -0
  309. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_config.py +0 -0
  310. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_config_ancestor_lookup.py +0 -0
  311. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_config_borrowed_graph.py +0 -0
  312. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_corpus_expected_renders.py +0 -0
  313. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_corpus_self_corpus.py +0 -0
  314. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  315. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_digest_integrity.py +0 -0
  316. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doc_corpus_integration.py +0 -0
  317. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doc_import.py +0 -0
  318. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor.py +0 -0
  319. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_auto_share.py +0 -0
  320. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_code_drift.py +0 -0
  321. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_dangling_supports.py +0 -0
  322. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_duplicate_entity.py +0 -0
  323. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  324. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_graph_stale.py +0 -0
  325. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_integrity.py +0 -0
  326. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_never_surfaced.py +0 -0
  327. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_scan.py +0 -0
  328. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_stale_instructions.py +0 -0
  329. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_unhashable_payload.py +0 -0
  330. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_doctor_unratified_accept.py +0 -0
  331. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_domain_seed_names.py +0 -0
  332. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_domain_snapshot_format.py +0 -0
  333. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_domain_snapshot_notices.py +0 -0
  334. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_domains.py +0 -0
  335. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_engine_build.py +0 -0
  336. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_entity_duplicate_resolution.py +0 -0
  337. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_entity_get_or_create_race.py +0 -0
  338. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_entry_point_arguments.py +0 -0
  339. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_env_isolation.py +0 -0
  340. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_fact_reachability_gate.py +0 -0
  341. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_git_bindings_blame.py +0 -0
  342. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_git_bindings_hook.py +0 -0
  343. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_git_bindings_provenance.py +0 -0
  344. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_git_config_isolation.py +0 -0
  345. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_git_env.py +0 -0
  346. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_git_output_utf8.py +0 -0
  347. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_githooks.py +0 -0
  348. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_graph_freshness.py +0 -0
  349. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_graphify_pin.py +0 -0
  350. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_hook_payload_encoding.py +0 -0
  351. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_hook_spawn_guard.py +0 -0
  352. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_agent_brief.py +0 -0
  353. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_agent_state.py +0 -0
  354. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_borrowed_graph.py +0 -0
  355. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_claude_settings.py +0 -0
  356. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_integrity.py +0 -0
  357. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_pretool.py +0 -0
  358. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_pretool_records.py +0 -0
  359. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_session_key.py +0 -0
  360. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_session_start.py +0 -0
  361. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_session_start_concurrent.py +0 -0
  362. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_subagent_start.py +0 -0
  363. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_subdirectory_launch.py +0 -0
  364. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_touch_events.py +0 -0
  365. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_host_wiring_checks.py +0 -0
  366. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_hot_path_imports.py +0 -0
  367. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_import_dry_run_preview.py +0 -0
  368. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_importer.py +0 -0
  369. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_index_journal_mode.py +0 -0
  370. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_installed_wheel_smoke.py +0 -0
  371. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_integrity_engine_version.py +0 -0
  372. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_integrity_refresh_hook.py +0 -0
  373. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_integrity_replay.py +0 -0
  374. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_integrity_stranded.py +0 -0
  375. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_lazy_root.py +0 -0
  376. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_mcp_entry_ratify_policy.py +0 -0
  377. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_mcp_entry_repo_root.py +0 -0
  378. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_member_anchor_wiring.py +0 -0
  379. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_mind_model_additive_fields.py +0 -0
  380. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_muse_plugin.py +0 -0
  381. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_nearest_anchored.py +0 -0
  382. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_okf.py +0 -0
  383. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_opencode_plugin.py +0 -0
  384. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_openspec_profile.py +0 -0
  385. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  386. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  387. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_portable_json.py +0 -0
  388. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_proposal_lifecycle.py +0 -0
  389. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_public_hook_launch.py +0 -0
  390. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  391. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_ratify_policy.py +0 -0
  392. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_rationale_compatibility.py +0 -0
  393. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_community_labels.py +0 -0
  394. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_doc_nodes.py +0 -0
  395. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_engine_version.py +0 -0
  396. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_file_labels.py +0 -0
  397. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_graph.py +0 -0
  398. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_integration.py +0 -0
  399. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_label_conventions.py +0 -0
  400. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_member_name_lookup.py +0 -0
  401. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_member_names.py +0 -0
  402. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_nodes_in_file.py +0 -0
  403. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_perf.py +0 -0
  404. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_rationale.py +0 -0
  405. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_read.py +0 -0
  406. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_resolve.py +0 -0
  407. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_stub_collapse.py +0 -0
  408. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_subdir_mismatch.py +0 -0
  409. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_type_split.py +0 -0
  410. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_reader_version.py +0 -0
  411. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_rebuild_instruction.py +0 -0
  412. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_redaction_scan.py +0 -0
  413. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_redaction_seeded.py +0 -0
  414. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_redaction_tokens.py +0 -0
  415. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_repo_relative_paths_portable.py +0 -0
  416. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_repoint_integration.py +0 -0
  417. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_budget_counters.py +0 -0
  418. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_context.py +0 -0
  419. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_drift_marker.py +0 -0
  420. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_drilldown.py +0 -0
  421. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_facts.py +0 -0
  422. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_guessed.py +0 -0
  423. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_ids.py +0 -0
  424. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_integration.py +0 -0
  425. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_membership_generations.py +0 -0
  426. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_membership_index.py +0 -0
  427. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_rank.py +0 -0
  428. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_seeds.py +0 -0
  429. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_shown_ids.py +0 -0
  430. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  431. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_thin_tools.py +0 -0
  432. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_toc.py +0 -0
  433. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_toptier.py +0 -0
  434. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_retrieval_unratified.py +0 -0
  435. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sandbox_hygiene.py +0 -0
  436. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_schema_descriptor.py +0 -0
  437. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_schema_domain.py +0 -0
  438. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_schema_fact.py +0 -0
  439. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_secret_scan_gate.py +0 -0
  440. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_binary_limits.py +0 -0
  441. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_capture_diagnostics.py +0 -0
  442. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_capture_limits.py +0 -0
  443. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_cli_diagnostics.py +0 -0
  444. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_doc_limits.py +0 -0
  445. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_input_limits.py +0 -0
  446. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
  447. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_numeric_enums.py +0 -0
  448. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_python_shapes.py +0 -0
  449. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_redaction_cursor.py +0 -0
  450. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_redaction_scaling.py +0 -0
  451. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_security_validation_errors.py +0 -0
  452. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_seed_ladder.py +0 -0
  453. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_seed_paths_portable.py +0 -0
  454. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_add_anchors.py +0 -0
  455. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_anchoring.py +0 -0
  456. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_argument_names.py +0 -0
  457. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_borrowed_graph.py +0 -0
  458. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_capture.py +0 -0
  459. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_commit_hint.py +0 -0
  460. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_coverage_events.py +0 -0
  461. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_decision_listing.py +0 -0
  462. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_domains.py +0 -0
  463. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_drilldown.py +0 -0
  464. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_facts.py +0 -0
  465. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_find_entity.py +0 -0
  466. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_get_store.py +0 -0
  467. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_get_task_context.py +0 -0
  468. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_graph_freshness.py +0 -0
  469. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_graph_path.py +0 -0
  470. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_import.py +0 -0
  471. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_invocation_policy.py +0 -0
  472. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_mcp_smoke.py +0 -0
  473. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_nearest_anchored.py +0 -0
  474. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  475. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_ratify_facts.py +0 -0
  476. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_record_types.py +0 -0
  477. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_redaction.py +0 -0
  478. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_refresh.py +0 -0
  479. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_render_events.py +0 -0
  480. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_result_contract.py +0 -0
  481. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_supersede.py +0 -0
  482. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_sync_anchors.py +0 -0
  483. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_telemetry.py +0 -0
  484. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_thin_tools.py +0 -0
  485. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_tolerant_seeds.py +0 -0
  486. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_server_verify.py +0 -0
  487. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_skill_frontmatter.py +0 -0
  488. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stats_graph.py +0 -0
  489. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stats_health.py +0 -0
  490. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stats_render.py +0 -0
  491. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stats_skill.py +0 -0
  492. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stats_snapshot.py +0 -0
  493. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stop_hot_path.py +0 -0
  494. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_stop_rearm.py +0 -0
  495. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store.py +0 -0
  496. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_agent_state.py +0 -0
  497. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  498. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_bad_file.py +0 -0
  499. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_binding_index.py +0 -0
  500. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_canonical_stat.py +0 -0
  501. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_compact.py +0 -0
  502. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_compact_review.py +0 -0
  503. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_concurrent_open.py +0 -0
  504. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_coverage_telemetry.py +0 -0
  505. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_cross_process_mutations.py +0 -0
  506. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_derived_community.py +0 -0
  507. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_domain_members.py +0 -0
  508. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_domains.py +0 -0
  509. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_entities.py +0 -0
  510. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_fact_cascade.py +0 -0
  511. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_facts.py +0 -0
  512. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_file_anchor_names.py +0 -0
  513. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_git_root_symlink.py +0 -0
  514. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_meta.py +0 -0
  515. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_migration.py +0 -0
  516. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_mutation_immediate.py +0 -0
  517. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_non_file_entries.py +0 -0
  518. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  519. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_persistence.py +0 -0
  520. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_ratification.py +0 -0
  521. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_rebuild_atomicity.py +0 -0
  522. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_record_identity.py +0 -0
  523. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_record_types.py +0 -0
  524. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_render_events.py +0 -0
  525. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_requirement.py +0 -0
  526. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_retrieval.py +0 -0
  527. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_slug_conflicts.py +0 -0
  528. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_snapshot_wiring.py +0 -0
  529. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_stamping_marker.py +0 -0
  530. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_symlinks.py +0 -0
  531. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_telemetry.py +0 -0
  532. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_threading.py +0 -0
  533. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_tmp_sweep_age.py +0 -0
  534. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_store_update_meta_if.py +0 -0
  535. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_subagent_start_manifests.py +0 -0
  536. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_subprocess_text_encoding.py +0 -0
  537. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_canonical_writes.py +0 -0
  538. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_clean.py +0 -0
  539. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_domains.py +0 -0
  540. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_drift_cache.py +0 -0
  541. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_fresh_clone.py +0 -0
  542. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_integration.py +0 -0
  543. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_membership.py +0 -0
  544. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_moved_adoption.py +0 -0
  545. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_rebind.py +0 -0
  546. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_repoint.py +0 -0
  547. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_report_has_findings.py +0 -0
  548. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_run.py +0 -0
  549. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_snapshot_membership.py +0 -0
  550. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_toc_cache.py +0 -0
  551. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_volatile_heal.py +0 -0
  552. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_sync_wiring.py +0 -0
  553. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_telemetry_retention.py +0 -0
  554. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_text_paths.py +0 -0
  555. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_verify_domain_snapshot.py +0 -0
  556. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_verify_git_framing.py +0 -0
  557. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_verify_git_revisions.py +0 -0
  558. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_verify_git_stdin.py +0 -0
  559. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_verify_snapshot.py +0 -0
  560. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_verify_transitions.py +0 -0
  561. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_viz_asset_packaged.py +0 -0
  562. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_viz_model.py +0 -0
  563. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_viz_render_html.py +0 -0
  564. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/test_viz_render_json.py +0 -0
  565. {sidegraph-0.14.0 → sidegraph-0.15.0}/tests/wheel_server_trace.py +0 -0
  566. {sidegraph-0.14.0 → sidegraph-0.15.0}/tools/check_no_session_links.py +0 -0
@@ -193,7 +193,9 @@ jobs:
193
193
  tests/test_verify_git_stdin.py tests/test_seed_paths_portable.py `
194
194
  tests/test_repo_relative_paths_portable.py `
195
195
  tests/test_command_windows.py `
196
- tests/test_hook_payload_encoding.py `
196
+ tests/test_hook_payload_encoding.py tests/test_hook_failure_diagnostics.py `
197
+ tests/test_hot_index_facts.py `
198
+ tests/test_delivery_evidence.py tests/test_delivery_stats.py tests/test_delivery_surfaces.py `
197
199
  tests/test_git_output_utf8.py `
198
200
  $privateTests `
199
201
  tests/test_installed_wheel_smoke.py
@@ -7,6 +7,45 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.15.0] — 2026-10-18
11
+
12
+ ### Added
13
+
14
+ - `sidegraph-export-adr` previews and explicitly writes profile-driven ADR sets with stable
15
+ identity, status/history links, full supporting evidence and preserved human notes.
16
+ Import and bootstrap withhold generated projections instead of duplicating memory.
17
+
18
+ - Explicit `record_drift_check` inspections preserve decision capture history and clear
19
+ only the checked advisory. Changed inspected files or anchor scope re-arm review;
20
+ immutable auxiliary evidence is linted without changing the shared store digest.
21
+
22
+ - Local delivery evidence distinguishes prepared answers, rendered record placements and
23
+ anchor relations, with record status at emission and explicit unknown/empty/error outcomes.
24
+ Stats keeps MCP and automatic hooks separate. Optional bounded index-only writes cannot
25
+ block delivery and retain no task/response text or hashes.
26
+ - Automatic point-of-read context and appended task briefs can include eligible facts with
27
+ their complete statement, source and id, using existing record caps and trust rules.
28
+ Fact lines over 512 characters are withheld whole; full facts remain available through
29
+ `list_facts`. SubagentStart's awareness counts still cover decisions only.
30
+
31
+ ### Fixed
32
+
33
+ - Automatic file-read context and appended agent briefs replace later identical record bodies
34
+ within one answer with explicit references. First copies, per-file applicability, trust,
35
+ selection limits and journal placements stay intact; no state crosses calls or agents.
36
+ - Explicit file lookups return eligible decisions and facts by their exact durable file
37
+ binding when an available graph lacks the file, marked as file applicability with
38
+ unverified symbol anchors. Remaining-record pointers name both decision and fact listings.
39
+ - Failed lifecycle hooks emit at most one content-free diagnostic line on stderr while
40
+ preserving their existing fail-open output. Missing indexes and deliberate format
41
+ refusals remain quiet; diagnostics do not depend on the index or create a log file.
42
+
43
+ ### Known limitations
44
+
45
+ - Selection still uses file/entity/domain context and can include off-task records.
46
+ Task-query ranking remains future work; this release makes no measured relevance or
47
+ time-saving claim. See the [0.15 update and case guide](https://github.com/SantyagoSeaman/sidegraph/blob/v0.15.0/docs/guides/using-0.15.md).
48
+
10
49
  ## [0.14.0] — 2026-10-16
11
50
 
12
51
  ### Graphify 0.9.90
@@ -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.14.0) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.15.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.14.0
3
+ Version: 0.15.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
@@ -397,6 +397,9 @@ Contributions are reviewed here and carried over, with attribution, before the n
397
397
 
398
398
  ## Documentation
399
399
 
400
+ [Export and maintain ADRs](docs/guides/adr-export.md) from the available decision store,
401
+ with a preview by default and explicit writes.
402
+
400
403
  [Getting started](docs/getting-started/installation.md) ·
401
404
  [Concepts](docs/concepts/decision-memory.md) ·
402
405
  [Guides](docs/guides/capturing-decisions.md) ·
@@ -367,6 +367,9 @@ Contributions are reviewed here and carried over, with attribution, before the n
367
367
 
368
368
  ## Documentation
369
369
 
370
+ [Export and maintain ADRs](docs/guides/adr-export.md) from the available decision store,
371
+ with a preview by default and explicit writes.
372
+
370
373
  [Getting started](docs/getting-started/installation.md) ·
371
374
  [Concepts](docs/concepts/decision-memory.md) ·
372
375
  [Guides](docs/guides/capturing-decisions.md) ·
@@ -51,6 +51,17 @@ provider according to your repository's data policy. The runtime data boundary i
51
51
  separate Graphify CLI against the LLM provider you configure. Review that provider's
52
52
  data policy before using the pass on private documents.
53
53
 
54
+ ## Scoped inspection history
55
+
56
+ `record_drift_check` writes immutable `.sidegraph/verifications/<id>.json` files intended
57
+ for source control. They contain a redacted rationale, decision id, UTC time, inspected
58
+ revision, repository-relative paths, Git blob ids and modes, a subject digest and agent
59
+ provenance. Author/session are currently unknown. There is no source body or transcript
60
+ in these files. Paths and Git content addresses are durable repository metadata; review
61
+ the rationale and paths before sharing a store. Redaction is best-effort and cannot
62
+ remove sensitive semantics from ordinary prose. These assertions can be wrong; they are
63
+ neither truth certificates nor ratification. Older runtimes ignore and preserve them.
64
+
54
65
  ## Secret hygiene
55
66
 
56
67
  Text captured into decisions passes a redaction step before it is stored (API keys,
@@ -286,3 +286,41 @@ The `Initiative` model below is a separate low-level persisted record supported
286
286
  | `name` | str | The label as written at capture — a branch name or a short phrase. |
287
287
  | `description` | str \| `null` | Optional one-liner; usually absent for branch-derived initiatives. |
288
288
  | `tags` | list[str] | Stored strings on the low-level record; `upsert_initiative` does not slugify them or create `tag:*` entities. |
289
+
290
+ ## `DriftCheck` — attributed auxiliary inspection
291
+
292
+ An optional immutable file under `.sidegraph/verifications/` records an explicit agent
293
+ judgment that an existing decision still holds. It preserves the decision and original
294
+ capture provenance; it never ratifies a proposal or proves semantic truth. It is outside
295
+ the shared canonical digest/index record tables. See
296
+ [scoped checks](../reference/store-format.md#scoped-drift-checks) and
297
+ [`record_drift_check`](../reference/mcp-tools.md#record_drift_check).
298
+
299
+ | Field | Type | Meaning |
300
+ |---|---|---|
301
+ | `schema_version` | literal `1` | Version of the auxiliary assertion and fixed subject-digest definition; independent of the store format version. |
302
+ | `id` | ULID | Generated check identity, also its immutable filename. Highest generated id is the deterministic per-decision selection rule, not causal ordering. |
303
+ | `decision_id` | str | Existing decision id; terminal or archived decisions remain valid history references. |
304
+ | `checked_at` | aware datetime | UTC time at which the assertion was recorded. |
305
+ | `checked_commit` | str | Full inspected Git HEAD object id, retained as provenance even after squash/clone removes the object locally. |
306
+ | `provenance` | `Provenance` | Source `agent`, commit equals checked revision; author/session currently unknown. |
307
+ | `rationale` | str | Nonblank explanation, redacted before validation; at most 4000 characters. |
308
+ | `required_files` | list[str] | Exact current required anchor-file set, separate from optional inspected dependencies. |
309
+ | `checked_files` | list[`CheckedCodeFile`] | Explicit inspected regular-file snapshots, covering every required file; 1–256 unique safe paths. |
310
+ | `subject_digest` | str | SHA-256 of fixed immutable decision/provenance fields and durable leaf descriptors; excludes lifecycle and volatile mapping/status fields. |
311
+
312
+ Changed inspected files/modes or required scope re-arm review. A matching snapshot after
313
+ an unrelated commit remains covered. A mistaken semantic assertion cannot be detected
314
+ from these hashes; a genuine successor corrects the decision and preserves the check as
315
+ history. Optional comparison failure has the bounded behavior described in store-format.
316
+
317
+ ## `CheckedCodeFile` — inspected Git tree entry
318
+
319
+ Nested in `DriftCheck`; this stores repository metadata, never source bodies or engine
320
+ mappings. The total checked-path budget is 16384 UTF-8 bytes.
321
+
322
+ | Field | Type | Meaning |
323
+ |---|---|---|
324
+ | `path` | str | Safe repository-relative forward-slash path, at most 1024 UTF-8 bytes. |
325
+ | `blob_id` | str | Full Git content address of the inspected file. |
326
+ | `mode` | `100644` \| `100755` | Regular-file Git mode; mode changes participate in applicability. |
@@ -353,6 +353,17 @@ reported separately, by comparing the graph's build commit with `HEAD` (see
353
353
  [the Graphify integration](../integrations/graphify.md#keeping-the-graph-fresh-git-hooks)), and
354
354
  only a rebuild fixes it.
355
355
 
356
+ ### File applicability outside the graph
357
+
358
+ When an available graph does not contain an explicitly requested file, the memory read
359
+ also checks exact durable descriptor paths. Eligible decisions and facts can then arrive as
360
+ `[file-bound]`: declared applicability to that file, with symbol anchors the graph cannot
361
+ verify. This reads no neighboring path as an exact match and changes no anchor or binding.
362
+ Ordinary verified seed routes take precedence over the marker. Named-entity requests,
363
+ ambiguous/directory guesses and graph-present orphan handling keep their existing rules;
364
+ with no graph reader at all, this fallback is unavailable. The file still appears in the
365
+ not-in-graph diagnostic, and proposal policy, history, mistakes-first and budgets still apply.
366
+
356
367
  ### Rendering
357
368
 
358
369
  `TaskContext.render()` emits, in order: **Known mistakes & gotchas**, **Decisions** (with any
@@ -82,6 +82,7 @@ warning code is rendered beside the consequence of accepting it anyway:
82
82
 
83
83
  | Warning code | Consequence of accepting |
84
84
  | --- | --- |
85
+ | `generated-projection` | generated ADRs are projections of existing memory, not new capture evidence |
85
86
  | `missing-choice` | the document states no decision; the record would carry only context |
86
87
  | `missing-rejected-alternatives` | no rejected alternatives were found; the most valuable field stays empty |
87
88
  | `unresolved-anchor` | the anchor does not resolve; the record would not surface for that code |
@@ -112,7 +113,8 @@ stored. There is no default accept-all action.
112
113
  Bootstrap reports four outcomes independently: store, anchors, host integration, and
113
114
  production-path proof. Proof selects an accepted, currently valid decision with a resolved
114
115
  tier-2 anchor and calls the same `get_task_context` production retrieval path used by agent
115
- sessions. Optional domain suggestions do not block that proof.
116
+ sessions. File-bound applicability remains useful retrieval, but does not satisfy this
117
+ current-graph anchor proof. Optional domain suggestions do not block that proof.
116
118
 
117
119
  | Host | MCP | SessionStart | Stop | Read/Grep PreToolUse | Completion label |
118
120
  | --- | --- | --- | --- | --- | --- |
@@ -274,7 +274,7 @@ setup, scripted/CI use, and the two deliberately human-run jobs (`sidegraph-impo
274
274
  | `sidegraph-stop` | `Stop` hook — nudges the agent to distill decisions. |
275
275
  | `sidegraph-pre-tool-use` | `PreToolUse` hook — hands the agent the records anchored to a file when it reads or edits it (`Read`, `Grep`, `Edit`, `Write`, and `sed`/`grep`/`rg`/`cat` in Bash). |
276
276
  | `sidegraph-subagent-start` | `SubagentStart` hook — tells a starting subagent that decision memory exists and how to ask it. |
277
- | `sidegraph-bootstrap` | Guided CLI — scan one of six supported ADR/spec profiles, preview and review candidates, write only after confirmation, verify anchors/host integration, and prove production retrieval. |
277
+ | `sidegraph-bootstrap` | Guided CLI — scan one of seven supported ADR/spec profiles, preview and review candidates, write only after confirmation, verify anchors/host integration, and prove production retrieval. |
278
278
  | `sidegraph-init` | CLI — bootstrap `.sidegraph/` in a repo: create the store, check for the graph, ask (in a terminal) whether to install the git hook that keeps the graph fresh (`--hooks`, `--no-hooks`, `--remove-hooks`), print the plugin install path (and the no-plugin `claude mcp add` alternative). |
279
279
  | `sidegraph-ratify` | CLI — review/accept/drop proposed decisions, facts, and domains. |
280
280
  | `sidegraph-sync` | CLI — re-anchor the store after a Graphify rebuild. |
@@ -285,6 +285,7 @@ setup, scripted/CI use, and the two deliberately human-run jobs (`sidegraph-impo
285
285
  | `sidegraph-verify` | CLI — lint the store's canonical files against its write-path invariants (schema, validity windows, referential integrity, ULID uniqueness); `--against <git-ref>` additionally checks that every store file changed vs that ref was mutated legally (CI mode). |
286
286
  | `sidegraph-doctor` | CLI — one-stop store health: composes `sidegraph-verify`'s strict lint with an advisory curation pass (stale proposals, dangling/degraded/orphaned records, never-surfaced decisions); `--check` also fails on advisory findings. |
287
287
  | `sidegraph-viz` | CLI — render an interactive HTML/JSON view of decisions, facts, entities, anchor status, supersession, and evidence links. |
288
+ | `sidegraph-export-adr` | CLI — preview ADR projections and diffs from canonical memory; explicitly write managed documents with preserved human notes. See [ADR export](../guides/adr-export.md). |
288
289
  | `sidegraph-export-okf` | CLI — project the store into a deterministic [Open Knowledge Format v0.1](https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf) bundle any OKF-aware tool can read; strictly one-way, the store stays the source of truth. |
289
290
  | `sidegraph-stats` | CLI — one screen of local usage statistics from the gitignored index (how often memory was asked for, how much of the code worked on has memory anchored to it, what the store holds, anchor health); read-only, never creates the index, `--json` for the same report as data. Reachable in a session as `/sidegraph:stats`. |
290
291
  | `sidegraph-prepare-commit-msg` | `prepare-commit-msg` git hook — comments candidate `Sidegraph-Decision:` trailers into the commit message template; fail-open with bounded git/SQLite stages. See [`reference/git-bindings.md`](../reference/git-bindings.md). |
@@ -0,0 +1,134 @@
1
+ # Export and maintain ADRs
2
+
3
+ `sidegraph-export-adr` makes stored architectural decisions readable as Markdown ADRs.
4
+ It projects the memory you have; it does not infer a complete architecture from the code.
5
+ Preview first, then run the same command with `--write` after reviewing its diff:
6
+
7
+ ```bash
8
+ uv run sidegraph-export-adr --db .sidegraph --out docs/adr
9
+ uv run sidegraph-export-adr --db .sidegraph --out docs/adr --write
10
+ ```
11
+
12
+ The default is a read-only preview. It creates no directories or files. Neither preview
13
+ nor write opens a `Store`, migrates it, updates its index, or writes `graph.json`. The source
14
+ must already be a valid canonical store; migrate legacy databases explicitly with
15
+ `sidegraph-init` first. Exported text can contain private reasoning: review the diff before
16
+ putting it in tracked or shared documentation.
17
+
18
+ ## What is exported
19
+
20
+ Each accepted, superseded or deprecated `adr` or `constraint` becomes a document. Proposed
21
+ and rejected records stay out. Acceptance status is the trust boundary; legacy accepted
22
+ records need not have a ratifier-name stamp. Context, choice, rejected alternatives and
23
+ consequences come from the record. Missing optional reasoning says `Not recorded.`
24
+
25
+ A fixed footer retains status, validity, history, source pointers, durable code descriptors
26
+ and complete accepted, unclosed supporting facts. Even a future `valid_to` closes a fact;
27
+ the exporter never infers a sample size or runtime qualifier. A successor of another kind
28
+ links to its source record rather than a nonexistent ADR. `index.md` groups documents by
29
+ explicit accepted domain bindings, otherwise under Unassigned. These are membership
30
+ intent and durable descriptors, not claims of current graph resolution.
31
+
32
+ Document-derived records identify their original source and remain orientation to check
33
+ against the artifact and current code. Lessons and gotchas are not turned into ADRs or
34
+ inferred pitfalls just because they share an anchor.
35
+
36
+ ## Format and filenames
37
+
38
+ The flow profile supplies output data; `generic-adr` uses Nygard-style sections and `madr`
39
+ uses MADR-style headings. Existing flow readers retain their dialects and ingest globs.
40
+
41
+ | Profile | Default output below the store's parent |
42
+ |---|---|
43
+ | `generic-adr`, `madr` | `docs/adr` |
44
+ | `superpowers` | `docs/superpowers/adr` |
45
+ | `genkovich-sdd` | `docs/features/sidegraph/adr` |
46
+ | `spec-kit` | `specs/sidegraph/adr` |
47
+ | `bmad` | `_bmad-output/sidegraph-adr` |
48
+ | `openspec` | `openspec/adr` |
49
+
50
+ These are separate ADR projections, not replacements for live flow artifacts. Creating a
51
+ profile's directory can affect structural bootstrap detection (`docs/adr`,
52
+ `docs/superpowers` or `docs/features`). Detection does not mean import candidates exist.
53
+ MADR has no detection marker. Use `--out` to choose a different directory.
54
+
55
+ ```bash
56
+ uv run sidegraph-export-adr --profile madr --out docs/adr
57
+ uv run sidegraph-export-adr --filename '{number:04d}-{id}.md'
58
+ uv run sidegraph-export-adr --template adr-template.txt --out docs/adr
59
+ ```
60
+
61
+ Default filenames contain the stable record ID. Numbered patterns append new numbers;
62
+ existing generated records keep their number and filename when older IDs arrive or the
63
+ pattern changes. Patterns permit only `{id}` and `{number}` with an optional decimal width
64
+ of one to eight digits, must contain the ID, and produce a flat portable `.md` basename.
65
+ They cannot target `index.md`, a device name, or a path outside the output directory.
66
+
67
+ A custom template is a regular UTF-8 file up to 64 KiB, using literal text and
68
+ `string.Template` placeholders. It must include `$title`, `$context`, `$choice`, `$rejected`
69
+ and `$consequences`; `$$` prints a dollar sign. Optional fields are `$kind`, `$status`,
70
+ `$valid_from`, `$valid_to`, `$evidence`, `$anchors`, `$domains`, `$supersedes`, `$successors`,
71
+ `$record_link` and `$source`. The fixed footer remains even if the template omits these.
72
+ Default templates avoid duplicating it. Unknown placeholders or reserved marker lines are
73
+ errors. The generated ownership marker precedes the template, so template YAML frontmatter
74
+ is not at the first byte of the generated file.
75
+
76
+ ## Keep human edits
77
+
78
+ A generated file has a checksummed region followed by `Local notes`. Add human commentary
79
+ after that region; updates preserve those trailing bytes. If an update writes a file whose
80
+ last line lacks a newline, it appends the repository-required final newline.
81
+
82
+ Changing generated prose, its ID or its number produces a conflict. The complete edited
83
+ file survives; the command does not replace it even with `--write`. Move additions to
84
+ Local notes, review the source record and the diff, then resolve the generated region
85
+ explicitly. There is no force-overwrite or fuzzy title-matching mode.
86
+
87
+ Checksums bind protocol version, ID, number and LF-normalized body. CRLF/BOM checkouts are
88
+ accepted, and equivalent generated content remains a no-op. This detects accidental edits;
89
+ it is not authentication against someone deliberately recomputing the checksum. Authored
90
+ opening/closing marker lines are escaped to prevent nested ownership regions. In a code
91
+ fence that escaping is visible as `&lt;`; the canonical source keeps the original text.
92
+
93
+ An unmanaged destination, duplicate generated ID/number, or case-insensitive filename
94
+ collision is a conflict. A human filename prefix of one to eight digits followed by `-`
95
+ or `_` reserves a sequence number; longer timestamps and unseparated digits do not.
96
+ Numbers stop at 99999999 with an explicit error. A later human/generated number overlap
97
+ warns and keeps both files and existing numbers unchanged. Exact destination collisions
98
+ still refuse the complete plan.
99
+ An imported human ADR already in the chosen directory is linked rather than copied.
100
+ Generated files outside the current export population remain for manual review; they are
101
+ never deleted or listed as current. Symlinked output components and nonregular targets are
102
+ refused, as is output inside the source store.
103
+
104
+ A plan containing a conflict applies no files. Writes recheck exact before bytes, create
105
+ new files exclusively and replace existing files atomically while retaining their mode.
106
+ The batch is not a transaction: an I/O failure or later concurrent edit can leave earlier
107
+ files applied, or a partial new file. The report marks an incomplete attempted write;
108
+ review the remaining diff before retrying. No protection against an adversarial ancestor
109
+ replacement or a simultaneous source/index-mode change is claimed.
110
+
111
+ ## Drift and round trips
112
+
113
+ Code drift is advisory output, not rewritten ADR prose. A completed capture-to-HEAD check
114
+ can report a changed anchored file; it does not prove semantic invalidity. Missing stamps,
115
+ uncomputed binding statuses or failed checks remain unknown. Closed/archived decisions are
116
+ not applicable. Uncommitted source edits are outside this existing drift check.
117
+
118
+ The command reuses the doctor's bounded scan for an available rollback index. A WAL index
119
+ is left unopened because even SQLite read-only connections can create auxiliary WAL/SHM
120
+ files; drift is then unknown. The format check follows SQLite's
121
+ [file-header contract](https://www.sqlite.org/fileformat2.html#file_format_version_numbers).
122
+ This preserves source files rather than claiming a clean result from an unavailable check.
123
+
124
+ Generated ADRs are **projections, not new capture evidence**. Both document import and
125
+ bootstrap recognize reserved projection claims and skip them, including changed content,
126
+ foreign IDs and unknown marker versions. Fenced, indented and inline examples are ordinary
127
+ human documents. Import reports `skipped_generated_adr`; bootstrap shows
128
+ `generated-projection`. To transfer memory between repositories, use the canonical store,
129
+ not generated ADRs. This command is separate from the one-way OKF bundle export.
130
+
131
+ `--json` gives planned changes/diffs, advisories, warnings, counts and write-completion
132
+ flags. Exit 0 means successful preview/write, including a valid empty store's empty index;
133
+ 2 means invalid input/store, a conflict or operational failure. Review partial-write flags
134
+ before assuming a failed write applied nothing.
@@ -403,3 +403,8 @@ drafts. Proposed content stays below accepted memory and may be hidden by regula
403
403
  `add_anchors`'s MCP shapes.
404
404
  - [`guides/team-workflow.md`](team-workflow.md) — committing `.sidegraph/` as an ordinary
405
405
  part of the repo, outside of CI.
406
+
407
+ Scoped drift checks are committed auxiliary history under `.sidegraph/verifications/`.
408
+ Use the current `sidegraph-verify` for their schema/reference checks and write-once
409
+ `--against` enforcement; older verifiers ignore them. CI should not create semantic
410
+ inspection assertions automatically merely to obtain fewer drift warnings.
@@ -109,8 +109,14 @@ no query. All three read the store's index directly, so each costs a few tens of
109
109
  carries no records: the subagent asks `get_task_context` for the files it works on.
110
110
  `SIDEGRAPH_SUBAGENT_BRIEF=off` stops it.
111
111
 
112
- The first two channels deliver decisions only (facts reach the agent through `get_task_context`)
113
- and exist on Claude Code only. `SubagentStart` runs on Claude Code and on
112
+ The first two channels can deliver eligible facts as well as decisions, within the same record
113
+ caps. Facts keep their whole statement and source; fact lines longer than 512 characters are
114
+ withheld whole and remain available through `list_facts`. Within one answer or appended brief,
115
+ a later identical record may say `See above` with its kind, trust marker and ID under each
116
+ applicable file. The first copy remains complete for that surface. No state crosses calls or
117
+ agents, and saved characters do not buy extra records. Existing once-per-file claims remain;
118
+ use `get_task_context` for fuller decision context and `list_facts` for whole facts.
119
+ These two channels exist on Claude Code only. `SubagentStart` runs on Claude Code and on
114
120
  Codex. The wiring is in the [hooks reference](../reference/hooks.md#sidegraph-pre-tool-use).
115
121
 
116
122
  ## Asking task-scoped questions so `get_task_context` fires with the right seeds
@@ -139,6 +145,15 @@ Vague, non-task questions ("what does this project do") don't give the tool anyt
139
145
  on — be concrete about the file or symbol so the retrieval has something to resolve. A call with
140
146
  no seeds at all says so, and names the domains you can drill into.
141
147
 
148
+ When an available graph does not contain an explicitly requested file, the memory read
149
+ also checks exact durable descriptor paths. Eligible decisions and facts can then arrive as
150
+ `[file-bound]`: declared applicability to that file, with symbol anchors the graph cannot
151
+ verify. This reads no neighboring path as an exact match and changes no anchor or binding.
152
+ Ordinary verified seed routes take precedence over the marker. Named-entity requests,
153
+ ambiguous/directory guesses and graph-present orphan handling keep their existing rules;
154
+ with no graph reader at all, this fallback is unavailable. The file still appears in the
155
+ not-in-graph diagnostic, and proposal policy, history, mistakes-first and budgets still apply.
156
+
142
157
  ## Reading the output blocks
143
158
 
144
159
  `get_task_context` renders up to six Markdown sections, in this order, each one skipped
@@ -271,3 +286,13 @@ The SessionStart pending-ratification counter is exempt from both: it reports th
271
286
  size **and the oldest item's age** even when nothing in it renders, because a queue you
272
287
  cannot see is exactly the one that rots. `sidegraph-doctor` adds the latency counterpart
273
288
  (`time-to-ratify`) once records carry the ratifier stamp.
289
+
290
+ ## When a drift warning remains after inspection
291
+
292
+ `[drifted]` requests a content review; a moved file alone does not invalidate a decision.
293
+ Use `sidegraph:triage-drift` to read the claim and current code. If the claim still holds,
294
+ `record_drift_check` can append a justified inspection of the current clean committed
295
+ files without changing the decision. If it no longer holds, propose a real successor.
296
+ The [tool reference](../reference/mcp-tools.md#record_drift_check) describes refusal cases
297
+ and coverage. Changed inspected files or scope re-arm the warning; unrelated commits do
298
+ not. The check is an attributed assertion and can be wrong.
@@ -70,7 +70,7 @@ established by core/installed-wheel CI; the native Windows route is verified wit
70
70
  |---|---|---|---|---|
71
71
  | `store-unreadable` | broken | The store cannot be opened, so memory is off for the session | session notice and line | `sidegraph-verify`, or remove the damaged index |
72
72
  | `pending-ratification` | advisory | Proposals await a human's verdict | session line; a notice once the oldest is 30 days old | `sidegraph-ratify` |
73
- | `code-drift` | advisory | Records are anchored to code that changed after their capture | session line | `sidegraph-doctor` |
73
+ | `code-drift` | advisory | Records need content review after code or check-scope changes | session line | `sidegraph-doctor` |
74
74
  | `graph-borrowed` | advisory | A linked worktree reads the main checkout's graph | session line | none needed |
75
75
  | `graph-stale` | degraded | The graph was built at a commit `HEAD` has moved past | session line and notice, doctor, stats | `graphify update .` |
76
76
  | `stray-store` | degraded | A subdirectory launch created a second, empty store | session line and notice | remove the empty store |
@@ -127,9 +127,10 @@ notice.
127
127
 
128
128
  ### code-drift
129
129
 
130
- Records whose anchored files changed after their capture. The line says how many. It is the
131
- agent's work to supersede the ones that no longer hold, so there is no notice. `sidegraph-doctor`
132
- lists them as `code-drift` findings, and the `sidegraph:triage-drift` skill walks them.
130
+ Records needing content review after code changed or a prior scoped check stopped applying.
131
+ The line says how many. Inspect current code: record an explicit `record_drift_check` if the
132
+ claim still holds, or propose a real successor if it does not. There is no user notice.
133
+ `sidegraph-doctor` lists them as `code-drift` findings, and the `sidegraph:triage-drift` skill walks them.
133
134
  `SIDEGRAPH_DRIFT_NUDGE=off` silences the line.
134
135
 
135
136
  ### graph-borrowed
@@ -0,0 +1,42 @@
1
+ # Using Sidegraph 0.15
2
+
3
+ 0.15 adds ADR export and maintenance, auditable delivery statistics, explicit drift
4
+ inspections, eligible fact delivery, and fixes for repeated automatic context and exact-file
5
+ memory outside the graph. File/entity/domain selection still applies; task-query ranking
6
+ is future work. Release changes are listed in the [changelog](../../CHANGELOG.md#0150--2026-10-18).
7
+
8
+ ## Update
9
+
10
+ Keep a backup or commit of your authored `.sidegraph/` files. For a CLI installation:
11
+
12
+ ```bash
13
+ uv tool install --upgrade sidegraph==0.15.0
14
+ ```
15
+
16
+ For plugins, update the marketplace/package and installed plugin using your
17
+ [host's installation instructions](../getting-started/installation.md), then start a new
18
+ session so the MCP server and hooks use the new release. Public plugins intentionally
19
+ follow `main`; an explicit RC pin stays pinned until you change it.
20
+
21
+ ## Collect cases during the first week
22
+
23
+ Use ordinary working tasks. Before a task-specific Sidegraph lookup, save the task brief,
24
+ expected files/entities and any constraints or facts you already expect to help. Unknown
25
+ expectations are valid. After lookup, retain the exact tool arguments and full response
26
+ locally, then note what the agent actually did with the memory.
27
+
28
+ ```text
29
+ Date, project, host, Sidegraph version:
30
+ Task and intended result (before lookup):
31
+ Files/entities and known constraints (before lookup):
32
+ Tool arguments and response (saved locally):
33
+ Useful / off-task / missing records, with IDs if known:
34
+ Observed action influenced by memory, or UNKNOWN:
35
+ ```
36
+
37
+ A few ordinary cases across the week are enough for an initial diagnosis. Include cases
38
+ where memory did not help. Keep real records and responses private; redact credentials
39
+ before sharing a report and exclude whole dialogue exports. Record an observed action
40
+ rather than estimating time saved. Inspected cases can inform private or synthetic regression examples; real records and
41
+ responses stay out of repositories. An inspected case cannot serve as an unseen test for
42
+ a later ranking change.
@@ -1,11 +1,12 @@
1
1
  # CLI reference
2
2
 
3
- 20 console scripts are registered in `pyproject.toml` (`[project.scripts]`): fifteen
3
+ 21 console scripts are registered in `pyproject.toml` (`[project.scripts]`): sixteen
4
4
  commands documented on this page — fourteen in [`src/sidegraph/cli.py`](../../src/sidegraph/cli.py)
5
5
  (including `sidegraph-prepare-commit-msg`, which doubles as a git hook — see
6
6
  [`reference/git-bindings.md`](git-bindings.md) for its installation and mechanism) and the
7
7
  guided `sidegraph-bootstrap` in
8
- [`src/sidegraph/bootstrap/cli.py`](../../src/sidegraph/bootstrap/cli.py) — plus the MCP server
8
+ [`src/sidegraph/bootstrap/cli.py`](../../src/sidegraph/bootstrap/cli.py) and ADR export in
9
+ [`src/sidegraph/adr_cli.py`](../../src/sidegraph/adr_cli.py) — plus the MCP server
9
10
  (`sidegraph-mcp`) and the four hook entry points (`sidegraph-session-start`,
10
11
  `sidegraph-stop`, `sidegraph-pre-tool-use`, `sidegraph-subagent-start`; see
11
12
  [`reference/hooks.md`](hooks.md)).
@@ -1226,6 +1227,7 @@ plain-text line):
1226
1227
  | `dangling-supersedes` | snapshot | a `supersedes` id doesn't resolve to any record, hot or archived (a file skipped for its unsafe name still counts as the record it holds, so renaming it back is the only heal) |
1227
1228
  | `dangling-binding-entity` | snapshot | a binding's `entity_id` doesn't resolve to any `entities/<id>.json` (an entity held by a file skipped for its unsafe name still counts) |
1228
1229
  | `dangling-fact-support` | snapshot | a fact's `supports` id doesn't resolve to any decision (a file skipped for its unsafe name still counts, as for `dangling-supersedes`) |
1230
+ | `dangling-drift-check` | snapshot | an auxiliary verification references no hot or archived decision; terminal targets remain valid history |
1229
1231
  | `dangling-parent` | snapshot | a domain's `parent_id` doesn't resolve to any domain, hot or archived (a superseded, dropped or archived parent still counts, as the write path only checks that it exists; a file skipped for its unsafe name counts too, as for `dangling-supersedes`) |
1230
1232
  | `parent-cycle` | snapshot | the `parent_id` chain of some domains loops back on itself (a domain that is its own parent included); reported once per cycle, at the domain with the smallest id on it, and not for a domain that merely hangs off the cycle |
1231
1233
  | `duplicate-ulid` | snapshot | the same internal id appears in more than one canonical location — two hot files, a hot file plus any archive copy, or two archive segments whose payloads for that id actually differ. **Exempt:** two or more archive segments carrying byte-*identical* payloads for the same id — a sanctioned cross-branch `sidegraph-compact` merge (independent compaction on two branches, later merged) — see [`reference/store-format.md#archive-segments-sidegraph-compact`](store-format.md#archive-segments-sidegraph-compact) |
@@ -1233,7 +1235,7 @@ plain-text line):
1233
1235
  | `filename-id-mismatch` | snapshot | a hot record file's name doesn't match its own internal id |
1234
1236
  | `unsafe-record-id` | snapshot | a record's id is not a safe filename (a single path segment, at most 128 characters, starting with a letter or digit), or is not a string; also a `bindings/` file or hot record file whose name is unsafe, and an `archive/*.jsonl` line whose id is missing, not a string or unsafe. The store's reload skips such a file, and its startup warning points here. A file with an unsafe name gets this code whether or not its content parses; a file with an unsafe name or an unsafe id gets no other snapshot finding (no `filename-id-mismatch`, `duplicate-ulid` or `parse-error`) |
1235
1237
  | `symlinked-store-entry` | snapshot | a store-owned directory or file inside the store is a symlink, live or dangling (one violation per entry); `Store()` refuses to open such a store, so `sidegraph-verify` and `sidegraph-doctor` report the links and stop: no record is linted, no reference checked, no `--against` diff run and no advisory check made until the links are removed (an `--against` ref that does not resolve, or a store outside git, is checked first and still exits `1` without reporting the links) (the text output says so in one line; `--json` carries no marker), see [`reference/store-format.md`](store-format.md#layout-file-per-record-json-plus-a-derived-local-index) |
1236
- | `illegal-field-change` | transition | an immutable field changed between `GIT_REF` and the working tree (the detail names the field); also covers immutable raw keys lost during hot-to-archive transfer, or a modified already-published archive segment (write-once) |
1238
+ | `illegal-field-change` | transition | an immutable field changed between `GIT_REF` and the working tree (the detail names the field); also covers immutable raw keys lost during hot-to-archive transfer, or a modified already-published archive segment or auxiliary verification (write-once) |
1237
1239
  | `illegal-status-jump` | transition | `status` changed to something that isn't a real write-path transition for that record kind |
1238
1240
  | `valid-to-unset` | transition | `valid_to` reverted from a value back to `null` |
1239
1241
  | `valid-to-changed` | transition | `valid_to` changed from one value to a *different* value (only `null → value`, once, is legal) |
@@ -1281,6 +1283,9 @@ which methods):
1281
1283
  - **Initiatives:** no append-only guard in `store.py` at all (`Store.upsert_initiative` is a
1282
1284
  bare, unconditional upsert) — only a *deletion* is flagged (`illegal-deletion`); no
1283
1285
  field-level check runs for initiatives.
1286
+ - **Auxiliary verifications** (`verifications/*.json`): write-once, including formatting;
1287
+ additions are schema/reference-checked by the snapshot layer, every later modification
1288
+ or deletion is illegal. Older verifier versions ignore this directory.
1284
1289
  - **Archive segments** (`archive/*.jsonl`): write-once — a brand-new segment (git status
1285
1290
  `A`) is legal; any modification or deletion of an already-published one is always
1286
1291
  illegal.
@@ -1383,7 +1388,7 @@ plain-text line):
1383
1388
  | `stale-proposal` | a proposed decision/domain whose ULID timestamp is strictly older than `--stale-days` |
1384
1389
  | `unreferenced-entity` | a hot entity no committed anchor set references (structural `domain:*`/`community:*` entities are exempt) |
1385
1390
  | `expired-open-validity` | a decision's `valid_to` is strictly past but its status is still open (`proposed`/`accepted`) |
1386
- | `code-drift` | an open (`proposed`/`accepted`) decision's anchored file(s) changed since the commit its `provenance.commit` was captured at; when binding statuses are uncomputed or unavailable, excludes committed deletions and says "binding status unknown"; also carries the "N record(s) predate commit stamping — not checkable" and git-unavailable notes, in place, when either applies |
1391
+ | `code-drift` | an open (`proposed`/`accepted`) decision's anchored file(s) changed since capture, or an earlier scoped check no longer applies; `record_drift_check` can record an explicit current inspection without rewriting the decision (MCP only); when binding statuses are uncomputed or unavailable, excludes committed deletions and says "binding status unknown"; also carries the "N record(s) predate commit stamping — not checkable" and git-unavailable notes, in place, when either applies |
1387
1392
  | `never-surfaced` | an accepted decision has `0` shows against `N > 0` queries on its anchored file(s) — anchored where people repeatedly work, never once rendered or injected by a hook |
1388
1393
  | `stale-instructions` | an auto-injected agent-instructions file beside the store (`CLAUDE.md`, `AGENTS.md`, `GEMINI.md`, `.cursorrules`) still carries the distinctive wording of a **superseded** decision — that file reaches the agent at turn zero, before retrieval, so an abandoned rule surviving there outranks the store's correction by default. Verbatim-ish match on normalized text with length/word floors; superseded records only; no git call. Advisory: it reports a quotation, not a proven contradiction — the file may be narrating history |
1389
1394
  | `unratified-accept` | an **accepted** record whose provenance says `agent` and which carries no ratifier stamp — the signature `SIDEGRAPH_AUTO_ACCEPT=on` leaves in a shared store (one environment's setting bypassing the ratification gate for everyone). Scoped to records created at/after the EARLIER of the store's earliest ratifier stamp and its creation marker (`.sidegraph/stamping_live_since`, written once when a store is genuinely new — never backfilled onto an existing one), so a store predating both reports nothing rather than everything; a store that has never ratified anything but was created by a marker-writing version is still in scope from its own creation, closing the blind window an unratified store would otherwise sit in forever. A stamped record — including one stamped `auto:<policy>` by an auto-ratification policy — and a human-sourced one are never flagged. A **supersession successor** (`supersedes` set — `supersede_decision`/`supersede_fact`) is never flagged either: reversal has no ratification queue to bypass and lands accepted immediately by design, so it reproduces the signature with no relation to the env var this check hunts. Narrowed exception: a `supersedes`-bearing record IS still flagged if it carries a `layer`, a `provenance.ref`, or a tier-0 `tag:`/`initiative:` binding absent from its predecessor — neither `supersede_decision` nor `supersede_fact` can produce any of the three, so one present proves the `propose_decisions`/auto-accept path wrote it. (The fact half is defensive only: `supersede_fact` always stamps `source="human"`, so a fact successor never reaches this agent-sourced check, and no draft shape carries `supersedes` on a fact.) Only a MINIMAL superseding draft (none of the three) is indistinguishable from a legitimate successor by the record's own fields, and stays excluded — a known, accepted, narrower trade-off than treating every supersession alike. Advisory: the signature is not proof — verify before concluding |
@@ -1517,6 +1522,45 @@ so startup may migrate supported legacy data or rebuild `index.db`. Binding stat
1517
1522
  Exit code 0 on success (a store with problems still exits 0 — the problems are the output), 2
1518
1523
  on an operational error (uninitialized store or unwritable output path).
1519
1524
 
1525
+ ## `sidegraph-export-adr`
1526
+
1527
+ ```bash
1528
+ uv run sidegraph-export-adr --db .sidegraph --out docs/adr # preview only
1529
+ uv run sidegraph-export-adr --db .sidegraph --out docs/adr --write # explicit application
1530
+ uv run sidegraph-export-adr --profile madr --json
1531
+ ```
1532
+
1533
+ Generate and maintain record-derived ADRs with a unified diff by default. Accepted,
1534
+ superseded and deprecated ADR/constraint decisions become documents; proposed/rejected
1535
+ records stay out. A fixed footer retains complete accepted, unclosed explicit evidence,
1536
+ source pointers, status, history, anchors and domain intent. No inferred architectural
1537
+ coverage, automatic prose synthesis or retrieval policy change.
1538
+
1539
+ | Flag | Behavior |
1540
+ |---|---|
1541
+ | `--db` | store path; `SIDEGRAPH_DIR` preferred, deprecated `SIDEGRAPH_DB` retained |
1542
+ | `--profile` | export settings from a flow profile; default `generic-adr` |
1543
+ | `--out` | override the profile directory, otherwise below the store's parent |
1544
+ | `--template` | UTF-8 body template, regular file up to 64 KiB |
1545
+ | `--filename` | safe flat pattern containing `{id}`, optionally `{number:04d}` |
1546
+ | `--write` | explicitly apply a conflict-free plan; absent means no output writes |
1547
+ | `--json` | changes/diffs, advisory states, warnings and write-completion flags |
1548
+
1549
+ Manual additions after the managed region survive. Editing generated prose/ownership
1550
+ causes a conflict, preserving the file; any planned conflict prevents all writes.
1551
+ Existing filenames/numbers are stable; no generated history is deleted. Symlinks,
1552
+ nonregular targets and source-store overlap are refused. Existing files are replaced
1553
+ atomically, but an I/O/race failure can leave earlier writes or a partial newly created
1554
+ file: inspect `applied` and `partial_write_possible` before retrying.
1555
+
1556
+ Export never opens Store, migrates it, or updates source/index/graph files. Drift is
1557
+ report-only and can be unknown, including for unopened WAL indexes. Both import and
1558
+ bootstrap skip generated projections; importing exported ADRs does not create fresh
1559
+ memory. Exit 0 for successful preview/write (including an admitted empty population), 2
1560
+ for invalid input/store, conflicts or operational errors. See the
1561
+ [ADR export guide](../guides/adr-export.md) for formats, custom templates, source tracing,
1562
+ conflict recovery, drift limits and round-trip semantics.
1563
+
1520
1564
  ## `sidegraph-export-okf`
1521
1565
 
1522
1566
  ```bash
@@ -1573,6 +1617,16 @@ sidegraph-stats [--db PATH] [--window DAYS] [--graph PATH] [--json]
1573
1617
 
1574
1618
  One screen of usage statistics, read-only: how often memory was asked for, how much of the
1575
1619
  code being worked on has memory anchored to it, what the store holds, and how the anchors are doing.
1620
+ An additional **DELIVERY** section (`delivery_evidence` in JSON) reports observed MCP
1621
+ outcomes and prepared hook blocks separately: occurrences, actual record placements, anchor relations,
1622
+ retained unique records, status/kind at emission, comparable ranker populations and bounded
1623
+ retention metadata. It is not added to legacy activation or `showings`. Missing optional
1624
+ tables mean unavailable evidence, not zero; with telemetry off the JSON field is `null`.
1625
+ Capacity-eviction counts cover this index's recording lifetime, not just the requested
1626
+ window. Older writers, failed writes and host receipt remain unknown, and hooks have no
1627
+ all-attempt denominator. See [delivery evidence](store-format.md#delivery-evidence-derived-index-only)
1628
+ for exact surfaces, units, privacy and caps. This read-only command never migrates the ledger.
1629
+
1576
1630
  It states what was **shown, asked and touched** — never what was improved, prevented, saved
1577
1631
  or caused. A journal cannot separate "memory sent the agent there" from "the agent was going
1578
1632
  there anyway", so no line of the report claims an effect.