sidegraph 0.9.0__tar.gz → 0.11.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 (455) hide show
  1. {sidegraph-0.9.0 → sidegraph-0.11.0}/.agents/plugins/marketplace.json +1 -1
  2. {sidegraph-0.9.0 → sidegraph-0.11.0}/.claude-plugin/marketplace.json +1 -1
  3. {sidegraph-0.9.0 → sidegraph-0.11.0}/AGENTS.md +3 -2
  4. {sidegraph-0.9.0 → sidegraph-0.11.0}/CHANGELOG.md +276 -0
  5. {sidegraph-0.9.0 → sidegraph-0.11.0}/CLAUDE.md +4 -3
  6. {sidegraph-0.9.0 → sidegraph-0.11.0}/CONTRIBUTING.md +7 -1
  7. {sidegraph-0.9.0 → sidegraph-0.11.0}/PKG-INFO +22 -9
  8. {sidegraph-0.9.0 → sidegraph-0.11.0}/README.md +21 -8
  9. {sidegraph-0.9.0 → sidegraph-0.11.0}/SECURITY.md +15 -4
  10. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/mind-model.md +1 -1
  11. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/retrieval.md +50 -11
  12. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/bootstrap.md +41 -10
  13. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/claude-code-setup.md +17 -4
  14. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/codex-setup.md +7 -4
  15. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/installation.md +9 -2
  16. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/getting-started/quickstart.md +20 -3
  17. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/capturing-decisions.md +9 -7
  18. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/ci-cd-maintenance.md +4 -2
  19. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/retrieval-in-sessions.md +67 -16
  20. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/semantic-docs.md +2 -2
  21. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/team-workflow.md +11 -4
  22. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/troubleshooting.md +7 -3
  23. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/integrations/claude-code.md +36 -18
  24. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/integrations/codex.md +41 -15
  25. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/llms.txt +1 -1
  26. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/README.md +12 -4
  27. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/cli.md +104 -56
  28. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/configuration.md +2 -2
  29. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/git-bindings.md +12 -2
  30. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/hooks.md +59 -12
  31. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/mcp-tools.md +210 -27
  32. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/operations.md +12 -4
  33. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/releasing.md +1 -1
  34. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/stability.md +2 -2
  35. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/reference/store-format.md +25 -8
  36. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/whitepaper/index.md +69 -51
  37. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  38. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  39. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/check-plan/SKILL.md +7 -3
  40. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/explain-why/SKILL.md +8 -6
  41. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +6 -5
  42. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +10 -2
  43. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +6 -2
  44. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/setup/SKILL.md +21 -6
  45. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +3 -3
  46. {sidegraph-0.9.0 → sidegraph-0.11.0}/pyproject.toml +4 -1
  47. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/__init__.py +1 -1
  48. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/apply.py +61 -15
  49. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/catalog.py +17 -0
  50. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/cli.py +278 -42
  51. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/model.py +14 -0
  52. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/planner.py +2 -0
  53. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/cli.py +123 -66
  54. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/doc_import.py +230 -50
  55. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/doctor.py +75 -7
  56. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/hooks.py +42 -0
  57. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/subagent.py +6 -1
  58. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/hot_index.py +8 -0
  59. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/importer.py +52 -3
  60. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/retrieval.py +19 -6
  61. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/server.py +692 -59
  62. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/stats/model.py +2 -1
  63. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/store.py +122 -36
  64. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/store_layout.py +124 -0
  65. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/verify.py +275 -92
  66. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/conftest.py +42 -0
  67. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/githooks_support.py +7 -0
  68. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_apply.py +88 -4
  69. sidegraph-0.11.0/tests/test_bootstrap_unanchored.py +618 -0
  70. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_stats.py +47 -0
  71. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_unreadable_paths.py +2 -1
  72. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_digest_integrity.py +14 -5
  73. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doc_import.py +69 -0
  74. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_docs_claims.py +35 -9
  75. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor.py +4 -4
  76. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_auto_share.py +137 -0
  77. sidegraph-0.11.0/tests/test_doctor_unhashable_payload.py +165 -0
  78. sidegraph-0.11.0/tests/test_entry_point_arguments.py +256 -0
  79. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_flow_profile.py +21 -1
  80. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_bindings_hook.py +117 -0
  81. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_githooks.py +55 -0
  82. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_integrity.py +30 -6
  83. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hot_index.py +8 -1
  84. sidegraph-0.11.0/tests/test_import_dry_run_preview.py +619 -0
  85. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_importer.py +1 -0
  86. sidegraph-0.11.0/tests/test_index_journal_mode.py +268 -0
  87. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_openspec_profile.py +4 -0
  88. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_pilot_kit_corpus_fit.py +50 -12
  89. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_public_hook_launch.py +8 -0
  90. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_ratify_policy.py +59 -14
  91. sidegraph-0.11.0/tests/test_server_annotations.py +86 -0
  92. sidegraph-0.11.0/tests/test_server_argument_names.py +275 -0
  93. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_borrowed_graph.py +98 -0
  94. sidegraph-0.11.0/tests/test_server_decision_listing.py +776 -0
  95. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_mcp_smoke.py +10 -2
  96. sidegraph-0.11.0/tests/test_server_record_types.py +177 -0
  97. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_model.py +18 -0
  98. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_compact.py +256 -0
  99. sidegraph-0.11.0/tests/test_store_non_file_entries.py +514 -0
  100. sidegraph-0.11.0/tests/test_store_record_types.py +77 -0
  101. sidegraph-0.11.0/tests/test_verify_snapshot.py +1668 -0
  102. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_verify_transitions.py +120 -0
  103. {sidegraph-0.9.0 → sidegraph-0.11.0}/uv.lock +1 -1
  104. sidegraph-0.9.0/tests/test_verify_snapshot.py +0 -771
  105. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/CODEOWNERS +0 -0
  106. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  107. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  108. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  109. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  110. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/secret_scanning.yml +0 -0
  111. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/ci.yml +0 -0
  112. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/publish.yml +0 -0
  113. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/scorecard.yml +0 -0
  114. {sidegraph-0.9.0 → sidegraph-0.11.0}/.github/workflows/session-link-gate.yml +0 -0
  115. {sidegraph-0.9.0 → sidegraph-0.11.0}/.gitignore +0 -0
  116. {sidegraph-0.9.0 → sidegraph-0.11.0}/.gitleaks.toml +0 -0
  117. {sidegraph-0.9.0 → sidegraph-0.11.0}/.pre-commit-config.yaml +0 -0
  118. {sidegraph-0.9.0 → sidegraph-0.11.0}/.python-version +0 -0
  119. {sidegraph-0.9.0 → sidegraph-0.11.0}/CODE_OF_CONDUCT.md +0 -0
  120. {sidegraph-0.9.0 → sidegraph-0.11.0}/LICENSE +0 -0
  121. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/README.md +0 -0
  122. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/anchoring.md +0 -0
  123. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/data-model.md +0 -0
  124. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/concepts/decision-memory.md +0 -0
  125. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/naming-your-domains.md +0 -0
  126. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/surviving-refactors.md +0 -0
  127. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/guides/verifying-your-setup.md +0 -0
  128. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/integrations/graphify.md +0 -0
  129. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/corpus_fit.py +0 -0
  130. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/judge-prompt.md +0 -0
  131. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/questions-prompt.md +0 -0
  132. {sidegraph-0.9.0 → sidegraph-0.11.0}/docs/pilot-kit/rubric-template.md +0 -0
  133. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/.mcp.json +0 -0
  134. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/codex/hooks.json +0 -0
  135. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/codex/mcp.json +0 -0
  136. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  137. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  138. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  139. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  140. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  141. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  142. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  143. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  144. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  145. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  146. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
  147. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  148. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
  149. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  150. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  151. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  152. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  153. {sidegraph-0.9.0 → sidegraph-0.11.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  154. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/anchoring.py +0 -0
  155. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bash_paths.py +0 -0
  156. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  157. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/integrations.py +0 -0
  158. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/proof.py +0 -0
  159. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/review.py +0 -0
  160. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/bootstrap/scan.py +0 -0
  161. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/capture.py +0 -0
  162. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/config.py +0 -0
  163. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/domains.py +0 -0
  164. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/engine/__init__.py +0 -0
  165. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/engine/reader.py +0 -0
  166. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/freshness.py +0 -0
  167. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/gitenv.py +0 -0
  168. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/githooks.py +0 -0
  169. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/gitio.py +0 -0
  170. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/__init__.py +0 -0
  171. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/claude_settings.py +0 -0
  172. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/host/launch.py +0 -0
  173. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/integrity.py +0 -0
  174. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/nearest_anchored.py +0 -0
  175. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/okf.py +0 -0
  176. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/profiles.py +0 -0
  177. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/schema.py +0 -0
  178. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/seed_ladder.py +0 -0
  179. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/stats/__init__.py +0 -0
  180. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/stats/render.py +0 -0
  181. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/sync.py +0 -0
  182. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/text_paths.py +0 -0
  183. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/__init__.py +0 -0
  184. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  185. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/model.py +0 -0
  186. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/render.py +0 -0
  187. {sidegraph-0.9.0 → sidegraph-0.11.0}/src/sidegraph/viz/template.html +0 -0
  188. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/__init__.py +0 -0
  189. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  190. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bitfinex_slice.json +0 -0
  191. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  192. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  193. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  194. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  195. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  196. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/graph.json +0 -0
  197. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  198. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  199. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  200. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  201. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  202. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  203. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  204. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  205. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  206. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  207. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  208. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  209. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  210. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  211. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  212. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  213. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  214. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  215. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  216. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  217. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  218. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  219. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  220. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  221. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/design.md +0 -0
  222. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  223. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  224. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  225. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  226. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  227. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  228. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  229. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  230. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  231. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  232. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  233. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  234. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  235. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  236. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  237. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/member_names_python_graph.json +0 -0
  238. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/member_names_swift_graph.json +0 -0
  239. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/fixtures/mini_graph.json +0 -0
  240. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_agent_brief_manifests.py +0 -0
  241. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_anchoring.py +0 -0
  242. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  243. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bash_paths.py +0 -0
  244. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_catalog.py +0 -0
  245. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_cli.py +0 -0
  246. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_integrations.py +0 -0
  247. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_model.py +0 -0
  248. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_planner.py +0 -0
  249. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_proof.py +0 -0
  250. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_review.py +0 -0
  251. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_bootstrap_scan.py +0 -0
  252. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_auto_accept.py +0 -0
  253. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_facts.py +0 -0
  254. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_initiative.py +0 -0
  255. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_integration.py +0 -0
  256. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_neighbors.py +0 -0
  257. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_propose.py +0 -0
  258. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_capture_redact.py +0 -0
  259. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_compact.py +0 -0
  260. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_doctor.py +0 -0
  261. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_domains.py +0 -0
  262. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_graph_paths.py +0 -0
  263. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_import.py +0 -0
  264. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_init.py +0 -0
  265. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_init_hooks.py +0 -0
  266. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_okf.py +0 -0
  267. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_ratify.py +0 -0
  268. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_ratify_facts.py +0 -0
  269. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_sync.py +0 -0
  270. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_sync_check.py +0 -0
  271. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_cli_viz.py +0 -0
  272. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_codex_plugin.py +0 -0
  273. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_community_baseline.py +0 -0
  274. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_config.py +0 -0
  275. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_config_ancestor_lookup.py +0 -0
  276. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_config_borrowed_graph.py +0 -0
  277. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_corpus_expected_renders.py +0 -0
  278. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_corpus_self_corpus.py +0 -0
  279. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  280. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doc_corpus_integration.py +0 -0
  281. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_code_drift.py +0 -0
  282. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_dangling_supports.py +0 -0
  283. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_duplicate_entity.py +0 -0
  284. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  285. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_graph_stale.py +0 -0
  286. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_integrity.py +0 -0
  287. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_never_surfaced.py +0 -0
  288. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_scan.py +0 -0
  289. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_stale_instructions.py +0 -0
  290. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_doctor_unratified_accept.py +0 -0
  291. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_domains.py +0 -0
  292. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_entity_duplicate_resolution.py +0 -0
  293. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_entity_get_or_create_race.py +0 -0
  294. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_env_isolation.py +0 -0
  295. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_fact_reachability_gate.py +0 -0
  296. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_bindings_blame.py +0 -0
  297. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_bindings_provenance.py +0 -0
  298. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_config_isolation.py +0 -0
  299. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_git_env.py +0 -0
  300. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_graph_freshness.py +0 -0
  301. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hook_spawn_guard.py +0 -0
  302. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_agent_brief.py +0 -0
  303. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_agent_state.py +0 -0
  304. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_borrowed_graph.py +0 -0
  305. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_claude_settings.py +0 -0
  306. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_drift_nudge.py +0 -0
  307. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_launch.py +0 -0
  308. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_pretool.py +0 -0
  309. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_pretool_records.py +0 -0
  310. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_session_key.py +0 -0
  311. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_session_start.py +0 -0
  312. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_session_start_concurrent.py +0 -0
  313. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_stop.py +0 -0
  314. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_subagent_start.py +0 -0
  315. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_subdirectory_launch.py +0 -0
  316. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_touch_events.py +0 -0
  317. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_host_wiring_checks.py +0 -0
  318. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hot_index_hook.py +0 -0
  319. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_hot_path_imports.py +0 -0
  320. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity.py +0 -0
  321. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity_refresh_hook.py +0 -0
  322. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity_replay.py +0 -0
  323. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_integrity_stranded.py +0 -0
  324. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_lazy_root.py +0 -0
  325. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_member_anchor_wiring.py +0 -0
  326. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_mind_model_additive_fields.py +0 -0
  327. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_nearest_anchored.py +0 -0
  328. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_okf.py +0 -0
  329. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  330. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_proposal_lifecycle.py +0 -0
  331. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  332. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_community_labels.py +0 -0
  333. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_doc_nodes.py +0 -0
  334. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_graph.py +0 -0
  335. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_integration.py +0 -0
  336. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_member_name_lookup.py +0 -0
  337. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_member_names.py +0 -0
  338. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_nodes_in_file.py +0 -0
  339. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_perf.py +0 -0
  340. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_rationale.py +0 -0
  341. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_read.py +0 -0
  342. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_resolve.py +0 -0
  343. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_subdir_mismatch.py +0 -0
  344. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_reader_version.py +0 -0
  345. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_redaction_seeded.py +0 -0
  346. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_repoint_integration.py +0 -0
  347. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_budget_counters.py +0 -0
  348. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_context.py +0 -0
  349. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_drift_marker.py +0 -0
  350. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_drilldown.py +0 -0
  351. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_facts.py +0 -0
  352. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_guessed.py +0 -0
  353. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_ids.py +0 -0
  354. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_integration.py +0 -0
  355. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_rank.py +0 -0
  356. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_seeds.py +0 -0
  357. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_shown_ids.py +0 -0
  358. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  359. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_thin_tools.py +0 -0
  360. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_toc.py +0 -0
  361. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_toptier.py +0 -0
  362. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_retrieval_unratified.py +0 -0
  363. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sandbox_hygiene.py +0 -0
  364. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_schema_descriptor.py +0 -0
  365. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_schema_domain.py +0 -0
  366. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_schema_fact.py +0 -0
  367. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_seed_ladder.py +0 -0
  368. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_add_anchors.py +0 -0
  369. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_anchoring.py +0 -0
  370. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_capture.py +0 -0
  371. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_commit_hint.py +0 -0
  372. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_coverage_events.py +0 -0
  373. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_domains.py +0 -0
  374. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_drilldown.py +0 -0
  375. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_facts.py +0 -0
  376. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_find_entity.py +0 -0
  377. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_get_store.py +0 -0
  378. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_get_task_context.py +0 -0
  379. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_graph_freshness.py +0 -0
  380. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_graph_path.py +0 -0
  381. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_import.py +0 -0
  382. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_nearest_anchored.py +0 -0
  383. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  384. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_ratify_facts.py +0 -0
  385. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_redaction.py +0 -0
  386. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_refresh.py +0 -0
  387. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_render_events.py +0 -0
  388. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_supersede.py +0 -0
  389. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_sync_anchors.py +0 -0
  390. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_telemetry.py +0 -0
  391. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_thin_tools.py +0 -0
  392. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_tolerant_seeds.py +0 -0
  393. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_server_verify.py +0 -0
  394. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_graph.py +0 -0
  395. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_health.py +0 -0
  396. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_render.py +0 -0
  397. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_skill.py +0 -0
  398. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stats_snapshot.py +0 -0
  399. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stop_hot_path.py +0 -0
  400. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_stop_rearm.py +0 -0
  401. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store.py +0 -0
  402. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_agent_state.py +0 -0
  403. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  404. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_bad_file.py +0 -0
  405. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_binding_index.py +0 -0
  406. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_canonical_stat.py +0 -0
  407. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_compact_review.py +0 -0
  408. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_concurrent_open.py +0 -0
  409. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_coverage_telemetry.py +0 -0
  410. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_derived_community.py +0 -0
  411. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_domains.py +0 -0
  412. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_entities.py +0 -0
  413. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_fact_cascade.py +0 -0
  414. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_facts.py +0 -0
  415. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_git_root_symlink.py +0 -0
  416. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_meta.py +0 -0
  417. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_migration.py +0 -0
  418. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_mutation_guard.py +0 -0
  419. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_mutation_immediate.py +0 -0
  420. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  421. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_persistence.py +0 -0
  422. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_ratification.py +0 -0
  423. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_rebuild_atomicity.py +0 -0
  424. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_record_identity.py +0 -0
  425. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_render_events.py +0 -0
  426. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_retrieval.py +0 -0
  427. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_slug_conflicts.py +0 -0
  428. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_stamping_marker.py +0 -0
  429. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_symlinks.py +0 -0
  430. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_telemetry.py +0 -0
  431. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_threading.py +0 -0
  432. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_tmp_sweep_age.py +0 -0
  433. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_store_update_meta_if.py +0 -0
  434. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_subagent_start_manifests.py +0 -0
  435. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_canonical_writes.py +0 -0
  436. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_clean.py +0 -0
  437. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_domains.py +0 -0
  438. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_drift_cache.py +0 -0
  439. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_fresh_clone.py +0 -0
  440. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_integration.py +0 -0
  441. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_moved_adoption.py +0 -0
  442. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_rebind.py +0 -0
  443. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_repoint.py +0 -0
  444. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_report_has_findings.py +0 -0
  445. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_run.py +0 -0
  446. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_toc_cache.py +0 -0
  447. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_volatile_heal.py +0 -0
  448. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_sync_wiring.py +0 -0
  449. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_telemetry_retention.py +0 -0
  450. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_text_paths.py +0 -0
  451. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_asset_packaged.py +0 -0
  452. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_model.py +0 -0
  453. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_render_html.py +0 -0
  454. {sidegraph-0.9.0 → sidegraph-0.11.0}/tests/test_viz_render_json.py +0 -0
  455. {sidegraph-0.9.0 → sidegraph-0.11.0}/tools/check_no_session_links.py +0 -0
@@ -8,7 +8,7 @@
8
8
  "source": "local",
9
9
  "path": "./plugin/sidegraph"
10
10
  },
11
- "description": "Durable decision/lessons memory over your code graph — captured in-session, human-ratified, retrieved mistakes-first, surviving refactors."
11
+ "description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors."
12
12
  }
13
13
  ]
14
14
  }
@@ -6,7 +6,7 @@
6
6
  {
7
7
  "name": "sidegraph",
8
8
  "source": "./plugin/sidegraph",
9
- "description": "Durable decision/lessons memory over your code graph — captured in-session, human-ratified, retrieved mistakes-first, surviving refactors.",
9
+ "description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors.",
10
10
  "homepage": "https://github.com/SantyagoSeaman/sidegraph"
11
11
  }
12
12
  ]
@@ -31,8 +31,9 @@ Tests/fixtures: `tests/`; plugin skills/configuration in `plugin/sidegraph/`.
31
31
  Python 3.13+; `uv`:
32
32
 
33
33
  - `uv sync --locked`: install dependencies.
34
- - `uv run pytest tests/test_store.py -q`: focused tests.
35
- - `uv run pytest -q`: full suite; CI covers 3.13/3.14.
34
+ - `uv run pytest tests/test_store.py -q`: the touched test file while editing (`-x`, `--lf`).
35
+ - `uv run pytest -m "not slow"`: the broader pre-push check; skips the subprocess-heavy tests, but still takes minutes.
36
+ - `uv run pytest -q`: full suite; run it once before a commit or PR, not while editing. CI runs it again (3.13/3.14).
36
37
  - `uv run pre-commit run --all-files`: shared lint/format/type/secret-scanning gate (also
37
38
  runs `gitleaks`, `detect-private-key`, `zizmor`, `actionlint`, `check-toml`, and a
38
39
  `uv.lock`-in-sync check).
@@ -7,6 +7,282 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.11.0] — 2026-10-09
11
+
12
+ ### Changed
13
+
14
+ - **`index.db` no longer creates and deletes its journal in every write transaction.** SQLite's
15
+ default rollback mode (`DELETE`) created `index.db-journal` at the start of each write and
16
+ removed it at the end, and the hooks write on every tool call, so one store produced
17
+ hundreds of thousands of file-system events an hour. Every connection that writes now runs
18
+ `journal_mode=TRUNCATE`: the same rollback journal, locking and crash safety, but the journal
19
+ is emptied rather than deleted, so a 0-byte `index.db-journal` stays beside `index.db`
20
+ (gitignored by `index.db*`, as before). Each transaction still writes, truncates and syncs
21
+ that file, so the events do not vanish: they fall most for back-to-back writes (tests, bulk
22
+ imports: about nine times fewer on the journal) and by about a third for hook traffic.
23
+ Read-only connections still write nothing, and there is normally no `-wal`/`-shm`; an index
24
+ that another connection has pinned in WAL stays in WAL, which Sidegraph tolerates. A crash
25
+ mid-transaction still leaves a non-empty journal that the next writer rolls back.
26
+
27
+ ### Fixed
28
+
29
+ - **The `UNANCHORED` line of `sidegraph-bootstrap` now names the graph in use.** It always said
30
+ to run `graphify update .`, which rebuilds only the default graph, so with `--graph` or
31
+ `$SIDEGRAPH_GRAPH` elsewhere the advice could not make the next run write the document. It now
32
+ uses the same step as the `ANCHORS` line: `rebuild the graph at <path> and rerun` for a custom
33
+ graph, `run `graphify update .` and rerun` for the default one.
34
+ - **A fresh `sidegraph-bootstrap` run now lists the store's creation marker as changed.** The
35
+ `CHANGED` lines and `--report` named `format` and `.gitignore` but not the committed
36
+ `stamping_live_since` file the same run created.
37
+ - **`sidegraph-bootstrap` now says what is wrong when a ratified or revived record is out of the
38
+ graph's reach.** For an accepted candidate with no anchor in the current graph whose content
39
+ is already stored (ratified in place, or revived from a rejected record), every rerun used to
40
+ print `ANCHORS incomplete: accepted candidate has unresolved or ambiguous anchors`,
41
+ `PROOF incomplete: selected decision did not surface` and a `RESUME` line that could never
42
+ succeed, and exit 2. The anchors are now judged by whether the
43
+ record still surfaces through production retrieval, the same test as `PROOF`: when it does
44
+ not, the run still exits 2 but prints ``ANCHORS incomplete: stored record <id> for
45
+ <source> has no anchor in the current graph; run `graphify update .` and rerun``, a matching
46
+ `PROOF` reason and a `NEXT` line with that command instead of `RESUME`; once the graph has the
47
+ node, the rerun exits 0. The exact `RESUME` stays when something a resume can fix (a failed
48
+ write, missing host wiring) is also wrong, and with `--graph` the line names the graph to
49
+ rebuild instead. The `--report` file carries the same remedy. A written record with an
50
+ unresolved backticked mention keeps its old message.
51
+ - **A directory named like a record no longer makes the whole store unopenable.** A directory
52
+ (or a dangling or looping symlink) called `.x.json`, or `01ABC.json`, in `decisions/`,
53
+ `facts/`, `domains/`, `entities/` or `initiatives/` (or in `bindings/` under a safe name, or
54
+ `archive/` as `*.jsonl`) crashed every open of the store, so every hook and MCP call failed
55
+ (`IsADirectoryError` for a directory, `Too many levels of symbolic links` for a looping
56
+ link), and a FIFO there blocked the open for ever. The reload now skips any entry that is not
57
+ a regular file before reading it, lists it in the skipped files with the reason `not a
58
+ regular file`, and the startup warning names it; the other records load and the next open
59
+ takes the fast path. `sidegraph-verify` reports such an entry once, as `unsafe-record-id`
60
+ for an unsafe record name and as `parse-error` (`bad-archive-segment` in `archive/`,
61
+ whatever the segment's name) otherwise, and no longer blocks on a FIFO, including
62
+ `--against` when a tracked file was replaced by one. A stale directory or looping symlink
63
+ named `*.tmp` no longer fails the open either. `sidegraph-stats` no longer ends in a
64
+ traceback on a looping link, and no longer reports the index as behind for ever because of a
65
+ dangling symlink. The skip reason for a file with an unsafe name now says `unsafe filename`
66
+ instead of "id 'A' does not match the filename".
67
+ - **`sidegraph-prepare-commit-msg` no longer leaves its candidate block in `git commit -m`
68
+ messages under the `pre-commit` framework.** The framework passes the hook only the message
69
+ file and hands git's source in `PRE_COMMIT_COMMIT_MSG_SOURCE`, so the hook always saw "source
70
+ absent" and wrote its `# Sidegraph: uncomment the trailers…` and `# Sidegraph-Decision: …`
71
+ lines, which `-m` commits keep. With exactly one argument the hook now reads the source from
72
+ that variable (unset or empty means a plain commit); with two or three arguments, as raw git
73
+ passes them, the arguments still win.
74
+ - **The hook entry points answer `--help` instead of running.** `sidegraph-session-start --help`
75
+ ran the SessionStart hook in the current directory and wrote into its `index.db`, and the other
76
+ three hook scripts (`sidegraph-stop`, `sidegraph-pre-tool-use`, `sidegraph-subagent-start`)
77
+ ignored their arguments the same way, while `sidegraph-prepare-commit-msg --help` printed
78
+ nothing and `sidegraph-mcp --help` started the server. Each now prints a short usage text for
79
+ `-h` or `--help` and exits 0 before it reads stdin, opens the store or writes anything. Any
80
+ other argument to a hook script is a usage error on stderr with exit 2. The git hook
81
+ `sidegraph-prepare-commit-msg` stays fail-open: it prints the same error for an unknown option
82
+ or a fourth argument but exits 0 and leaves the message untouched, so `git commit` never fails
83
+ because of a stray `args:` entry; git's one to three positional arguments are unchanged. Hosts call the hook scripts without
84
+ arguments, so nothing a host runs changes.
85
+ - **`sidegraph-bootstrap` now converges when an accepted candidate has no anchor.** A document
86
+ with no backticked symbol and no node in the graph (typically one newer than the last graph
87
+ build) was never written, yet stayed pending: every run, `--resume` included, ended
88
+ `partial-recoverable` or `incomplete` with exit 2 and a `FAILED REF <none>` the operator
89
+ could not act on. Review now flags it with a `no-anchor` warning, and apply skips it by name
90
+ on an `UNANCHORED` line with its source path (`skipped_unanchorable_keys` in the report object)
91
+ and counts it as neither durable nor pending, so it no longer keeps the run partial. A run
92
+ where every approved candidate is skipped this way writes no record and ends as a diagnostic
93
+ that exits 0. It keeps the checks a run with records has, except the anchor and proof ones:
94
+ the store reopens and verifies clean, the host integration is verified, and `--report` is
95
+ written. A missing host integration or a store violation exits 2 instead (`STORE
96
+ incomplete`, with `RESUME`, or `sidegraph-verify` for a violation), as does an anchored
97
+ candidate kept proposed. Run `graphify update .` (or rebuild the `--graph` file) and the next
98
+ run writes it.
99
+ `sidegraph-import` is unchanged.
100
+ - **`sidegraph-verify` now reports a domain whose `parent_id` is not a domain, or whose parent
101
+ chain loops.** The store refuses to write either, but a hand-edited domain with
102
+ `parent_id: "not-a-domain"` passed `sidegraph-verify` and `sidegraph-doctor` with exit 0. A
103
+ `parent_id` that names no domain, hot or archived, is now a `dangling-parent`, and a parent
104
+ chain that comes back to itself (a domain that is its own parent included) is one
105
+ `parent-cycle` per cycle, at the domain with the smallest id on it. A superseded, dropped or
106
+ compacted parent still counts as existing, so a history written through the tools stays
107
+ clean, and a parent held by a file skipped for its name is not reported twice. A non-string
108
+ `parent_id` stays a `parse-error` (a `bad-archive-segment` in an archive segment).
109
+ - **A record directory the process cannot list or search is reported as unreadable, not as
110
+ missing records.** With `decisions/` at mode 000, `sidegraph-verify` printed a
111
+ `dangling-fact-support` for every fact and `--against` an `illegal-deletion` for every
112
+ record, as if the store had been tampered with. `sidegraph-verify` and `sidegraph-doctor` now
113
+ stop with one `store not readable` line naming the directory and exit 1, before any
114
+ cross-reference or deletion check runs. `sidegraph-stats` likewise says `cannot read the
115
+ store index` instead of `no store index` when the store directory cannot be searched, and no
116
+ longer ends in a traceback when a record directory cannot be listed. An empty record
117
+ directory without the search bit is reported the same way.
118
+ - **`sidegraph-verify` reports only `unsafe-record-id` for a record file the store skips for
119
+ its name or id.** A copy such as `decisions/.x.json` was also reported as
120
+ `filename-id-mismatch` and `duplicate-ulid`, and a file with a safe name but an unsafe id as
121
+ `filename-id-mismatch` too, though the store never indexes either. A file with an unsafe
122
+ name that was not valid JSON, not UTF-8 or not an object showed only `parse-error`, and the
123
+ same went for a `bindings/` file that was not a JSON list, so the real problem, the name,
124
+ went unreported. The name is now checked before the content, in every record directory. A
125
+ file skipped for its name no longer counts as a second copy of a record, but a record that
126
+ points at its id is not reported either: renaming the file back is the only fix.
127
+ - **`sidegraph-compact` no longer warns "DIFFERENT content" for a hot file that only lacks
128
+ newer keys.** A decision or domain written before `ratified_at`, `ratified_by` or
129
+ `provenance.commit` existed has no such keys, while its archive line, dumped from the model,
130
+ carries them as `null`. The raw comparison read that as a difference, kept the hot file and
131
+ repeated the warning on every index rebuild and every later compact. The visible damage was
132
+ that `sidegraph-verify` then exited 2 with a `duplicate-ulid` for each kept hot file, so the
133
+ store-lint gate failed after a compact. A key the hot file lacks now matches an explicit
134
+ `null` or an empty list or object in the archive, recursively, as `sidegraph-verify
135
+ --against` already treats it. The match is one-directional: a key only the hot file holds, at
136
+ any depth and whatever its value, still warns and keeps the file, so a field written by a
137
+ newer version is never lost to a compact by an older one.
138
+ - **`sidegraph-doctor` keeps its `auto share` and `auto supersede rate` lines on a hand-edited
139
+ archived record.** An archived decision, a fact or a domain whose `status` was a list or a
140
+ dict made the auto-share tally raise, and doctor swallowed the error and dropped both lines
141
+ without a word. The bad value now counts as not retired and the lines print. Any other error
142
+ in the ratification lines is no longer swallowed.
143
+ - **`sidegraph-verify` no longer crashes on a non-string `supersedes`.** A hand-edited record
144
+ whose `supersedes` was a list or a dict ended the run with a `TypeError` and lost every
145
+ other violation. The bad value is now reported as the violation it is and the run goes on.
146
+ - **`sidegraph-verify` no longer crashes on an unhashable `supports` item, a status in
147
+ `--against`, or the malformed id of a deleted record.** Each used a raw hand-edited value as a
148
+ set member or lookup key; the run died with exit 1 where it should find the violation and exit
149
+ 2. A malformed old status in `--against` is now reported as an illegal status jump.
150
+ - **A symlinked store directory now stops `sidegraph-verify` and `sidegraph-doctor` at the
151
+ link.** Verify reported the link but still read through it: `facts -> decisions` linted every
152
+ decision as a fact, a link out of the store linted foreign files, and a linked-out `entities`,
153
+ `decisions` or `archive` made references into it look dangling. Both commands now report the
154
+ `symlinked-store-entry` findings, skip every other check (doctor's advisory checks and
155
+ `--against` included) and print one line saying so in text output; the exit code stays 2. An
156
+ `--against` ref that does not resolve, or a store outside git, is still checked first and exits
157
+ 1 without reporting the links. A
158
+ symlinked `format` marker is no longer read, so its target's text cannot reach a CI log. A bindings file with
159
+ an unsafe name no longer also reports its entities as dangling, since the store skips that
160
+ file whole.
161
+ - **`sidegraph-verify` and `sidegraph-doctor` report a store directory they cannot search as
162
+ `store not readable` on every Python.** With the store directory (or a parent) lacking the
163
+ search bit, for example `chmod 000` or `chmod 600 .sidegraph`, Python 3.14 reported
164
+ `unknown-schema-version … format marker missing` or `store directory not found` with exit 2
165
+ or 1, which read as a bad schema version or a missing store; Python 3.13 already printed
166
+ `store not readable (…)` with exit 1. Both commands now look the directory and its `format`
167
+ marker up with `os.stat`/`os.lstat`, which raise on every Python, and take the exit-1 path.
168
+ A directory that is searchable but not listable (`chmod 300`) is still checked normally.
169
+ The MCP `verify_store` tool now raises on 3.14 as it did on 3.13 instead of reporting
170
+ `unknown-schema-version`, and a store path that is a symlink loop reports the OS error
171
+ (`Too many levels of symbolic links`) instead of `store directory not found`, still with
172
+ exit 1.
173
+ - **`sidegraph-doctor` no longer crashes on a list or dict `status` or `entity_id`.** A
174
+ hand-edited decision whose `status` was a list or a dict, or an anchor-set entry whose
175
+ `entity_id` was one, made the dangling-record, unreferenced-entity, expired-open-validity,
176
+ never-surfaced and code-drift checks raise a `TypeError`. The run exited 1 and lost the whole
177
+ report, including the `parse-error` that `sidegraph-verify` found for the same file, and the
178
+ hooks that swallow the error silently switched the code-drift line off for every record. The
179
+ bad value is now skipped by those checks and reported once, by the model check, so the run
180
+ exits 2 with the rest of its findings.
181
+
182
+ ## [0.10.0] — 2026-10-04
183
+
184
+ ### Added
185
+
186
+ - **Every MCP tool now carries annotations, so a host's auto-reviewer stops rejecting memory
187
+ reads.** In the field, Codex's auto-reviewer rejected 20 `get_task_context` calls, and each
188
+ one lost memory for that step: an unannotated tool takes the MCP defaults (destructive,
189
+ open-world), and the review's verdict then depends on the prompt. The seven tools that never
190
+ change a tracked file are read-only; the other 17 are non-destructive, closed-world local
191
+ writes. No tool sends anything off the machine and none deletes a record. A test runs the
192
+ read-only tools on a store where a lazy sync would adopt a moved symbol, and fails if one of
193
+ them changes a tracked file, so the annotation cannot drift from what the tool does. See the
194
+ [reference](docs/reference/mcp-tools.md#annotations) and the
195
+ [Codex page](docs/integrations/codex.md#the-auto-reviewer-and-memory-reads).
196
+ - **The seed tools accept the argument names agents try, and every tool names its parameters in
197
+ an error.** `get_task_context`, `query_structure` and `query_decisions` accept `paths` (as
198
+ `files`) and `seeds`; each seed goes to `files` when it looks like a path and to `entities`
199
+ otherwise. `task` is refused with a line saying there is no free-text query. Any other
200
+ unknown argument, on any tool, is an error that names it and lists the tool's real parameters;
201
+ FastMCP's own error named the argument but not the parameters.
202
+
203
+ ### Changed
204
+
205
+ - **`retrieve_decisions` no longer returns the whole store.** One call returned a full dump of
206
+ every visible decision: about 143,000 tokens on a store of 260 records, more than a host would
207
+ show, and in a field report most agents passed `include_superseded: true` and then either
208
+ printed the dump or filtered it by hand. The call now has two answers.
209
+ - With no narrowing filter it returns an **overview**: the total, counts by status and kind
210
+ (superseded and rejected records included, so the counts say that history exists), and the
211
+ newest records as compact rows (`id`, `kind`, `status`, `title`, `valid_from`).
212
+ - With a narrowing filter it returns **full records**, gotchas and lessons first and newest
213
+ first, cut at `limit` (default 25, at most 100) or `budget_chars` (default 24,000, at most
214
+ 60,000), whichever comes first. A `hint` says what cut the list, or why it is empty.
215
+ - The filters are new arguments, and they combine with AND: `status` and `kind` (a string or a
216
+ list), `files`, `query` (every word must occur in the record's text) and `ids` (exact record
217
+ ids, superseded ones too). `include_superseded` keeps its meaning: it widens the overview's
218
+ `newest` and a filtered call that has no `status`.
219
+ - `files` are read the way `get_task_context` reads them: a basename, a suffix, a directory or
220
+ a letter-case slip works. `unresolved_files` lists, for each path nothing could read (at most
221
+ ten, with `unresolved_omitted` counting the rest), why (`ambiguous`, `directory-too-large`,
222
+ `not-in-graph` or `no-graph`) and the candidates to pass instead.
223
+ - **The return type changed from a list to a JSON object, sent once as a single text block
224
+ with no structured copy**, so `budget_chars` is the real cost on every host. A client that
225
+ read the list now reads `decisions` of a filtered answer. The proposal policy is unchanged
226
+ and applies to every shape.
227
+ - The `check-plan`, `explain-why`, `triage-drift` and `heal-anchors` skills now call it with a
228
+ filter, and a test fails if a skill calls it without one. See the
229
+ [reference](docs/reference/mcp-tools.md#retrieve_decisions).
230
+
231
+ ### Fixed
232
+
233
+ - **A fault converting a reviewed item in `sidegraph-bootstrap` now prints the RESUME line.** The
234
+ conversion of each reviewed item, and the check that its ref still matches the candidate,
235
+ ran outside the per-item error handling. A fault there, after an earlier item had been
236
+ written, left `apply_review` without a report: an `AssertionError` ended the run as a
237
+ traceback, a `ValueError` was reported as a failure before anything was written, and neither
238
+ printed `RESUME`, though canonical files were already on disk. The fault now takes the path a
239
+ write error takes: the run stops, reports `partial-recoverable` with the durable candidates and
240
+ the failing ref, and prints the resume command. A fault on the first item, before anything is
241
+ written, now exits 2 with `STORE incomplete`, the failing ref and the resume command, where a
242
+ `ValueError` used to exit 1 with an `ERROR` line; the terminal shows the failing ref and not the
243
+ reason.
244
+ - **`sidegraph-import --dry-run` now says what auto-ratification would do.** Both import paths
245
+ decided auto-ratification only after a real write, so under a non-`manual`
246
+ `SIDEGRAPH_RATIFY_POLICY` a dry run could not show which records a real run would land
247
+ accepted without a human: on one fixture it reported 0 where the real run auto-ratified 2. The
248
+ dry run now runs the same eligibility gate on the record the write would produce and reports
249
+ the result in a new `would_auto_ratify` field on `ImportReport` and `DocImportReport`, and as
250
+ `auto_ratify_eligible` on each dry-run item. `auto_ratified` keeps its meaning, transitions
251
+ that actually happened, so it stays 0 in a dry run.
252
+ - **Behaviour change:** under a non-`manual` policy the summary line gains `would
253
+ auto-ratify M` before `(skipped:` and an eligible item line ends with ` [auto]`. Under
254
+ `manual` both are unchanged. A dry run still never carries the real run's `auto-ratified K`.
255
+ - The count is eligibility, not a guarantee: a real run's transition can still fail, for
256
+ example on a race or a refused cascade.
257
+ - A key repeated within one run no longer counts twice in the dry run. Two rationales with the
258
+ same title in one file count once. A document ref met more than once (one file named twice, a
259
+ directory plus a file inside it, or a live and an archived copy that a profile maps to one
260
+ ref) is classified against the records the earlier copies would have left there, as the real
261
+ run sees them: an identical repeat is skipped, a differing one supersedes, and a copy after a
262
+ `rejected` first copy is a fresh write. Two rare shapes can still differ in the
263
+ `superseded`/`skipped` split, not in the eligibility count where checked: a ref met three
264
+ times with the first content returning, under an auto policy, and a repeat with no anchor of
265
+ its own.
266
+ - **`find_entity` no longer calls a dangling record a decision.** Each binding was labelled
267
+ `fact` if a fact lookup found it and `decision` otherwise, so a binding whose record exists in
268
+ neither table (a record file removed by hand, or lost in a merge) came back as a decision that
269
+ `get_decision` could not fetch, and each binding cost a query of its own. The types of all of an
270
+ entity's bindings now come from one read of the index, and a binding with no record reports
271
+ `record_type: "unknown"`. The value is additive: a client that handles `decision` and `fact`
272
+ is unaffected. `get_entity_history` uses the same read and still skips such a binding. See the
273
+ [reference](docs/reference/mcp-tools.md#find_entity).
274
+ - **A document status like `should not be rejected` no longer lands `rejected`.** The check for
275
+ a turned-down status saw a negation only as `not` and one space directly before the word, so
276
+ `should not be rejected`, `not rejected` (two spaces), `never rejected` and `isn't rejected`
277
+ all read as rejections, and a false `rejected` lands closed and invisible to retrieval. A
278
+ negation is now `not`, `never` or a word ending `n't` within the three words before the word in
279
+ the same clause. A clause ends at `,` `;` `.` `:`, a pipe, a slash, an em or en dash, or a spaced
280
+ hyphen or `->`, so `not reviewed, rejected`, `Not accepted — rejected` and `Won't do / rejected`
281
+ still read as rejections, as does `not rejected, rejected`. A conjunction does not end a
282
+ clause: `Not adopted and rejected` reads as negated, and lands accepted unless `--propose` or
283
+ a draft marker sends it to the ratification queue. See the
284
+ [reference](docs/reference/cli.md#sidegraph-import).
285
+
10
286
  ## [0.9.0] — 2026-10-04
11
287
 
12
288
  ### Added
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
13
13
  continuing participant in the project. A core feature must preserve, organize, or deliver
14
14
  accumulated project understanding. Document search by itself is not the product.
15
15
 
16
- Sidegraph is pre-1.0 (v0.9.0) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.11.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
@@ -98,8 +98,9 @@ See [`docs/concepts/data-model.md`](docs/concepts/data-model.md) for the record
98
98
  ```bash
99
99
  uv sync # install deps into .venv
100
100
  uv run pre-commit install # once per clone — the lint gate runs before each commit
101
- uv run pytest # run tests
102
- uv run pytest tests/test_store.py -q
101
+ uv run pytest tests/test_store.py -q # while editing: the touched file (-x, --lf)
102
+ uv run pytest -m "not slow" # broader pre-push check: skips subprocess-heavy tests, still minutes
103
+ uv run pytest # full suite: once before a commit or PR (CI runs it again)
103
104
  uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
104
105
  uv run sidegraph-mcp # run the decision MCP server (stdio)
105
106
  ```
@@ -20,10 +20,16 @@ consequence for you:
20
20
  git clone https://github.com/SantyagoSeaman/sidegraph.git && cd sidegraph
21
21
  uv sync # runtime + dev dependencies (Python 3.13+)
22
22
  uv run pre-commit install # once per clone — the lint gate runs before each commit
23
- uv run pytest -q # full suite must be green
23
+ uv run pytest tests/test_store.py -q -x --lf # while editing: the touched file
24
+ uv run pytest -m "not slow" # broader pre-push check: skips subprocess-heavy tests, still takes minutes
25
+ uv run pytest -q # full suite: run before a commit or PR, must be green; CI runs it again
24
26
  uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
25
27
  ```
26
28
 
29
+ A passing test's `tmp_path` tree is removed; a failing test's is kept for inspection
30
+ (`tmp_path_retention_policy = "failed"` in `pyproject.toml`). Run with
31
+ `-o tmp_path_retention_policy=all` to keep every test's tree.
32
+
27
33
  The suite is hermetic to `SIDEGRAPH_*` environment variables: `tests/conftest.py` strips every
28
34
  one of them before each test runs, so a variable already set in your shell can never change what
29
35
  the suite asserts. A test that needs one set must set it explicitly with `monkeypatch` rather
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sidegraph
3
- Version: 0.9.0
3
+ Version: 0.11.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
@@ -82,7 +82,9 @@ only ever reads `graph.json`, so the plain install above is all it needs.
82
82
 
83
83
  ```bash
84
84
  # 3. Install the CLIs + MCP server, then bootstrap the store in your repo
85
- # (creates .sidegraph/, prints setup instructions)
85
+ # (creates .sidegraph/, prints setup instructions). In a terminal it also asks
86
+ # whether to install a git hook that rebuilds the code graph after each commit,
87
+ # merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
86
88
  uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
87
89
  sidegraph-init
88
90
 
@@ -172,6 +174,10 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
172
174
  Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
173
175
  ```
174
176
 
177
+ Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
178
+ subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
179
+ subagent that decision memory exists and how to ask it.
180
+
175
181
  Two layers age differently: the **structure** layer (the code graph — entities,
176
182
  dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
177
183
  graph is disposable — the engine regenerates it from source at any moment. The memory must
@@ -215,7 +221,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
215
221
  | `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
216
222
  | `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
217
223
  | `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
218
- | `retrieve_decisions` / `list_facts` | List current decisions / current facts |
224
+ | `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
219
225
  | `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
220
226
  | `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
221
227
  | `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
@@ -247,16 +253,22 @@ retrieval a richer graph to anchor against. Walkthrough:
247
253
 
248
254
  - **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
249
255
  (strictly read-only) and writes small human-readable JSON records inside your repo,
250
- plus a local, gitignored index it can always rebuild. **Nothing leaves your machine** —
256
+ plus a local, gitignored index it can always rebuild. Two things sit outside the store:
257
+ the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
258
+ three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
259
+ `${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
260
+ **Nothing leaves your machine** —
251
261
  no network calls, no remote telemetry, no account. Sidegraph does keep local usage
252
262
  diagnostics in that gitignored index (which stored memory was shown, and which files a
253
263
  session touched afterwards) so you can see which memory was shown and which files
254
264
  those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
255
265
  - **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
256
- are stored. A ratification gate controls what the agent's drafts can persist: human for
257
- `adr`/`constraint` decisions and domains always, and, if you answer yes to `sidegraph-init`'s
258
- question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), an auto-ratification stamp for lessons,
259
- gotchas, and standalone facts instead of a person's review.
266
+ are stored. A ratification gate controls which of the agent's drafts become trusted
267
+ memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
268
+ and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
269
+ question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
270
+ at write time with a stamp that says so: lessons, gotchas, and standalone facts under
271
+ `auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
260
272
  - **Nothing is silently rewritten.** The store is append-only; every change of mind is
261
273
  recorded as a supersession with its reason.
262
274
 
@@ -269,7 +281,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
269
281
  domains and retrieval still works, but symbol-level anchors, communities, and moved-code
270
282
  resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
271
283
  Everything the engine produces is derived and regenerated on every rebuild; everything
272
- Sidegraph stores is deliberate, ratified, and permanent. **Own the memory, rent the graph.**
284
+ Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
285
+ person, or by the opt-in policy). **Own the memory, rent the graph.**
273
286
 
274
287
  ## Status
275
288
 
@@ -52,7 +52,9 @@ only ever reads `graph.json`, so the plain install above is all it needs.
52
52
 
53
53
  ```bash
54
54
  # 3. Install the CLIs + MCP server, then bootstrap the store in your repo
55
- # (creates .sidegraph/, prints setup instructions)
55
+ # (creates .sidegraph/, prints setup instructions). In a terminal it also asks
56
+ # whether to install a git hook that rebuilds the code graph after each commit,
57
+ # merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
56
58
  uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
57
59
  sidegraph-init
58
60
 
@@ -142,6 +144,10 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
142
144
  Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
143
145
  ```
144
146
 
147
+ Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
148
+ subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
149
+ subagent that decision memory exists and how to ask it.
150
+
145
151
  Two layers age differently: the **structure** layer (the code graph — entities,
146
152
  dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
147
153
  graph is disposable — the engine regenerates it from source at any moment. The memory must
@@ -185,7 +191,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
185
191
  | `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
186
192
  | `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
187
193
  | `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
188
- | `retrieve_decisions` / `list_facts` | List current decisions / current facts |
194
+ | `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
189
195
  | `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
190
196
  | `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
191
197
  | `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
@@ -217,16 +223,22 @@ retrieval a richer graph to anchor against. Walkthrough:
217
223
 
218
224
  - **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
219
225
  (strictly read-only) and writes small human-readable JSON records inside your repo,
220
- plus a local, gitignored index it can always rebuild. **Nothing leaves your machine** —
226
+ plus a local, gitignored index it can always rebuild. Two things sit outside the store:
227
+ the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
228
+ three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
229
+ `${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
230
+ **Nothing leaves your machine** —
221
231
  no network calls, no remote telemetry, no account. Sidegraph does keep local usage
222
232
  diagnostics in that gitignored index (which stored memory was shown, and which files a
223
233
  session touched afterwards) so you can see which memory was shown and which files
224
234
  those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
225
235
  - **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
226
- are stored. A ratification gate controls what the agent's drafts can persist: human for
227
- `adr`/`constraint` decisions and domains always, and, if you answer yes to `sidegraph-init`'s
228
- question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), an auto-ratification stamp for lessons,
229
- gotchas, and standalone facts instead of a person's review.
236
+ are stored. A ratification gate controls which of the agent's drafts become trusted
237
+ memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
238
+ and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
239
+ question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
240
+ at write time with a stamp that says so: lessons, gotchas, and standalone facts under
241
+ `auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
230
242
  - **Nothing is silently rewritten.** The store is append-only; every change of mind is
231
243
  recorded as a supersession with its reason.
232
244
 
@@ -239,7 +251,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
239
251
  domains and retrieval still works, but symbol-level anchors, communities, and moved-code
240
252
  resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
241
253
  Everything the engine produces is derived and regenerated on every rebuild; everything
242
- Sidegraph stores is deliberate, ratified, and permanent. **Own the memory, rent the graph.**
254
+ Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
255
+ person, or by the opt-in policy). **Own the memory, rent the graph.**
243
256
 
244
257
  ## Status
245
258
 
@@ -25,10 +25,21 @@ Sidegraph is a local-only tool. Its entire data surface:
25
25
  the visualization, OKF export and bootstrap-report commands write to the output paths you
26
26
  give them; and the optional `sidegraph-prepare-commit-msg` git hook, once you install it,
27
27
  adds commented decision trailers to the commit message file git hands it
28
- (normally `.git/COMMIT_EDITMSG`). Beyond those, the only filesystem writes are the standard config
29
- snippets you install yourself (`.mcp.json`, hook entries) — Sidegraph touches nothing
30
- else. See [`docs/reference/store-format.md`](docs/reference/store-format.md) for the full
31
- layout.
28
+ (normally `.git/COMMIT_EDITMSG`). Three more writes sit outside the repository's own
29
+ files. `sidegraph-init --hooks` (or a yes to its refresh question) writes a helper script
30
+ and a marked block in three git hooks (`post-commit`, `post-merge`, `post-checkout`) under
31
+ `.git/hooks/`. When `core.hooksPath` is set, `sidegraph-init` writes only the helper (to
32
+ `.git/hooks/`) and prints the lines to add to your hooks by hand. While it runs, the helper
33
+ also keeps a lock, a flag file and a log in the git directory. `sidegraph-init --no-hooks`
34
+ writes the git config key `sidegraph.graphRefresh` to the repository's own config, and
35
+ `sidegraph-init --remove-hooks` takes the blocks, the helper and that key out again. The
36
+ SessionStart hook writes one 40-character commit id to
37
+ `${XDG_CACHE_HOME:-~/.cache}/sidegraph/launch-commit`, and only when the running package was
38
+ installed from the canonical `git+https://github.com/SantyagoSeaman/sidegraph.git@main`. That
39
+ covers the plugin and the manual `uvx --from …@main` recipe. A PyPI, tag, SHA or editable
40
+ install never writes it. Beyond those, the only filesystem writes are the standard config
41
+ snippets you install yourself (`.mcp.json`, hook entries). See
42
+ [`docs/reference/store-format.md`](docs/reference/store-format.md) for the full layout.
32
43
  - **Network:** none. No remote telemetry, no phone-home, nothing leaves your machine. Local
33
44
  retrieval telemetry is recorded in the gitignored `index.db` by default (which records
34
45
  were shown and which files were touched, never uploaded); set `SIDEGRAPH_TELEMETRY=off` to
@@ -105,7 +105,7 @@ write below — the three raw authoring paths underneath it are:
105
105
  asked to) names a domain directly, optionally nesting it under a `parent_slug`.
106
106
 
107
107
  All three land `status=proposed`. **Every path passes through the same ratification gate** —
108
- the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, kept for one release)
108
+ the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, still kept)
109
109
  and the `sidegraph-ratify` CLI, which list and accept/drop decisions *and* domains side by
110
110
  side. By default no path bypasses human review, including bootstrap: a fresh repo can
111
111
  propose dozens of domains from its community structure in one command, but nothing is named