sidegraph 0.3.1__tar.gz → 0.5.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 (368) hide show
  1. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/workflows/ci.yml +0 -1
  2. {sidegraph-0.3.1 → sidegraph-0.5.0}/CHANGELOG.md +80 -0
  3. {sidegraph-0.3.1 → sidegraph-0.5.0}/CLAUDE.md +1 -1
  4. {sidegraph-0.3.1 → sidegraph-0.5.0}/PKG-INFO +8 -6
  5. {sidegraph-0.3.1 → sidegraph-0.5.0}/README.md +7 -5
  6. {sidegraph-0.3.1 → sidegraph-0.5.0}/SECURITY.md +4 -3
  7. sidegraph-0.5.0/docs/README.md +56 -0
  8. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/concepts/data-model.md +10 -6
  9. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/concepts/mind-model.md +3 -2
  10. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/concepts/retrieval.md +22 -20
  11. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/getting-started/bootstrap.md +2 -6
  12. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/getting-started/claude-code-setup.md +6 -10
  13. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/getting-started/codex-setup.md +12 -15
  14. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/getting-started/installation.md +38 -35
  15. sidegraph-0.5.0/docs/getting-started/quickstart.md +71 -0
  16. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/guides/capturing-decisions.md +11 -8
  17. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/guides/ci-cd-maintenance.md +85 -138
  18. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/guides/naming-your-domains.md +5 -5
  19. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/guides/retrieval-in-sessions.md +23 -24
  20. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/guides/semantic-docs.md +10 -8
  21. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/guides/team-workflow.md +13 -13
  22. sidegraph-0.5.0/docs/guides/verifying-your-setup.md +78 -0
  23. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/integrations/claude-code.md +18 -23
  24. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/integrations/codex.md +10 -10
  25. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/integrations/graphify.md +2 -2
  26. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/llms.txt +8 -8
  27. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/pilot-kit/README.md +25 -11
  28. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/cli.md +120 -89
  29. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/configuration.md +6 -6
  30. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/git-bindings.md +4 -3
  31. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/mcp-tools.md +49 -30
  32. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/operations.md +12 -9
  33. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/releasing.md +56 -38
  34. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/stability.md +6 -6
  35. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/store-format.md +21 -21
  36. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  37. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  38. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +7 -2
  39. {sidegraph-0.3.1 → sidegraph-0.5.0}/pyproject.toml +1 -1
  40. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/__init__.py +1 -1
  41. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/integrations.py +6 -1
  42. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/cli.py +26 -0
  43. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/doc_import.py +23 -6
  44. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/gitio.py +6 -5
  45. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/server.py +39 -23
  46. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/verify.py +110 -23
  47. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/conftest.py +11 -7
  48. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_cli.py +1 -1
  49. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_integrations.py +64 -0
  50. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_import.py +66 -0
  51. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_init.py +67 -0
  52. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doc_import.py +67 -0
  53. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_docs_claims.py +103 -7
  54. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_env_isolation.py +3 -1
  55. sidegraph-0.5.0/tests/test_sandbox_hygiene.py +328 -0
  56. sidegraph-0.5.0/tests/test_server_prewrite_anchor_validation.py +214 -0
  57. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_migration.py +1 -1
  58. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_verify_transitions.py +368 -0
  59. {sidegraph-0.3.1 → sidegraph-0.5.0}/uv.lock +5 -4
  60. sidegraph-0.3.1/docs/README.md +0 -78
  61. sidegraph-0.3.1/docs/getting-started/quickstart.md +0 -102
  62. sidegraph-0.3.1/docs/guides/verifying-your-setup.md +0 -517
  63. sidegraph-0.3.1/tests/test_sandbox_hygiene.py +0 -133
  64. {sidegraph-0.3.1 → sidegraph-0.5.0}/.agents/plugins/marketplace.json +0 -0
  65. {sidegraph-0.3.1 → sidegraph-0.5.0}/.claude-plugin/marketplace.json +0 -0
  66. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/CODEOWNERS +0 -0
  67. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  68. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  69. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  70. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  71. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/secret_scanning.yml +0 -0
  72. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/workflows/publish.yml +0 -0
  73. {sidegraph-0.3.1 → sidegraph-0.5.0}/.github/workflows/scorecard.yml +0 -0
  74. {sidegraph-0.3.1 → sidegraph-0.5.0}/.gitignore +0 -0
  75. {sidegraph-0.3.1 → sidegraph-0.5.0}/.gitleaks.toml +0 -0
  76. {sidegraph-0.3.1 → sidegraph-0.5.0}/.pre-commit-config.yaml +0 -0
  77. {sidegraph-0.3.1 → sidegraph-0.5.0}/.python-version +0 -0
  78. {sidegraph-0.3.1 → sidegraph-0.5.0}/AGENTS.md +0 -0
  79. {sidegraph-0.3.1 → sidegraph-0.5.0}/CODE_OF_CONDUCT.md +0 -0
  80. {sidegraph-0.3.1 → sidegraph-0.5.0}/CONTRIBUTING.md +0 -0
  81. {sidegraph-0.3.1 → sidegraph-0.5.0}/LICENSE +0 -0
  82. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/concepts/anchoring.md +0 -0
  83. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/concepts/decision-memory.md +0 -0
  84. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/guides/surviving-refactors.md +0 -0
  85. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/pilot-kit/corpus_fit.py +0 -0
  86. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/pilot-kit/judge-prompt.md +0 -0
  87. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/pilot-kit/questions-prompt.md +0 -0
  88. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/pilot-kit/rubric-template.md +0 -0
  89. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/reference/hooks.md +0 -0
  90. {sidegraph-0.3.1 → sidegraph-0.5.0}/docs/whitepaper/index.md +0 -0
  91. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/.mcp.json +0 -0
  92. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/codex/hooks.json +0 -0
  93. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/codex/mcp.json +0 -0
  94. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  95. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  96. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  97. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  98. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  99. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  100. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  101. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  102. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  103. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  104. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  105. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  106. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  107. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  108. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
  109. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  110. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
  111. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  112. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  113. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  114. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  115. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  116. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
  117. {sidegraph-0.3.1 → sidegraph-0.5.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  118. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/anchoring.py +0 -0
  119. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  120. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/apply.py +0 -0
  121. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  122. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/cli.py +0 -0
  123. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/model.py +0 -0
  124. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/planner.py +0 -0
  125. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/proof.py +0 -0
  126. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/review.py +0 -0
  127. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/bootstrap/scan.py +0 -0
  128. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/capture.py +0 -0
  129. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/config.py +0 -0
  130. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/doctor.py +0 -0
  131. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/domains.py +0 -0
  132. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/engine/__init__.py +0 -0
  133. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/engine/reader.py +0 -0
  134. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/host/__init__.py +0 -0
  135. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/host/claude_settings.py +0 -0
  136. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/host/hooks.py +0 -0
  137. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/importer.py +0 -0
  138. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/okf.py +0 -0
  139. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/profiles.py +0 -0
  140. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/retrieval.py +0 -0
  141. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/schema.py +0 -0
  142. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/stats/__init__.py +0 -0
  143. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/stats/model.py +0 -0
  144. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/stats/render.py +0 -0
  145. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/store.py +0 -0
  146. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/sync.py +0 -0
  147. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/viz/__init__.py +0 -0
  148. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  149. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/viz/model.py +0 -0
  150. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/viz/render.py +0 -0
  151. {sidegraph-0.3.1 → sidegraph-0.5.0}/src/sidegraph/viz/template.html +0 -0
  152. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/__init__.py +0 -0
  153. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  154. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bitfinex_slice.json +0 -0
  155. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  156. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  157. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  158. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  159. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  160. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/graph.json +0 -0
  161. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  162. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  163. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  164. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  165. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  166. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  167. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  168. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  169. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  170. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  171. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  172. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  173. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  174. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  175. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  176. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  177. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  178. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  179. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  180. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  181. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  182. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  183. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  184. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  185. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/design.md +0 -0
  186. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  187. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  188. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  189. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  190. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  191. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  192. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  193. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  194. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  195. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  196. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  197. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  198. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  199. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  200. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  201. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/fixtures/mini_graph.json +0 -0
  202. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_anchoring.py +0 -0
  203. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  204. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_apply.py +0 -0
  205. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_catalog.py +0 -0
  206. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_model.py +0 -0
  207. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_planner.py +0 -0
  208. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_proof.py +0 -0
  209. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_review.py +0 -0
  210. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_bootstrap_scan.py +0 -0
  211. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_capture_auto_accept.py +0 -0
  212. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_capture_facts.py +0 -0
  213. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_capture_integration.py +0 -0
  214. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_capture_neighbors.py +0 -0
  215. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_capture_propose.py +0 -0
  216. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_capture_redact.py +0 -0
  217. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_compact.py +0 -0
  218. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_doctor.py +0 -0
  219. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_domains.py +0 -0
  220. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_okf.py +0 -0
  221. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_ratify.py +0 -0
  222. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_ratify_facts.py +0 -0
  223. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_stats.py +0 -0
  224. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_sync.py +0 -0
  225. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_sync_check.py +0 -0
  226. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_cli_viz.py +0 -0
  227. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_codex_plugin.py +0 -0
  228. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_community_baseline.py +0 -0
  229. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_config.py +0 -0
  230. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_corpus_expected_renders.py +0 -0
  231. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_corpus_self_corpus.py +0 -0
  232. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  233. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_digest_integrity.py +0 -0
  234. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doc_corpus_integration.py +0 -0
  235. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor.py +0 -0
  236. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_auto_share.py +0 -0
  237. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_code_drift.py +0 -0
  238. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_dangling_supports.py +0 -0
  239. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_duplicate_entity.py +0 -0
  240. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  241. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_never_surfaced.py +0 -0
  242. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_scan.py +0 -0
  243. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_stale_instructions.py +0 -0
  244. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_doctor_unratified_accept.py +0 -0
  245. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_domains.py +0 -0
  246. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_entity_duplicate_resolution.py +0 -0
  247. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_entity_get_or_create_race.py +0 -0
  248. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_fact_reachability_gate.py +0 -0
  249. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_flow_profile.py +0 -0
  250. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_git_bindings_blame.py +0 -0
  251. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_git_bindings_hook.py +0 -0
  252. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_git_bindings_provenance.py +0 -0
  253. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_host_claude_settings.py +0 -0
  254. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_host_drift_nudge.py +0 -0
  255. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_host_pretool.py +0 -0
  256. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_host_session_key.py +0 -0
  257. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_host_session_start.py +0 -0
  258. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_host_stop.py +0 -0
  259. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_host_touch_events.py +0 -0
  260. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_importer.py +0 -0
  261. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_mind_model_additive_fields.py +0 -0
  262. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_okf.py +0 -0
  263. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_openspec_profile.py +0 -0
  264. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  265. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  266. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_proposal_lifecycle.py +0 -0
  267. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  268. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_ratify_policy.py +0 -0
  269. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_community_labels.py +0 -0
  270. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_doc_nodes.py +0 -0
  271. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_graph.py +0 -0
  272. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_integration.py +0 -0
  273. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_nodes_in_file.py +0 -0
  274. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_perf.py +0 -0
  275. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_rationale.py +0 -0
  276. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_read.py +0 -0
  277. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_resolve.py +0 -0
  278. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_subdir_mismatch.py +0 -0
  279. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_reader_version.py +0 -0
  280. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_redaction_seeded.py +0 -0
  281. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_repoint_integration.py +0 -0
  282. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_budget_counters.py +0 -0
  283. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_context.py +0 -0
  284. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_drift_marker.py +0 -0
  285. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_drilldown.py +0 -0
  286. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_facts.py +0 -0
  287. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_ids.py +0 -0
  288. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_integration.py +0 -0
  289. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_rank.py +0 -0
  290. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_seeds.py +0 -0
  291. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_shown_ids.py +0 -0
  292. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  293. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_thin_tools.py +0 -0
  294. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_toc.py +0 -0
  295. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_toptier.py +0 -0
  296. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_retrieval_unratified.py +0 -0
  297. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_schema_descriptor.py +0 -0
  298. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_schema_domain.py +0 -0
  299. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_schema_fact.py +0 -0
  300. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_add_anchors.py +0 -0
  301. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_anchoring.py +0 -0
  302. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_capture.py +0 -0
  303. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_coverage_events.py +0 -0
  304. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_domains.py +0 -0
  305. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_drilldown.py +0 -0
  306. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_facts.py +0 -0
  307. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_find_entity.py +0 -0
  308. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_get_store.py +0 -0
  309. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_get_task_context.py +0 -0
  310. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_import.py +0 -0
  311. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_mcp_smoke.py +0 -0
  312. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_ratify_facts.py +0 -0
  313. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_redaction.py +0 -0
  314. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_render_events.py +0 -0
  315. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_supersede.py +0 -0
  316. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_sync_anchors.py +0 -0
  317. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_telemetry.py +0 -0
  318. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_thin_tools.py +0 -0
  319. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_server_verify.py +0 -0
  320. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_stats_graph.py +0 -0
  321. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_stats_model.py +0 -0
  322. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_stats_render.py +0 -0
  323. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_stats_skill.py +0 -0
  324. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_stats_snapshot.py +0 -0
  325. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store.py +0 -0
  326. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  327. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_canonical_stat.py +0 -0
  328. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_compact.py +0 -0
  329. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_compact_review.py +0 -0
  330. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_concurrent_open.py +0 -0
  331. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_coverage_telemetry.py +0 -0
  332. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_derived_community.py +0 -0
  333. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_domains.py +0 -0
  334. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_entities.py +0 -0
  335. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_fact_cascade.py +0 -0
  336. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_facts.py +0 -0
  337. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_meta.py +0 -0
  338. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_mutation_guard.py +0 -0
  339. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_mutation_immediate.py +0 -0
  340. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  341. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_persistence.py +0 -0
  342. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_ratification.py +0 -0
  343. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_rebuild_atomicity.py +0 -0
  344. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_render_events.py +0 -0
  345. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_retrieval.py +0 -0
  346. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_slug_conflicts.py +0 -0
  347. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_stamping_marker.py +0 -0
  348. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_telemetry.py +0 -0
  349. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_threading.py +0 -0
  350. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_store_tmp_sweep_age.py +0 -0
  351. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_clean.py +0 -0
  352. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_domains.py +0 -0
  353. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_drift_cache.py +0 -0
  354. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_fresh_clone.py +0 -0
  355. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_integration.py +0 -0
  356. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_rebind.py +0 -0
  357. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_repoint.py +0 -0
  358. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_report_has_findings.py +0 -0
  359. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_run.py +0 -0
  360. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_toc_cache.py +0 -0
  361. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_volatile_heal.py +0 -0
  362. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_sync_wiring.py +0 -0
  363. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_telemetry_retention.py +0 -0
  364. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_verify_snapshot.py +0 -0
  365. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_viz_asset_packaged.py +0 -0
  366. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_viz_model.py +0 -0
  367. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_viz_render_html.py +0 -0
  368. {sidegraph-0.3.1 → sidegraph-0.5.0}/tests/test_viz_render_json.py +0 -0
@@ -105,7 +105,6 @@ jobs:
105
105
  exit 0
106
106
  fi
107
107
  uv sync --locked
108
- git fetch origin "$GITHUB_BASE_REF"
109
108
  base="$(git merge-base "origin/$GITHUB_BASE_REF" HEAD)"
110
109
  uv run sidegraph-verify --against "$base" --json
111
110
 
@@ -7,6 +7,86 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.0] — 2026-09-23
11
+
12
+ ### Changed
13
+
14
+ - **The public `main`, which the plugin manifests install from, moves only at releases.**
15
+ The plugin runs whatever `main` holds, so a snapshot pushed between releases used to reach
16
+ every plugin user at once. The release script now pushes `main` only for a release: it
17
+ refuses unless the version it carries is untagged in the public repository and
18
+ `CHANGELOG.md` dates it.
19
+
20
+ ### Fixed
21
+
22
+ - **`sidegraph-init` now says to restart the Claude Code session after it writes
23
+ `SIDEGRAPH_RATIFY_POLICY`.** The Sidegraph MCP server reads the policy from the
24
+ environment it started with, so a server started before `sidegraph-init` kept proposing
25
+ under the old policy until the session restarted, and nothing said so.
26
+ - **`sidegraph-verify --against` no longer flags a ratification of an already-committed
27
+ proposal, or a supersede/drop that touches a record written before a later schema addition
28
+ (`Provenance.commit`, `Domain.seed_anchors`/`path_prefixes`) existed.** Ratifying a
29
+ decision, fact, or domain stamps `ratified_at`/`ratified_by`, and neither field was on the
30
+ transition layer's mutable allow-list, so the stamp alone was reported as an illegal field
31
+ change. Separately, rewriting an old record that predates a field added to its schema
32
+ serializes that field back in as its default, which a plain top-level or whole-list
33
+ comparison also read as a change. The ratifier stamp may now be set once, from a proposed
34
+ record, landing on any state reached through accepted within the diffed range; an absent
35
+ field now counts as the same value as an explicit `null` or an empty list/object, at every
36
+ nesting depth and inside list items. A field whose default is a non-empty value is not
37
+ covered by this.
38
+ - **`sidegraph-import --docs` no longer aborts on a file that is not valid UTF-8.** It
39
+ decoded every document as strict UTF-8 with no handler, so one document saved in
40
+ `cp1251` (or carrying a stray non-UTF-8 byte) raised and stopped the whole run, with
41
+ nothing after it imported and no report printed. The file is now a named skip
42
+ (`skipped_undecodable`) instead: the run continues, and both the real run and
43
+ `--dry-run` print the skipped path(s), last.
44
+ - **`sidegraph-import --docs` now reads a UTF-8 document that starts with a byte-order mark
45
+ (BOM).** The BOM used to survive into the parsed text, so the H1 and any frontmatter never
46
+ matched, and a real decision document was silently counted `skipped_not_decision`. It is
47
+ now stripped before parsing. `sidegraph-bootstrap` still reads such a file without
48
+ stripping it.
49
+
50
+ Re-importing a BOM document that an earlier version did import can change its record,
51
+ once:
52
+ - On the `openspec` profile, a BOM `proposal.md` had imported under a title built from its
53
+ path. The re-import supersedes it with the real H1 title.
54
+ - Frontmatter the BOM hid is now honoured. A document marked `status: superseded` now
55
+ counts `skipped_superseded_frontmatter`, and its earlier live record stays as it is.
56
+ - A document marked as a draft, proposed, pending or under review keeps its earlier
57
+ `accepted` record: a re-import compares content, not status, and the content is
58
+ unchanged.
59
+
60
+ Retiring or re-proposing such a record is manual.
61
+
62
+ ### Security
63
+
64
+ - **The lockfile moves `anyio` from 4.14.1 to 4.15.1**, past three advisories fixed in
65
+ 4.14.2: TLS certificate spoofing through IDNA 2003 host-name encoding (critical),
66
+ `run_process` keeping the parent's supplementary groups (high), and process-pool workers
67
+ blocking on undrained stderr (moderate). The published package does not pin `anyio`, so
68
+ this changes development and CI environments and installs made from `uv.lock`; a fresh
69
+ install already resolves a fixed version.
70
+
71
+ ## [0.4.0] — 2026-09-22
72
+
73
+ ### Fixed
74
+
75
+ - **`supersede_decision` no longer half-applies when an anchor is invalid.** It wrote the
76
+ successor and closed the predecessor before checking the anchors, so an illegal `relation`
77
+ left an accepted successor with none, or only some, of its bindings: wholly or partly
78
+ invisible to task-seeded retrieval, and permanent in an append-only store. An anchor list
79
+ in which no anchor had a `name` reached the same state without any error.
80
+ - **All five anchor-taking tools (`add_decision`, `supersede_decision`, `add_fact`,
81
+ `supersede_fact`, `add_anchors`) now validate the whole anchor list before their first
82
+ write.** An illegal `relation` is now rejected on every path; `supersede_decision` used to
83
+ accept it silently when no graph was present or the anchor had no `name`. Two cases are
84
+ newly rejected. The first is a `name` or `file_path` that is not a string, which used to
85
+ half-write on the fact paths and `add_anchors`, and on the decision paths whenever a graph
86
+ was present. The second is a non-empty list in which no anchor has a `name`, which used to
87
+ succeed while binding nothing. On `add_fact` it also bypassed the check that an anchorless
88
+ fact supports a live decision.
89
+
10
90
  ## [0.3.1] — 2026-09-19
11
91
 
12
92
  ### Fixed
@@ -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.3.1) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.5.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.3.1
3
+ Version: 0.5.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
@@ -63,11 +63,11 @@ Works cold: no existing ADRs required. No API key — the core loop is fully loc
63
63
 
64
64
  ```bash
65
65
  # 1. Install the graph engine and build a graph over your repo (code or markdown)
66
- uv tool install graphifyy # double "y" — that's the PyPI name; CLI is `graphify`
66
+ uv tool install "graphifyy==0.9.6" # double "y" — that's the PyPI name; CLI is `graphify`
67
67
  cd /path/to/your/repo && graphify update .
68
68
  ```
69
69
 
70
- `[mcp]` is an **optional** extra on `graphifyy` (`uv tool install "graphifyy[mcp]"`) — it adds
70
+ `[mcp]` is an **optional** extra on `graphifyy` (`uv tool install "graphifyy[mcp]==0.9.6"`) — it adds
71
71
  Graphify's *own* MCP server, a deeper structure-query layer over the same graph. Sidegraph
72
72
  only ever reads `graph.json`, so the plain install above is all it needs.
73
73
 
@@ -84,14 +84,16 @@ only ever reads `graph.json`, so the plain install above is all it needs.
84
84
  uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
85
85
  sidegraph-init
86
86
 
87
- # Prefer the latest unreleased build straight from git instead of PyPI? Swap step 3 for:
87
+ # Prefer running straight from git instead of PyPI? Swap step 3 for:
88
88
  # uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-init
89
- # `@main` is a mutable ref — it moves under you. Pin a tag or a SHA for CI.
89
+ # `@main` moves only when a release is cut. It is still a mutable ref: a later cache refresh can
90
+ # install a newer one. Pin a tag or a SHA for CI.
90
91
  ```
91
92
 
92
93
  4. **Name your domains** — turns the graph's communities into a described table of
93
94
  contents. Tell your agent *"name my domains"* (or run `/sidegraph:name-domains`) and
94
- pick one of the 2–3 ready-made sets it proposes. CLI alternative for scripted/CI use:
95
+ review its proposed grouping (larger graphs may get 2–3 alternatives). CLI alternative
96
+ for scripted/CI use:
95
97
  `sidegraph-domains bootstrap` + `sidegraph-ratify` —
96
98
  see [naming your domains](docs/guides/naming-your-domains.md).
97
99
 
@@ -35,11 +35,11 @@ Works cold: no existing ADRs required. No API key — the core loop is fully loc
35
35
 
36
36
  ```bash
37
37
  # 1. Install the graph engine and build a graph over your repo (code or markdown)
38
- uv tool install graphifyy # double "y" — that's the PyPI name; CLI is `graphify`
38
+ uv tool install "graphifyy==0.9.6" # double "y" — that's the PyPI name; CLI is `graphify`
39
39
  cd /path/to/your/repo && graphify update .
40
40
  ```
41
41
 
42
- `[mcp]` is an **optional** extra on `graphifyy` (`uv tool install "graphifyy[mcp]"`) — it adds
42
+ `[mcp]` is an **optional** extra on `graphifyy` (`uv tool install "graphifyy[mcp]==0.9.6"`) — it adds
43
43
  Graphify's *own* MCP server, a deeper structure-query layer over the same graph. Sidegraph
44
44
  only ever reads `graph.json`, so the plain install above is all it needs.
45
45
 
@@ -56,14 +56,16 @@ only ever reads `graph.json`, so the plain install above is all it needs.
56
56
  uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
57
57
  sidegraph-init
58
58
 
59
- # Prefer the latest unreleased build straight from git instead of PyPI? Swap step 3 for:
59
+ # Prefer running straight from git instead of PyPI? Swap step 3 for:
60
60
  # uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-init
61
- # `@main` is a mutable ref — it moves under you. Pin a tag or a SHA for CI.
61
+ # `@main` moves only when a release is cut. It is still a mutable ref: a later cache refresh can
62
+ # install a newer one. Pin a tag or a SHA for CI.
62
63
  ```
63
64
 
64
65
  4. **Name your domains** — turns the graph's communities into a described table of
65
66
  contents. Tell your agent *"name my domains"* (or run `/sidegraph:name-domains`) and
66
- pick one of the 2–3 ready-made sets it proposes. CLI alternative for scripted/CI use:
67
+ review its proposed grouping (larger graphs may get 2–3 alternatives). CLI alternative
68
+ for scripted/CI use:
67
69
  `sidegraph-domains bootstrap` + `sidegraph-ratify` —
68
70
  see [naming your domains](docs/guides/naming-your-domains.md).
69
71
 
@@ -16,9 +16,10 @@ Sidegraph is a local-only tool. Its entire data surface:
16
16
  (`.sidegraph/` by convention) — small, human-readable JSON record files meant to be
17
17
  committed to your repo, a derived and gitignored `index.db` (a local SQLite index
18
18
  rebuilt from those files for fast queries, never itself committed), a committed format
19
- marker, and a `.gitignore` the store writes for itself. Opening a pre-0.4.0 single-file
20
- store (`decisions.db`) triggers a one-time migration that renames the legacy file to
21
- `decisions.db.migrated-backup` (kept, never deleted) alongside writing the new
19
+ marker, and a `.gitignore` the store writes for itself. Opening a legacy single-file
20
+ store (`decisions.db`, from before store schema 0.4.0) triggers a one-time migration
21
+ that renames the legacy file to `decisions.db.migrated-backup` (kept, never deleted)
22
+ alongside writing the new
22
23
  directory layout. Outside `.sidegraph/`, the only filesystem writes are the standard
23
24
  config snippets you install yourself (`.mcp.json`, hook entries) — Sidegraph touches
24
25
  nothing else. See [`docs/reference/store-format.md`](docs/reference/store-format.md)
@@ -0,0 +1,56 @@
1
+ # Sidegraph documentation
2
+
3
+ Sidegraph stores durable decisions and non-derivable facts beside the repository they
4
+ describe. Start with the task you have now; [`llms.txt`](llms.txt) is the flat index for an
5
+ agent.
6
+
7
+ ## Install and prove it works
8
+
9
+ 1. [Install Sidegraph and Graphify](getting-started/installation.md).
10
+ 2. Follow the [end-to-end quickstart](getting-started/quickstart.md).
11
+ 3. Use the recommended host path for [Claude Code](getting-started/claude-code-setup.md) or
12
+ [Codex](getting-started/codex-setup.md).
13
+ 4. Run the [four-case verification checklist](guides/verifying-your-setup.md).
14
+
15
+ If the repository already has ADRs or specs, use the
16
+ [preview-first bootstrap](getting-started/bootstrap.md) after installation.
17
+
18
+ ## Use it during normal work
19
+
20
+ - [Retrieve context before editing](guides/retrieval-in-sessions.md).
21
+ - [Capture decisions and supporting facts](guides/capturing-decisions.md).
22
+ - [Name domains for the SessionStart table of contents](guides/naming-your-domains.md).
23
+ - [Share and review the store as a team](guides/team-workflow.md).
24
+
25
+ ## Operate and maintain it
26
+
27
+ - [Survive refactors and heal anchors](guides/surviving-refactors.md).
28
+ - [Run CI and scheduled maintenance](guides/ci-cd-maintenance.md).
29
+ - [Import decision-shaped documents](guides/semantic-docs.md).
30
+ - [See runtime cost and operational boundaries](reference/operations.md).
31
+ - [Cut a Sidegraph release](reference/releasing.md) (maintainers).
32
+
33
+ The [pilot kit](pilot-kit/README.md) is an evaluation protocol for teams deciding whether to
34
+ adopt Sidegraph. The engineering whitepaper is generated in the published snapshot at
35
+ [`docs/whitepaper/index.md`](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/whitepaper/index.md);
36
+ it is optional background on evidence, limits, and repository fit.
37
+
38
+ ## Understand the model
39
+
40
+ - [Decision memory](concepts/decision-memory.md) — what belongs in the store.
41
+ - [Mind model](concepts/mind-model.md) — domains, TOC, and drill-down.
42
+ - [Data model](concepts/data-model.md) — persisted record shapes.
43
+ - [Anchoring](concepts/anchoring.md) — how records stay attached to code and docs.
44
+ - [Retrieval](concepts/retrieval.md) — ranking, trust quarantine, and budgets.
45
+
46
+ ## Look up an exact contract
47
+
48
+ - [MCP tools](reference/mcp-tools.md)
49
+ - [CLI](reference/cli.md)
50
+ - [Hooks](reference/hooks.md)
51
+ - [Configuration](reference/configuration.md)
52
+ - [Store format](reference/store-format.md)
53
+ - [Stability levels](reference/stability.md)
54
+ - [Git bindings](reference/git-bindings.md)
55
+ - Integrations: [Claude Code](integrations/claude-code.md),
56
+ [Codex](integrations/codex.md), [Graphify](integrations/graphify.md)
@@ -254,20 +254,24 @@ written; a garbled row raises and leaves the legacy file untouched) into the can
254
254
  file-per-record layout, stamped at the running code's current `SCHEMA_VERSION`; the legacy
255
255
  file is renamed to `<name>.migrated-backup` (never deleted) rather than removed. Both `0.2.0`
256
256
  and `0.3.0` sources go through this same export, not a stamp-only rewrite — see
257
- [store format: migration to 0.4.0](../reference/store-format.md#migration-to-040-from-02x-and-03x)
257
+ [store format: migration to schema 0.4.0](../reference/store-format.md#migration-to-schema-040-from-schema-02x-and-03x)
258
258
  for the full four-step sequence. Any other mismatch (a version older than `0.2.0`, a
259
259
  newer/future version, or an unrecognized string) is a hard rejection: use a fresh store.
260
260
 
261
261
  ## `Initiative` — the Tier-0 grouping container
262
262
 
263
- Not a record type in its own right: a flat label a decision can be bound to at tier 0, so
264
- "everything decided during the retry-hardening work" is retrievable as a set even when
265
- those decisions touch unrelated code. Created implicitly at capture (a draft's
266
- `initiative` field, or the git branch name when one is not given).
263
+ The high-level capture APIs use an initiative as a flat Tier-0 abstract entity named
264
+ `initiative:<label>`. Passing a draft's `initiative` field creates that entity and binding;
265
+ omitting it creates neither. Capture may derive the label from a branch before it reaches
266
+ this step, but the storage layer does not do so implicitly.
267
+
268
+ The `Initiative` model below is a separate low-level persisted record supported by
269
+ `Store.upsert_initiative`. Current MCP capture paths do not create one, so do not expect an
270
+ `initiatives/<id>.json` file merely because a decision has an `initiative:*` binding.
267
271
 
268
272
  | Field | Type | Meaning |
269
273
  |---|---|---|
270
274
  | `id` | ULID | Record identity. |
271
275
  | `name` | str | The label as written at capture — a branch name or a short phrase. |
272
276
  | `description` | str \| `null` | Optional one-liner; usually absent for branch-derived initiatives. |
273
- | `tags` | list[str] | Free-text tags, slugified into `tag:<slug>` entities like a decision's own. |
277
+ | `tags` | list[str] | Stored strings on the low-level record; `upsert_initiative` does not slugify them or create `tag:*` entities. |
@@ -187,7 +187,7 @@ Three ways to group decisions across entities exist now, and they answer differe
187
187
  |---|---|---|---|
188
188
  | **Tag** (`tag:<slug>`) | "which decisions carry this cross-cutting label?" | a bare slug, no prose | none — get-or-create, no ratification, no supersession |
189
189
  | **Domain** | "what is this named area of the system, and what do I need to know about it?" | slug + title + required WHY-IT-EXISTS summary + optional parent/communities/path_prefixes | full record: proposed → accepted, append-only supersession to revise |
190
- | **Initiative** | "which decisions belong to this piece of work?" | a name + optional description | flat container, no ratification gate of its own |
190
+ | **Initiative** (`initiative:<label>`) | "which decisions belong to this piece of work?" | a Tier-0 label on captured decisions | flat grouping, no ratification gate of its own |
191
191
 
192
192
  A tag is the cheapest of the three — free-form text slugified into a durable entity at capture
193
193
  (`add_decision(tags=[...])`, or a draft's `tags` field), many-to-many, tier-0, no lifecycle to
@@ -196,7 +196,8 @@ describing *why performance work exists here* — that's what a domain's summary
196
196
  domain is the only one of the three that is itself ratified content: it has a required summary,
197
197
  it can be superseded, and it is what the TOC and `drill_down` are built from. An initiative
198
198
  groups decisions around a unit of *work* (a branch, a project) rather than a unit of the
199
- *system* — it has no summary field and nothing renders a description-first view of it the way
199
+ *system*. Current capture paths implement it as an abstract entity and binding, not as an
200
+ `Initiative` record with a description; nothing renders a description-first view of it the way
200
201
  `drill_down` does for a domain.
201
202
 
202
203
  ## See also
@@ -55,12 +55,12 @@ at two points:
55
55
  rebuild it.
56
56
  2. **Every `ratify` call (MCP tool or `sidegraph-ratify` CLI) that actually accepted or dropped
57
57
  at least one domain** — immediately, without waiting for the next sync. This is what makes
58
- `bootstrap → ratify` visibly turn the TOC on in the very same session: a lazy sync alone
59
- only refreshes `last_synced_graph_version`, never the TOC cache, so without this the domain
60
- layer would look inert until the next real graph rebuild.
58
+ `bootstrap → ratify` visibly turn the TOC on in the very same session, even when no graph
59
+ sync is needed.
61
60
 
62
- A decisions-only ratify (no domain ids in the batch) leaves the cache untouched — it wouldn't
63
- change the TOC anyway.
61
+ A decisions-only ratify (no domain ids in the batch) does not rebuild the cache immediately.
62
+ It can change a rendered mistake count; the next completed or skipped sync refreshes that
63
+ count. Domain acceptance is the special case refreshed in the ratify operation itself.
64
64
 
65
65
  ## `drill_down(domain_slug)` — the Axis-1 operation
66
66
 
@@ -104,8 +104,10 @@ render actually deliver on real ADR-scale content instead of dropping it.)
104
104
 
105
105
  ### Ranking buckets, and why mistakes come first
106
106
 
107
- Decisions are gathered from seeds outward and ranked into ordered buckets, each sorted by
108
- recency (`valid_from` descending) within itself:
107
+ Decisions are gathered from seeds outward and ranked into ordered buckets. Each source list
108
+ (a seed entity, community/domain, peripheral entity, or global scope) is sorted by recency
109
+ before it is appended; the implementation does not perform a second global recency sort across
110
+ all sources in the same bucket.
109
111
 
110
112
  | Bucket | Section | Contents |
111
113
  |---|---|---|
@@ -154,20 +156,19 @@ not the other way around.
154
156
  A `Fact` rides the same `memory_chars` budget as decisions, spent strictly after them, in two
155
157
  forms:
156
158
 
157
- - **Inline evidence.** In buckets B-D, the moment a decision line is placed
158
- (`rank_decisions.add()`), its live supporting facts (`store.facts_for_decision` — "live" =
159
- status `accepted` or `proposed`, `valid_to` unset; a `superseded` fact never renders
160
- inline, only its successor does, via its own anchors) render immediately as adjacent
161
- ` evidence: <statement> [<source>]` lines directly under that decision, tagged
162
- `[unratified]` when still `proposed` (a decision line can also carry `[drifted]` — see
163
- the code-drift marker below). Bucket A (mistakes) defers this to a second pass
159
+ - **Inline evidence.** In buckets B-D, the moment an accepted decision line is placed
160
+ (`rank_decisions.add()`), its live **accepted** supporting facts render immediately as
161
+ adjacent ` evidence: <statement> [<source>]` lines. A live proposed supporting fact is
162
+ quarantined in the final **Unratified proposals** section instead; a superseded fact does
163
+ not render. Bucket A (mistakes) defers accepted evidence to a second pass
164
164
  instead of rendering it immediately — see the mistakes-budget guarantee below for why.
165
165
  Either way, evidence lines degrade/drop with their decision under budget pressure — a fact
166
166
  only ever renders next to a decision that itself made the cut.
167
167
  - **The Known-facts bucket** (`## Known facts`, rendered right after `## Decisions`, ahead of
168
- the structural map). Standalone facts — ones not already rendered inline under a decision
169
- above — bound to a seed or peripheral entity, walked in the same seed-then-peripheral order
170
- every other bucket uses, sorted by fact id for determinism. Populated only AFTER every
168
+ the structural map). Accepted standalone facts — ones not already rendered inline under a
169
+ decision above — bound to a seed or peripheral entity, walked in the same
170
+ seed-then-peripheral order every other bucket uses, sorted by fact id for determinism.
171
+ Proposed facts go to **Unratified proposals**. This bucket is populated only AFTER every
171
172
  decision bucket (A-D) and the superseded one-liners have already had first claim on the
172
173
  budget.
173
174
 
@@ -304,9 +305,10 @@ too (see [mind model](mind-model.md#how-domains-relate-to-engine-communities)).
304
305
  ### Rendering
305
306
 
306
307
  `TaskContext.render()` emits, in order: **Known mistakes & gotchas**, **Decisions** (with any
307
- inline `evidence:` lines nested under the decision they support), **Known facts** (standalone
308
- facts — see above), **Structural map** (the budgeted subgraph around the seeds, rendered as
309
- pointers — `- name (file_type) [file_path:line]`, never inlined code), then **Related**.
308
+ accepted inline `evidence:` lines nested under the decision they support), **Known facts**
309
+ (accepted standalone facts — see above), **Structural map** (the budgeted subgraph around the
310
+ seeds, rendered as pointers — `- name (file_type) [file_path:line]`, never inlined code),
311
+ **Related**, then **Unratified proposals**.
310
312
  Missing sections are omitted; an empty result renders `"No context found."`.
311
313
 
312
314
  ## See also
@@ -152,12 +152,8 @@ supported-document path against it:
152
152
  > cannot run today. This is the intended reproduction path once it ships; there is no working
153
153
  > substitute before then.
154
154
 
155
- > **`@main` is a mutable ref.** Every `git+…@main` command on this page tracks the
156
- > branch: what you install today is not what you installed yesterday, and a `uvx` cache
157
- > refresh can change it under you. Fine for trying Sidegraph out; for anything you depend
158
- > on — CI, a shared team setup, a pilot you intend to measure — replace `@main` with a
159
- > commit SHA (`git+https://github.com/SantyagoSeaman/sidegraph@<sha>`) so the version is a
160
- > decision you made rather than whatever HEAD happened to be. See [`reference/stability.md`](../reference/stability.md) for what each surface promises.
155
+ This command follows the current development branch. For durable environments, see
156
+ [how to pin mutable development references](installation.md#mutable-development-references).
161
157
 
162
158
  ```bash
163
159
  git clone --branch demo https://github.com/SantyagoSeaman/sidegraph.git sidegraph-demo
@@ -13,12 +13,8 @@ Run these in the repo you want memory over (not the Sidegraph checkout).
13
13
 
14
14
  Inside a Claude Code session, in that repo:
15
15
 
16
- > **`@main` is a mutable ref.** Every `git+…@main` command on this page tracks the
17
- > branch: what you install today is not what you installed yesterday, and a `uvx` cache
18
- > refresh can change it under you. Fine for trying Sidegraph out; for anything you depend
19
- > on — CI, a shared team setup, a pilot you intend to measure — replace `@main` with a
20
- > commit SHA (`git+https://github.com/SantyagoSeaman/sidegraph@<sha>`) so the version is a
21
- > decision you made rather than whatever HEAD happened to be. See [`reference/stability.md`](../reference/stability.md) for what each surface promises.
16
+ The commands below follow the current development branch. For durable environments, see
17
+ [how to pin mutable development references](installation.md#mutable-development-references).
22
18
 
23
19
  ```
24
20
  /plugin marketplace add SantyagoSeaman/sidegraph
@@ -73,10 +69,10 @@ flag if you want a private, user-local registration instead.
73
69
  `uv run --project /ABSOLUTE/PATH/TO/sidegraph sidegraph-mcp` (CLI form: `-- uv run --project
74
70
  /ABSOLUTE/PATH/TO/sidegraph sidegraph-mcp`).
75
71
 
76
- > **Once Sidegraph is published to PyPI**, both shorten further, to `uvx --from sidegraph
77
- > sidegraph-mcp` — see
78
- > [`integrations/claude-code.md`](../integrations/claude-code.md#plugin-install-path)
79
- > for the pin-at-1.0 policy.
72
+ The released package is available from PyPI, so both shorten further, to `uvx --from
73
+ sidegraph sidegraph-mcp` — see
74
+ [`integrations/claude-code.md`](../integrations/claude-code.md#plugin-install-path)
75
+ for the pinning policy. Use `sidegraph==X.Y.Z` in automation.
80
76
 
81
77
  The store (`SIDEGRAPH_DIR`) is meant to live **inside the repo it documents** — commit
82
78
  `.sidegraph/` alongside your code (its committed record directories, not the gitignored
@@ -17,12 +17,8 @@ and AGENTS.md registered separately, for fine control or a source checkout).
17
17
 
18
18
  Inside a Codex CLI session, in that repo:
19
19
 
20
- > **`@main` is a mutable ref.** Every `git+…@main` command on this page tracks the
21
- > branch: what you install today is not what you installed yesterday, and a `uvx` cache
22
- > refresh can change it under you. Fine for trying Sidegraph out. For anything you depend
23
- > on, such as CI, a shared team setup, or a pilot you intend to measure, replace `@main`
24
- > with a commit SHA (`git+https://github.com/SantyagoSeaman/sidegraph@<sha>`) so the version
25
- > is a decision you made rather than whatever HEAD happened to be. See [`reference/stability.md`](../reference/stability.md) for what each surface promises.
20
+ The commands below follow the current development branch. For durable environments, see
21
+ [how to pin mutable development references](installation.md#mutable-development-references).
26
22
 
27
23
  ```
28
24
  /plugin marketplace add SantyagoSeaman/sidegraph
@@ -47,7 +43,7 @@ Skip to [Verify](#verify) once installed.
47
43
 
48
44
  ## Option B: manual registration
49
45
 
50
- Prefer explicit `config.toml`/`.codex/hooks/hooks.json` files (e.g. for review in a PR), or
46
+ Prefer explicit `.codex/config.toml`/`.codex/hooks.json` files (e.g. for review in a PR), or
51
47
  want to point at a source checkout? Register the pieces yourself.
52
48
 
53
49
  ### 1. Register the MCP server
@@ -58,7 +54,7 @@ Via the CLI:
58
54
  codex mcp add sidegraph -- bash -lc "cd /ABSOLUTE/PATH/TO/your-repo && SIDEGRAPH_DIR=.sidegraph SIDEGRAPH_GRAPH=graphify-out/graph.json uv run --project /ABSOLUTE/PATH/TO/sidegraph sidegraph-mcp"
59
55
  ```
60
56
 
61
- Or add directly to `~/.codex/config.toml`:
57
+ Or add it to the repo's `.codex/config.toml` (recommended for project-specific setup):
62
58
 
63
59
  ```toml
64
60
  [mcp_servers.sidegraph]
@@ -69,9 +65,10 @@ args = [
69
65
  ]
70
66
  ```
71
67
 
72
- `config.toml` is a single global file, not per-project, so the `cd` wrapper pins each
73
- registration to the repo whose `.sidegraph/` it should read — use a distinct
74
- `[mcp_servers.*]` name per repo if you wire up more than one.
68
+ Codex also reads `~/.codex/config.toml`. Use the project file when the registration belongs
69
+ to this repository; use the global file only when you intentionally want the server in every
70
+ project. The `cd` wrapper remains useful in either scope because Sidegraph's relative paths
71
+ must resolve against the repository whose memory it serves.
75
72
 
76
73
  ### 2. Tell the agent about Sidegraph
77
74
 
@@ -89,7 +86,7 @@ first. When you make a real decision or hit a hard-won gotcha, call `propose_dec
89
86
 
90
87
  ### 3. Add the hooks
91
88
 
92
- Create `.codex/hooks/hooks.json` in the repo:
89
+ Create `.codex/hooks.json` in the repo:
93
90
 
94
91
  ```json
95
92
  {
@@ -125,9 +122,9 @@ working on a non-git corpus too (Sidegraph doesn't require the corpus to be a gi
125
122
  [`integrations/graphify.md`](../integrations/graphify.md#non-git-and-doc-only-corpora)), where a
126
123
  bare `git rev-parse --show-toplevel` would fail and leave `cd` with no argument.
127
124
 
128
- No `PreToolUse` entry is included above: Codex CLI's `PreToolUse` event (as of this writing)
129
- only intercepts Bash/patch/MCP tool calls, not file-read tools like `Read`/`Grep`, so Claude
130
- Code's Read/Grep redirect nudge
125
+ No `PreToolUse` entry is included above. Codex can invoke that event for local function tools,
126
+ but it has no stable `Read`/`Grep` tool pair to which Sidegraph's Claude-specific redirect can
127
+ attach. Therefore Claude Code's Read/Grep redirect nudge
131
128
  (`sidegraph-pre-tool-use`) has no Codex counterpart to wire up yet — see
132
129
  [`integrations/codex.md`](../integrations/codex.md) for details.
133
130