sidegraph 0.14.0__tar.gz → 0.16.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 (575) hide show
  1. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/workflows/ci.yml +6 -2
  2. {sidegraph-0.14.0 → sidegraph-0.16.0}/CHANGELOG.md +75 -0
  3. {sidegraph-0.14.0 → sidegraph-0.16.0}/CLAUDE.md +1 -1
  4. {sidegraph-0.14.0 → sidegraph-0.16.0}/PKG-INFO +5 -2
  5. {sidegraph-0.14.0 → sidegraph-0.16.0}/README.md +3 -0
  6. {sidegraph-0.14.0 → sidegraph-0.16.0}/SECURITY.md +11 -0
  7. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/README.md +1 -0
  8. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/concepts/data-model.md +38 -0
  9. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/concepts/mind-model.md +5 -3
  10. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/concepts/retrieval.md +17 -0
  11. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/getting-started/bootstrap.md +3 -1
  12. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/getting-started/installation.md +11 -9
  13. sidegraph-0.16.0/docs/guides/adr-export.md +134 -0
  14. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/ci-cd-maintenance.md +5 -0
  15. sidegraph-0.16.0/docs/guides/health-check.md +66 -0
  16. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/retrieval-in-sessions.md +27 -2
  17. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/troubleshooting.md +5 -4
  18. sidegraph-0.16.0/docs/guides/using-0.15.md +42 -0
  19. sidegraph-0.16.0/docs/guides/using-0.16.md +45 -0
  20. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/cli.md +97 -21
  21. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/configuration.md +2 -2
  22. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/hooks.md +126 -32
  23. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/mcp-tools.md +114 -37
  24. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/operations.md +16 -1
  25. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/stability.md +3 -3
  26. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/store-format.md +120 -11
  27. {sidegraph-0.14.0 → sidegraph-0.16.0}/package.json +1 -1
  28. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  29. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  30. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/.muse-plugin/plugin.json +5 -1
  31. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/explain-why/SKILL.md +2 -2
  32. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +4 -2
  33. sidegraph-0.16.0/plugin/sidegraph/skills/health-check/SKILL.md +83 -0
  34. sidegraph-0.16.0/plugin/sidegraph/skills/health-check/scripts/collect.py +1100 -0
  35. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +13 -8
  36. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-decision/SKILL.md +5 -4
  37. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-fact/SKILL.md +6 -5
  38. sidegraph-0.16.0/plugin/sidegraph/skills/stats/agents/openai.yaml +6 -0
  39. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +36 -16
  40. {sidegraph-0.14.0 → sidegraph-0.16.0}/pyproject.toml +5 -4
  41. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/__init__.py +1 -1
  42. sidegraph-0.16.0/src/sidegraph/adr.py +295 -0
  43. sidegraph-0.16.0/src/sidegraph/adr_cli.py +246 -0
  44. sidegraph-0.16.0/src/sidegraph/adr_files.py +313 -0
  45. sidegraph-0.16.0/src/sidegraph/adr_identity.py +47 -0
  46. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/model.py +4 -0
  47. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/planner.py +13 -1
  48. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/proof.py +4 -1
  49. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/cli.py +30 -5
  50. sidegraph-0.16.0/src/sidegraph/delivery.py +358 -0
  51. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/doc_import.py +7 -1
  52. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/doctor.py +170 -7
  53. sidegraph-0.16.0/src/sidegraph/drift_checks.py +209 -0
  54. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/gitio.py +33 -18
  55. sidegraph-0.16.0/src/sidegraph/host/diagnostics.py +60 -0
  56. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/host/hooks.py +309 -87
  57. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/host/launch.py +10 -2
  58. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/host/subagent.py +53 -32
  59. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/hot_index.py +173 -48
  60. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/integrity.py +25 -8
  61. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/nearest_anchored.py +33 -10
  62. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/profiles.py +140 -0
  63. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/retrieval.py +243 -38
  64. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/schema.py +71 -1
  65. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/seed_ladder.py +4 -1
  66. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/server.py +424 -35
  67. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/stats/model.py +124 -1
  68. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/stats/render.py +36 -0
  69. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/store.py +310 -91
  70. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/store_layout.py +41 -1
  71. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/sync.py +16 -2
  72. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/validation_errors.py +4 -0
  73. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/verify.py +42 -3
  74. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/githooks_support.py +4 -0
  75. sidegraph-0.16.0/tests/test_adr.py +344 -0
  76. sidegraph-0.16.0/tests/test_adr_files.py +316 -0
  77. sidegraph-0.16.0/tests/test_adr_identity.py +96 -0
  78. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_proof.py +25 -0
  79. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bounded_listings.py +435 -0
  80. sidegraph-0.16.0/tests/test_cli_adr.py +338 -0
  81. sidegraph-0.16.0/tests/test_cli_compact.py +299 -0
  82. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_codex_plugin.py +9 -2
  83. sidegraph-0.16.0/tests/test_delivery_evidence.py +297 -0
  84. sidegraph-0.16.0/tests/test_delivery_stats.py +97 -0
  85. sidegraph-0.16.0/tests/test_delivery_surfaces.py +350 -0
  86. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_docs_claims.py +3 -4
  87. sidegraph-0.16.0/tests/test_drift_checks.py +701 -0
  88. sidegraph-0.16.0/tests/test_file_bound_retrieval.py +493 -0
  89. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_flow_profile.py +1 -0
  90. sidegraph-0.16.0/tests/test_health_check_skill.py +1195 -0
  91. sidegraph-0.16.0/tests/test_hook_body_compaction.py +295 -0
  92. sidegraph-0.16.0/tests/test_hook_contention.py +972 -0
  93. sidegraph-0.16.0/tests/test_hook_failure_diagnostics.py +468 -0
  94. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_hook_showings.py +41 -7
  95. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_drift_nudge.py +3 -3
  96. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_launch.py +2 -2
  97. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_pretool_records.py +110 -22
  98. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_stop.py +1 -1
  99. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_hot_index.py +3 -1
  100. sidegraph-0.16.0/tests/test_hot_index_facts.py +797 -0
  101. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_hot_index_hook.py +2 -2
  102. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_integrity.py +4 -3
  103. sidegraph-0.16.0/tests/test_retrieval_seeds.py +436 -0
  104. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_write_boundary.py +1 -1
  105. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_annotations.py +2 -1
  106. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_decision_listing.py +22 -6
  107. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_mcp_smoke.py +10 -3
  108. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_session_attribution.py +1 -1
  109. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_skill_frontmatter.py +1 -0
  110. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stats_model.py +159 -1
  111. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stats_render.py +41 -0
  112. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stop_rearm.py +15 -2
  113. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_canonical_stat.py +34 -1
  114. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_compact.py +84 -4
  115. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_compact_review.py +16 -0
  116. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_mutation_guard.py +50 -5
  117. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_worktree_seeds.py +17 -25
  118. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/wheel_smoke.py +1 -1
  119. {sidegraph-0.14.0 → sidegraph-0.16.0}/uv.lock +5 -5
  120. sidegraph-0.14.0/tests/test_cli_compact.py +0 -135
  121. sidegraph-0.14.0/tests/test_retrieval_seeds.py +0 -49
  122. {sidegraph-0.14.0 → sidegraph-0.16.0}/.agents/plugins/marketplace.json +0 -0
  123. {sidegraph-0.14.0 → sidegraph-0.16.0}/.claude-plugin/marketplace.json +0 -0
  124. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/CODEOWNERS +0 -0
  125. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  126. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  127. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  128. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  129. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/secret_scanning.yml +0 -0
  130. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/workflows/publish.yml +0 -0
  131. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/workflows/scorecard.yml +0 -0
  132. {sidegraph-0.14.0 → sidegraph-0.16.0}/.github/workflows/session-link-gate.yml +0 -0
  133. {sidegraph-0.14.0 → sidegraph-0.16.0}/.gitignore +0 -0
  134. {sidegraph-0.14.0 → sidegraph-0.16.0}/.gitleaks.toml +0 -0
  135. {sidegraph-0.14.0 → sidegraph-0.16.0}/.opencode/INSTALL.md +0 -0
  136. {sidegraph-0.14.0 → sidegraph-0.16.0}/.pre-commit-config.yaml +0 -0
  137. {sidegraph-0.14.0 → sidegraph-0.16.0}/.python-version +0 -0
  138. {sidegraph-0.14.0 → sidegraph-0.16.0}/AGENTS.md +0 -0
  139. {sidegraph-0.14.0 → sidegraph-0.16.0}/CODE_OF_CONDUCT.md +0 -0
  140. {sidegraph-0.14.0 → sidegraph-0.16.0}/CONTRIBUTING.md +0 -0
  141. {sidegraph-0.14.0 → sidegraph-0.16.0}/LICENSE +0 -0
  142. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/concepts/anchoring.md +0 -0
  143. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/concepts/decision-memory.md +0 -0
  144. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/getting-started/claude-code-setup.md +0 -0
  145. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/getting-started/codex-setup.md +0 -0
  146. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/getting-started/quickstart.md +0 -0
  147. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/capturing-decisions.md +0 -0
  148. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/migrating-to-0.14.md +0 -0
  149. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/naming-your-domains.md +0 -0
  150. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/semantic-docs.md +0 -0
  151. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/surviving-refactors.md +0 -0
  152. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/team-workflow.md +0 -0
  153. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/guides/verifying-your-setup.md +0 -0
  154. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/integrations/claude-code.md +0 -0
  155. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/integrations/codex.md +0 -0
  156. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/integrations/graphify.md +0 -0
  157. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/integrations/muse.md +0 -0
  158. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/integrations/opencode.md +0 -0
  159. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/llms.txt +0 -0
  160. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/pilot-kit/README.md +0 -0
  161. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/pilot-kit/corpus_fit.py +0 -0
  162. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/pilot-kit/judge-prompt.md +0 -0
  163. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/pilot-kit/questions-prompt.md +0 -0
  164. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/pilot-kit/rubric-template.md +0 -0
  165. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/git-bindings.md +0 -0
  166. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/reference/releasing.md +0 -0
  167. {sidegraph-0.14.0 → sidegraph-0.16.0}/docs/whitepaper/index.md +0 -0
  168. {sidegraph-0.14.0 → sidegraph-0.16.0}/index.js +0 -0
  169. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/.mcp.json +0 -0
  170. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/codex/hooks.json +0 -0
  171. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/codex/mcp.json +0 -0
  172. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  173. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  174. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  175. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  176. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  177. {sidegraph-0.14.0/plugin/sidegraph/skills/import-adrs → sidegraph-0.16.0/plugin/sidegraph/skills/health-check}/agents/openai.yaml +0 -0
  178. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  179. {sidegraph-0.14.0/plugin/sidegraph/skills/manage-domains → sidegraph-0.16.0/plugin/sidegraph/skills/import-adrs}/agents/openai.yaml +0 -0
  180. {sidegraph-0.14.0/plugin/sidegraph/skills/name-domains → sidegraph-0.16.0/plugin/sidegraph/skills/manage-domains}/agents/openai.yaml +0 -0
  181. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  182. {sidegraph-0.14.0/plugin/sidegraph/skills/setup → sidegraph-0.16.0/plugin/sidegraph/skills/name-domains}/agents/openai.yaml +0 -0
  183. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  184. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  185. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  186. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  187. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  188. {sidegraph-0.14.0/plugin/sidegraph/skills/stats → sidegraph-0.16.0/plugin/sidegraph/skills/setup}/agents/openai.yaml +0 -0
  189. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  190. {sidegraph-0.14.0 → sidegraph-0.16.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  191. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/anchoring.py +0 -0
  192. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bash_paths.py +0 -0
  193. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  194. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/apply.py +0 -0
  195. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  196. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/cli.py +0 -0
  197. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/integrations.py +0 -0
  198. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/review.py +0 -0
  199. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/bootstrap/scan.py +0 -0
  200. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/capture.py +0 -0
  201. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/config.py +0 -0
  202. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/domain_snapshot.py +0 -0
  203. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/domains.py +0 -0
  204. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/engine/__init__.py +0 -0
  205. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/engine/rationale.py +0 -0
  206. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/engine/reader.py +0 -0
  207. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/freshness.py +0 -0
  208. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/gitenv.py +0 -0
  209. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/githooks.py +0 -0
  210. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/host/__init__.py +0 -0
  211. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/host/claude_settings.py +0 -0
  212. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/host/mcp_entry.py +0 -0
  213. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/host/session_identity.py +0 -0
  214. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/importer.py +0 -0
  215. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/input_limits.py +0 -0
  216. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/okf.py +0 -0
  217. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/redaction_scan.py +0 -0
  218. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/redaction_tokens.py +0 -0
  219. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/stats/__init__.py +0 -0
  220. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/text_paths.py +0 -0
  221. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/tool_rate_limit.py +0 -0
  222. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/viz/__init__.py +0 -0
  223. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  224. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/viz/model.py +0 -0
  225. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/viz/render.py +0 -0
  226. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/viz/template.html +0 -0
  227. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/worktree_seeds.py +0 -0
  228. {sidegraph-0.14.0 → sidegraph-0.16.0}/src/sidegraph/write_boundary.py +0 -0
  229. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/__init__.py +0 -0
  230. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/conftest.py +0 -0
  231. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  232. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bitfinex_slice.json +0 -0
  233. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  234. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  235. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  236. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  237. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  238. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/graph.json +0 -0
  239. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  240. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  241. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  242. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  243. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  244. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  245. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  246. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  247. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  248. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  249. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  250. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  251. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  252. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  253. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  254. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  255. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  256. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  257. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  258. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  259. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  260. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  261. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  262. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  263. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/design.md +0 -0
  264. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  265. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  266. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  267. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  268. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  269. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  270. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  271. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  272. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  273. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  274. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  275. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  276. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  277. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  278. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  279. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/member_names_python_graph.json +0 -0
  280. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/member_names_swift_graph.json +0 -0
  281. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/fixtures/mini_graph.json +0 -0
  282. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/graph_fixtures.py +0 -0
  283. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/opencode_plugin_runner.mjs +0 -0
  284. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/snapshot_support.py +0 -0
  285. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_agent_brief_manifests.py +0 -0
  286. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_anchor_descriptor.py +0 -0
  287. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_anchor_paths.py +0 -0
  288. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_anchoring.py +0 -0
  289. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  290. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_anchoring_membership.py +0 -0
  291. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bash_paths.py +0 -0
  292. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_batch_panel_fixes.py +0 -0
  293. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_apply.py +0 -0
  294. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_catalog.py +0 -0
  295. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_cli.py +0 -0
  296. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
  297. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_integrations.py +0 -0
  298. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_model.py +0 -0
  299. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_planner.py +0 -0
  300. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_review.py +0 -0
  301. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_scan.py +0 -0
  302. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_scan_regular.py +0 -0
  303. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_bootstrap_unanchored.py +0 -0
  304. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_capture_auto_accept.py +0 -0
  305. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_capture_facts.py +0 -0
  306. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_capture_initiative.py +0 -0
  307. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_capture_integration.py +0 -0
  308. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_capture_neighbors.py +0 -0
  309. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_capture_propose.py +0 -0
  310. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_capture_redact.py +0 -0
  311. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_doctor.py +0 -0
  312. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_domains.py +0 -0
  313. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_domains_snapshot.py +0 -0
  314. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_graph_paths.py +0 -0
  315. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_import.py +0 -0
  316. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_init.py +0 -0
  317. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_init_hooks.py +0 -0
  318. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_okf.py +0 -0
  319. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_ratify.py +0 -0
  320. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_ratify_facts.py +0 -0
  321. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_stats.py +0 -0
  322. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_sync.py +0 -0
  323. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_sync_check.py +0 -0
  324. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_unreadable_paths.py +0 -0
  325. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_cli_viz.py +0 -0
  326. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_command_windows.py +0 -0
  327. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_community_baseline.py +0 -0
  328. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_config.py +0 -0
  329. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_config_ancestor_lookup.py +0 -0
  330. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_config_borrowed_graph.py +0 -0
  331. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_corpus_expected_renders.py +0 -0
  332. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_corpus_self_corpus.py +0 -0
  333. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  334. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_digest_integrity.py +0 -0
  335. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doc_corpus_integration.py +0 -0
  336. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doc_import.py +0 -0
  337. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor.py +0 -0
  338. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_auto_share.py +0 -0
  339. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_code_drift.py +0 -0
  340. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_dangling_supports.py +0 -0
  341. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_duplicate_entity.py +0 -0
  342. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  343. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_graph_stale.py +0 -0
  344. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_integrity.py +0 -0
  345. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_never_surfaced.py +0 -0
  346. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_scan.py +0 -0
  347. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_stale_instructions.py +0 -0
  348. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_unhashable_payload.py +0 -0
  349. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_doctor_unratified_accept.py +0 -0
  350. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_domain_seed_names.py +0 -0
  351. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_domain_snapshot_format.py +0 -0
  352. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_domain_snapshot_notices.py +0 -0
  353. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_domains.py +0 -0
  354. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_engine_build.py +0 -0
  355. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_entity_duplicate_resolution.py +0 -0
  356. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_entity_get_or_create_race.py +0 -0
  357. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_entry_point_arguments.py +0 -0
  358. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_env_isolation.py +0 -0
  359. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_fact_reachability_gate.py +0 -0
  360. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_git_bindings_blame.py +0 -0
  361. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_git_bindings_hook.py +0 -0
  362. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_git_bindings_provenance.py +0 -0
  363. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_git_config_isolation.py +0 -0
  364. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_git_env.py +0 -0
  365. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_git_output_utf8.py +0 -0
  366. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_githooks.py +0 -0
  367. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_graph_freshness.py +0 -0
  368. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_graphify_pin.py +0 -0
  369. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_hook_payload_encoding.py +0 -0
  370. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_hook_spawn_guard.py +0 -0
  371. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_agent_brief.py +0 -0
  372. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_agent_state.py +0 -0
  373. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_borrowed_graph.py +0 -0
  374. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_claude_settings.py +0 -0
  375. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_integrity.py +0 -0
  376. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_pretool.py +0 -0
  377. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_session_key.py +0 -0
  378. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_session_start.py +0 -0
  379. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_session_start_concurrent.py +0 -0
  380. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_subagent_start.py +0 -0
  381. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_subdirectory_launch.py +0 -0
  382. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_touch_events.py +0 -0
  383. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_host_wiring_checks.py +0 -0
  384. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_hot_path_imports.py +0 -0
  385. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_import_dry_run_preview.py +0 -0
  386. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_importer.py +0 -0
  387. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_index_journal_mode.py +0 -0
  388. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_installed_wheel_smoke.py +0 -0
  389. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_integrity_engine_version.py +0 -0
  390. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_integrity_refresh_hook.py +0 -0
  391. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_integrity_replay.py +0 -0
  392. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_integrity_stranded.py +0 -0
  393. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_lazy_root.py +0 -0
  394. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_mcp_entry_ratify_policy.py +0 -0
  395. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_mcp_entry_repo_root.py +0 -0
  396. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_member_anchor_wiring.py +0 -0
  397. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_mind_model_additive_fields.py +0 -0
  398. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_muse_plugin.py +0 -0
  399. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_nearest_anchored.py +0 -0
  400. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_okf.py +0 -0
  401. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_opencode_plugin.py +0 -0
  402. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_openspec_profile.py +0 -0
  403. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  404. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  405. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_portable_json.py +0 -0
  406. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_proposal_lifecycle.py +0 -0
  407. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_public_hook_launch.py +0 -0
  408. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  409. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_ratify_policy.py +0 -0
  410. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_rationale_compatibility.py +0 -0
  411. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_community_labels.py +0 -0
  412. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_doc_nodes.py +0 -0
  413. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_engine_version.py +0 -0
  414. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_file_labels.py +0 -0
  415. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_graph.py +0 -0
  416. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_integration.py +0 -0
  417. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_label_conventions.py +0 -0
  418. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_member_name_lookup.py +0 -0
  419. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_member_names.py +0 -0
  420. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_nodes_in_file.py +0 -0
  421. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_perf.py +0 -0
  422. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_rationale.py +0 -0
  423. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_read.py +0 -0
  424. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_resolve.py +0 -0
  425. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_stub_collapse.py +0 -0
  426. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_subdir_mismatch.py +0 -0
  427. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_type_split.py +0 -0
  428. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_reader_version.py +0 -0
  429. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_rebuild_instruction.py +0 -0
  430. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_redaction_scan.py +0 -0
  431. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_redaction_seeded.py +0 -0
  432. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_redaction_tokens.py +0 -0
  433. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_repo_relative_paths_portable.py +0 -0
  434. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_repoint_integration.py +0 -0
  435. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_budget_counters.py +0 -0
  436. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_context.py +0 -0
  437. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_drift_marker.py +0 -0
  438. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_drilldown.py +0 -0
  439. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_facts.py +0 -0
  440. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_guessed.py +0 -0
  441. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_ids.py +0 -0
  442. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_integration.py +0 -0
  443. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_membership_generations.py +0 -0
  444. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_membership_index.py +0 -0
  445. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_rank.py +0 -0
  446. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_shown_ids.py +0 -0
  447. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  448. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_thin_tools.py +0 -0
  449. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_toc.py +0 -0
  450. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_toptier.py +0 -0
  451. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_retrieval_unratified.py +0 -0
  452. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sandbox_hygiene.py +0 -0
  453. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_schema_descriptor.py +0 -0
  454. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_schema_domain.py +0 -0
  455. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_schema_fact.py +0 -0
  456. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_secret_scan_gate.py +0 -0
  457. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_binary_limits.py +0 -0
  458. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_capture_diagnostics.py +0 -0
  459. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_capture_limits.py +0 -0
  460. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_cli_diagnostics.py +0 -0
  461. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_doc_limits.py +0 -0
  462. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_input_limits.py +0 -0
  463. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
  464. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_numeric_enums.py +0 -0
  465. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_python_shapes.py +0 -0
  466. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_redaction_cursor.py +0 -0
  467. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_redaction_scaling.py +0 -0
  468. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_security_validation_errors.py +0 -0
  469. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_seed_ladder.py +0 -0
  470. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_seed_paths_portable.py +0 -0
  471. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_add_anchors.py +0 -0
  472. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_anchoring.py +0 -0
  473. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_argument_names.py +0 -0
  474. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_borrowed_graph.py +0 -0
  475. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_capture.py +0 -0
  476. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_commit_hint.py +0 -0
  477. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_coverage_events.py +0 -0
  478. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_domains.py +0 -0
  479. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_drilldown.py +0 -0
  480. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_facts.py +0 -0
  481. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_find_entity.py +0 -0
  482. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_get_store.py +0 -0
  483. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_get_task_context.py +0 -0
  484. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_graph_freshness.py +0 -0
  485. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_graph_path.py +0 -0
  486. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_import.py +0 -0
  487. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_invocation_policy.py +0 -0
  488. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_nearest_anchored.py +0 -0
  489. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  490. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_ratify_facts.py +0 -0
  491. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_record_types.py +0 -0
  492. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_redaction.py +0 -0
  493. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_refresh.py +0 -0
  494. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_render_events.py +0 -0
  495. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_result_contract.py +0 -0
  496. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_supersede.py +0 -0
  497. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_sync_anchors.py +0 -0
  498. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_telemetry.py +0 -0
  499. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_thin_tools.py +0 -0
  500. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_tolerant_seeds.py +0 -0
  501. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_server_verify.py +0 -0
  502. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stats_graph.py +0 -0
  503. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stats_health.py +0 -0
  504. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stats_skill.py +0 -0
  505. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stats_snapshot.py +0 -0
  506. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_stop_hot_path.py +0 -0
  507. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store.py +0 -0
  508. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_agent_state.py +0 -0
  509. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  510. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_bad_file.py +0 -0
  511. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_binding_index.py +0 -0
  512. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_concurrent_open.py +0 -0
  513. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_coverage_telemetry.py +0 -0
  514. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_cross_process_mutations.py +0 -0
  515. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_derived_community.py +0 -0
  516. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_domain_members.py +0 -0
  517. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_domains.py +0 -0
  518. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_entities.py +0 -0
  519. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_fact_cascade.py +0 -0
  520. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_facts.py +0 -0
  521. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_file_anchor_names.py +0 -0
  522. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_git_root_symlink.py +0 -0
  523. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_meta.py +0 -0
  524. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_migration.py +0 -0
  525. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_mutation_immediate.py +0 -0
  526. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_non_file_entries.py +0 -0
  527. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  528. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_persistence.py +0 -0
  529. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_ratification.py +0 -0
  530. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_rebuild_atomicity.py +0 -0
  531. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_record_identity.py +0 -0
  532. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_record_types.py +0 -0
  533. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_render_events.py +0 -0
  534. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_requirement.py +0 -0
  535. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_retrieval.py +0 -0
  536. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_slug_conflicts.py +0 -0
  537. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_snapshot_wiring.py +0 -0
  538. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_stamping_marker.py +0 -0
  539. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_symlinks.py +0 -0
  540. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_telemetry.py +0 -0
  541. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_threading.py +0 -0
  542. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_tmp_sweep_age.py +0 -0
  543. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_store_update_meta_if.py +0 -0
  544. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_subagent_start_manifests.py +0 -0
  545. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_subprocess_text_encoding.py +0 -0
  546. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_canonical_writes.py +0 -0
  547. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_clean.py +0 -0
  548. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_domains.py +0 -0
  549. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_drift_cache.py +0 -0
  550. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_fresh_clone.py +0 -0
  551. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_integration.py +0 -0
  552. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_membership.py +0 -0
  553. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_moved_adoption.py +0 -0
  554. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_rebind.py +0 -0
  555. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_repoint.py +0 -0
  556. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_report_has_findings.py +0 -0
  557. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_run.py +0 -0
  558. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_snapshot_membership.py +0 -0
  559. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_toc_cache.py +0 -0
  560. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_volatile_heal.py +0 -0
  561. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_sync_wiring.py +0 -0
  562. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_telemetry_retention.py +0 -0
  563. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_text_paths.py +0 -0
  564. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_verify_domain_snapshot.py +0 -0
  565. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_verify_git_framing.py +0 -0
  566. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_verify_git_revisions.py +0 -0
  567. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_verify_git_stdin.py +0 -0
  568. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_verify_snapshot.py +0 -0
  569. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_verify_transitions.py +0 -0
  570. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_viz_asset_packaged.py +0 -0
  571. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_viz_model.py +0 -0
  572. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_viz_render_html.py +0 -0
  573. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/test_viz_render_json.py +0 -0
  574. {sidegraph-0.14.0 → sidegraph-0.16.0}/tests/wheel_server_trace.py +0 -0
  575. {sidegraph-0.14.0 → sidegraph-0.16.0}/tools/check_no_session_links.py +0 -0
@@ -130,7 +130,7 @@ jobs:
130
130
  interpreter="$environment/bin/python"
131
131
  constraints=()
132
132
  if [ "$SDK_PAIR" = minimum ]; then
133
- constraints=(fastmcp==3.4.2 mcp==1.24.0)
133
+ constraints=(fastmcp==3.4.2 mcp==1.30.0)
134
134
  fi
135
135
  uv pip install --python "$interpreter" "$wheel" pytest "${constraints[@]}"
136
136
  mkdir -p "$RUNNER_TEMP/sdk-check"
@@ -188,13 +188,17 @@ jobs:
188
188
  uv run pytest -q --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
189
189
  tests/test_store_mutation_guard.py `
190
190
  tests/test_store_mutation_immediate.py tests/test_store_cross_process_mutations.py `
191
+ tests/test_hook_contention.py tests/test_retrieval_seeds.py `
191
192
  tests/test_portable_json.py tests/test_bootstrap_descriptor_cleanup.py `
192
193
  tests/test_server_result_contract.py tests/test_server_invocation_policy.py `
193
194
  tests/test_verify_git_stdin.py tests/test_seed_paths_portable.py `
194
195
  tests/test_repo_relative_paths_portable.py `
195
196
  tests/test_command_windows.py `
196
- tests/test_hook_payload_encoding.py `
197
+ tests/test_hook_payload_encoding.py tests/test_hook_failure_diagnostics.py `
198
+ tests/test_hot_index_facts.py `
199
+ tests/test_delivery_evidence.py tests/test_delivery_stats.py tests/test_delivery_surfaces.py `
197
200
  tests/test_git_output_utf8.py `
201
+ tests/test_health_check_skill.py `
198
202
  $privateTests `
199
203
  tests/test_installed_wheel_smoke.py
200
204
  if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
@@ -7,6 +7,81 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.16.0] — 2026-10-20
11
+
12
+ See [Using Sidegraph 0.16](docs/guides/using-0.16.md) for update, compatibility, and
13
+ limitation notes.
14
+
15
+ ### Security
16
+
17
+ - Raise the minimum MCP Python SDK to 1.30.0, which includes the upstream fix for
18
+ [GHSA-84m7-p3x7-pcfv](https://github.com/advisories/GHSA-84m7-p3x7-pcfv). The supported
19
+ SDK major remains 1.
20
+
21
+ ### Added
22
+
23
+ - Add `/sidegraph:health-check`, a read-only installation report with six evidence sections
24
+ and prioritized manual recommendations. It uses an already identified Python interpreter
25
+ and skips doctor and stats paths when an existing SQLite index is unsafe to open.
26
+
27
+ ### Changed
28
+
29
+ - Hook-owned SQLite handles now refuse lock contention immediately across session, stop,
30
+ tool-use and subagent entry paths. SessionStart's dedupe remains best-effort under overlap;
31
+ its graph, filesystem and Git work is outside this lock-wait bound.
32
+ - Retrieval and file listings reuse a lazy, per-call descriptor lookup, avoiding repeated
33
+ full entity scans while preserving seed selection and rendered output.
34
+ - `sidegraph-compact` reports distinct hot files retained when their content is not fully
35
+ represented in the immutable archive, with warnings that distinguish extra fields from
36
+ shared-value or structure differences.
37
+
38
+ ### Fixed
39
+
40
+ - `list_domains` now bounds its complete MCP text response and reports matched, returned and
41
+ omitted counts with whole rows. Its provisional return shape changes from a bare list to a
42
+ JSON-text envelope; exact domain-id and query filters can retrieve rows left out by the cap.
43
+ - `sidegraph-stats` withholds anchor health counts while a fresh index's binding statuses await
44
+ `sidegraph-sync`, while keeping the record inventory and reach figures available.
45
+
46
+ ## [0.15.0] — 2026-10-18
47
+
48
+ ### Added
49
+
50
+ - `sidegraph-export-adr` previews and explicitly writes profile-driven ADR sets with stable
51
+ identity, status/history links, full supporting evidence and preserved human notes.
52
+ Import and bootstrap withhold generated projections instead of duplicating memory.
53
+
54
+ - Explicit `record_drift_check` inspections preserve decision capture history and clear
55
+ only the checked advisory. Changed inspected files or anchor scope re-arm review;
56
+ immutable auxiliary evidence is linted without changing the shared store digest.
57
+
58
+ - Local delivery evidence distinguishes prepared answers, rendered record placements and
59
+ anchor relations, with record status at emission and explicit unknown/empty/error outcomes.
60
+ Stats keeps MCP and automatic hooks separate. Optional bounded index-only writes cannot
61
+ block delivery and retain no task/response text or hashes.
62
+ - Automatic point-of-read context and appended task briefs can include eligible facts with
63
+ their complete statement, source and id, using existing record caps and trust rules.
64
+ Fact lines over 512 characters are withheld whole; full facts remain available through
65
+ `list_facts`. SubagentStart's awareness counts still cover decisions only.
66
+
67
+ ### Fixed
68
+
69
+ - Automatic file-read context and appended agent briefs replace later identical record bodies
70
+ within one answer with explicit references. First copies, per-file applicability, trust,
71
+ selection limits and journal placements stay intact; no state crosses calls or agents.
72
+ - Explicit file lookups return eligible decisions and facts by their exact durable file
73
+ binding when an available graph lacks the file, marked as file applicability with
74
+ unverified symbol anchors. Remaining-record pointers name both decision and fact listings.
75
+ - Failed lifecycle hooks emit at most one content-free diagnostic line on stderr while
76
+ preserving their existing fail-open output. Missing indexes and deliberate format
77
+ refusals remain quiet; diagnostics do not depend on the index or create a log file.
78
+
79
+ ### Known limitations
80
+
81
+ - Selection still uses file/entity/domain context and can include off-task records.
82
+ Task-query ranking remains future work; this release makes no measured relevance or
83
+ 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).
84
+
10
85
  ## [0.14.0] — 2026-10-16
11
86
 
12
87
  ### 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.16.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.16.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
@@ -23,7 +23,7 @@ Classifier: Topic :: Software Development :: Libraries
23
23
  Requires-Python: >=3.13
24
24
  Requires-Dist: anyio>=4
25
25
  Requires-Dist: fastmcp<4,>=3.4.2
26
- Requires-Dist: mcp<2,>=1.24
26
+ Requires-Dist: mcp<2,>=1.30
27
27
  Requires-Dist: pydantic>=2.9
28
28
  Requires-Dist: python-ulid>=3.0
29
29
  Description-Content-Type: text/markdown
@@ -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,
@@ -26,6 +26,7 @@ If the repository already has ADRs or specs, use the
26
26
  ## Operate and maintain it
27
27
 
28
28
  - [Migrate an existing store to Sidegraph 0.14](guides/migrating-to-0.14.md).
29
+ - [Check a Sidegraph installation](guides/health-check.md).
29
30
  - [Survive refactors and heal anchors](guides/surviving-refactors.md).
30
31
  - [Read what Sidegraph tells you when it needs attention](guides/troubleshooting.md).
31
32
  - [Run CI and scheduled maintenance](guides/ci-cd-maintenance.md).
@@ -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. |
@@ -131,9 +131,11 @@ this matters in practice beyond an ordinary rename: freeing a community that a d
131
131
  still claims (give the successor no matching `path_prefixes`/`seed_anchors` instead of
132
132
  carrying the old rule forward).
133
133
 
134
- **Listing.** `list_domains(status=None)` returns every domain in the store — optionally
135
- filtered to one status — with membership/lineage counts (`member_count`, `seed_anchor_count`,
136
- `parent_slug`/`child_slugs`); it's the general "show me all domains" answer `list_proposed`
134
+ **Listing.** `list_domains(status=None)` searches every status and returns whole domain rows
135
+ inside a bounded JSON-text envelope, with counts and a hint when filters or output limits omit
136
+ rows. Narrow by exact domain ids or query terms to reach a row from an omitted listing. Rows
137
+ include membership/lineage fields (`member_count`, `seed_anchor_count`, `parent_slug` and
138
+ `child_slugs`); this is the general "show me all domains" answer `list_proposed`
137
139
  (proposed-only) and `list_domain_candidates` (unclaimed-only) don't cover.
138
140
 
139
141
  ## How domains relate to engine communities
@@ -103,6 +103,12 @@ an empty list with an explanatory `"note"` key — everything store-derived (`do
103
103
  takes the seeds as `files` and `entities`): given what the agent is about to touch, return a compact slice of structure *and* memory, memory ranked so the things
104
104
  most likely to save it from a repeat mistake come first.
105
105
 
106
+ Within one retrieval or file-list call, descriptor resolution shares a lazy, operation-scoped
107
+ lookup of parsed entities. It preserves the existing exact-path, pathless adoption, ambiguity,
108
+ and winner rules while avoiding a full entity-table parse for each graph node. The lookup is
109
+ discarded after the call; a later call sees entity changes. This is a performance-only change:
110
+ seed selection, record ranking, budgets, and rendered output are unchanged.
111
+
106
112
  ### Seeds
107
113
 
108
114
  A `Seed` is either:
@@ -353,6 +359,17 @@ reported separately, by comparing the graph's build commit with `HEAD` (see
353
359
  [the Graphify integration](../integrations/graphify.md#keeping-the-graph-fresh-git-hooks)), and
354
360
  only a rebuild fixes it.
355
361
 
362
+ ### File applicability outside the graph
363
+
364
+ When an available graph does not contain an explicitly requested file, the memory read
365
+ also checks exact durable descriptor paths. Eligible decisions and facts can then arrive as
366
+ `[file-bound]`: declared applicability to that file, with symbol anchors the graph cannot
367
+ verify. This reads no neighboring path as an exact match and changes no anchor or binding.
368
+ Ordinary verified seed routes take precedence over the marker. Named-entity requests,
369
+ ambiguous/directory guesses and graph-present orphan handling keep their existing rules;
370
+ with no graph reader at all, this fallback is unavailable. The file still appears in the
371
+ not-in-graph diagnostic, and proposal policy, history, mistakes-first and budgets still apply.
372
+
356
373
  ### Rendering
357
374
 
358
375
  `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
  | --- | --- | --- | --- | --- | --- |
@@ -24,18 +24,18 @@ installs a non-editable wheel outside the checkout, checks its package bytes aga
24
24
  artifact, runs a CLI, and exchanges real MCP stdio messages in a Unicode/spaced directory.
25
25
  The exact selection is in [the CI workflow](../../.github/workflows/ci.yml).
26
26
 
27
- Separately, each release candidate runs real Claude Code and Codex sessions with the
27
+ For the 0.14.0 release-candidate campaign, real Claude Code and Codex sessions ran with the
28
28
  installed plugin, in fresh host profiles, on Windows Server 2022 x64 and macOS 15 arm64,
29
- each with Python 3.13 and 3.14. Each run is the full plugin session for both hosts: the
29
+ each with Python 3.13 and 3.14. Each run was the full plugin session for both hosts: the
30
30
  plugin's MCP server, `SessionStart` context, records before a Read, a bundled skill, a
31
31
  subagent brief, the `Stop` capture prompt, capture and ratification, and recall in a fresh
32
- session. The project folder and host profile paths contain a non-ASCII character.
32
+ session. The project folder and host profile paths contained a non-ASCII character.
33
33
 
34
34
  **0.14.0 publication gate:** Claude Code 2.1.296 and Codex CLI 0.162.1 on all four cells
35
35
  above, including a Windows 3.14 cell with PowerShell 7 unavailable for preflight and both
36
36
  real host sessions. Windows 3.13 retains PowerShell 7; its launcher checks also cover 5.1.
37
- Stable publication requires the full gate to pass without a known-issue exception. The
38
- README's blue badges summarize release acceptance, rather than live workflow status or
37
+ Stable publication of 0.14.0 required the full gate to pass without a known-issue exception.
38
+ The README's blue badges summarize release acceptance, rather than live workflow status or
39
39
  support for every published version. Muse and OpenCode have the narrower coverage in
40
40
  their installation guides and are outside this native matrix.
41
41
 
@@ -45,14 +45,15 @@ with Git for Windows installed; they do not establish support for Windows hosts
45
45
  remains outside these checks.
46
46
  See [Windows](#windows) before installing a host plugin.
47
47
 
48
- Package dependencies support `fastmcp>=3.4.2,<4` and `mcp>=1.24,<2`. Major SDK upgrades
48
+ Package dependencies support `fastmcp>=3.4.2,<4` and `mcp>=1.30,<2`. Major SDK upgrades
49
49
  require a separate compatibility review; an unlocked package install may resolve newer
50
50
  versions within those bounds than the development lockfile.
51
51
 
52
52
  ### Windows
53
53
 
54
- The native checks above cover the tested release, not every published version. On
55
- Windows they cover the full plugin session; WSL is not a separate CI target.
54
+ Current native CI covers selected core/MCP checks, wheel installation, CLI execution, and
55
+ MCP stdio paths; WSL is not a separate CI target. Full Windows plugin sessions were exercised
56
+ in the historical 0.14.0 release-candidate campaign described above.
56
57
 
57
58
  **Version requirement:** releases before 0.12.0 can stall a native Windows write: a Git
58
59
  child inherits the MCP stdin pipe and holds the write until the request times out (see
@@ -274,7 +275,7 @@ setup, scripted/CI use, and the two deliberately human-run jobs (`sidegraph-impo
274
275
  | `sidegraph-stop` | `Stop` hook — nudges the agent to distill decisions. |
275
276
  | `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
277
  | `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. |
278
+ | `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
279
  | `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
280
  | `sidegraph-ratify` | CLI — review/accept/drop proposed decisions, facts, and domains. |
280
281
  | `sidegraph-sync` | CLI — re-anchor the store after a Graphify rebuild. |
@@ -285,6 +286,7 @@ setup, scripted/CI use, and the two deliberately human-run jobs (`sidegraph-impo
285
286
  | `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
287
  | `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
288
  | `sidegraph-viz` | CLI — render an interactive HTML/JSON view of decisions, facts, entities, anchor status, supersession, and evidence links. |
289
+ | `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
290
  | `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
291
  | `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
292
  | `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.
@@ -0,0 +1,66 @@
1
+ # Check a Sidegraph installation
2
+
3
+ Use `/sidegraph:health-check` to collect one read-only report for the current repository.
4
+ It covers plugin wiring, runtime versions, Graphify, store integrity, anchor advisories, and
5
+ inventory and usage. `UNKNOWN` means the evidence could not be established; it remains a
6
+ warning and never becomes a clean result.
7
+
8
+ ## Runtime requirement
9
+
10
+ The skill runs its local `scripts/collect.py` helper with `-B` under an already identified
11
+ Python interpreter. In a development checkout, the supported paths are:
12
+
13
+ ```bash
14
+ "<project>/.venv/bin/python" -B "<skill-directory>/scripts/collect.py" --project "<launch-directory>" --host claude
15
+ ```
16
+
17
+ For Codex, pass `--host codex`; use `unknown` when the attached host is not known. On Windows,
18
+ use the existing `<project>/.venv/Scripts/python.exe`. Installed use requires a
19
+ known interpreter from attached host launch metadata or metadata for an identified Sidegraph
20
+ environment. The collector does not guess a Python on `PATH`, run an unknown Sidegraph
21
+ executable, or use `uv`/`uvx` as its launcher. If no suitable interpreter is known, the skill
22
+ shows all six sections as limited, includes safe static evidence already available, lists
23
+ manual recommendations, and stops. The same fallback applies when the helper exits nonzero,
24
+ prints error JSON, or cannot import required inspection helpers; show only the error class and
25
+ do not echo exception text. Cached package files alone do not authorize provisioning.
26
+
27
+ The skill resolves the Git root to select the interpreter, then passes the original launch
28
+ directory as `--project` so Claude plugin-scope checks retain the launch context. The optional
29
+ `--store`, `--graph`, and `--plugin-root` arguments are for
30
+ paths already known to the host or user; the collector does not search unrelated profiles.
31
+
32
+ ## Evidence and limits
33
+
34
+ The report separates the collector package, plugin manifest, optional PATH installation,
35
+ Graphify-recorded engine version, and any already observed active MCP evidence. Static
36
+ registration is not proof that a running server answered. The workflow never starts a server
37
+ or calls retrieval tools to test connectivity.
38
+
39
+ The collector fingerprints the canonical store, index and sidecars, settings, plugin
40
+ manifests, graph inputs, and actual Git index around its process. This is a stable-source
41
+ check, not an atomic snapshot; concurrent writes make preservation evidence unstable without
42
+ identifying which process changed it. Host hooks surrounding tool invocation are outside the
43
+ collector's preservation boundary.
44
+
45
+ If the index is absent, canonical-only doctor curation still runs, and index-dependent
46
+ findings and stats are marked skipped. If an existing index has WAL/SHM sidecars, an
47
+ unrecognized header, an unreadable header, or a nonempty rollback journal, all doctor
48
+ advisory and stats paths that could open it are skipped. A regular rollback-mode index allows
49
+ the existing doctor and stats checks to run. Cold or stale index qualifications are retained.
50
+
51
+ The six report sections distinguish contract violations from advisory findings and missing
52
+ coverage. Inventory counts come from canonical readers. Pending age is unknown for malformed
53
+ record identifiers. Usage reports summarize recorded activity only; delivery counts do not
54
+ show usefulness, prevented errors, or saved time. Records on unmerged or remote-only branches
55
+ are not exhaustively checked.
56
+
57
+ ## Manual follow-up
58
+
59
+ Recommendations are prioritized and deduplicated, with a reason, explicit scope, argv, working
60
+ directory, and environment for a manual command or skill to run after the report. Render argv
61
+ with the attached shell's native quoting; paths are never embedded into shell snippets. The
62
+ health check never executes recommendations. Ordinary doctor and stats reads
63
+ outside this collector can create SQLite sidecars for a WAL database, so inspect such an
64
+ index separately after the writing session. Ending a session does not guarantee a persistent
65
+ journal-mode change. Do not recommend an upgrade from an unknown version or install the
66
+ optional PATH CLI solely because it is absent.
@@ -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.