sidegraph 0.19.0__tar.gz → 0.21.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 (636) hide show
  1. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/workflows/ci.yml +66 -5
  2. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/workflows/session-link-gate.yml +1 -1
  3. {sidegraph-0.19.0 → sidegraph-0.21.0}/CHANGELOG.md +71 -0
  4. {sidegraph-0.19.0 → sidegraph-0.21.0}/CLAUDE.md +1 -1
  5. {sidegraph-0.19.0 → sidegraph-0.21.0}/CONTRIBUTING.md +3 -1
  6. {sidegraph-0.19.0 → sidegraph-0.21.0}/PKG-INFO +2 -1
  7. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/anchoring.md +3 -0
  8. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/data-model.md +24 -1
  9. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/bootstrap.md +15 -7
  10. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/installation.md +4 -2
  11. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/capturing-decisions.md +3 -0
  12. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/retrieval-in-sessions.md +5 -2
  13. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/troubleshooting.md +11 -3
  14. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/cli.md +17 -12
  15. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/configuration.md +1 -1
  16. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/hooks.md +9 -1
  17. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/mcp-tools.md +51 -3
  18. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/releasing.md +12 -6
  19. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/stability.md +3 -3
  20. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/store-format.md +33 -3
  21. {sidegraph-0.19.0 → sidegraph-0.21.0}/package.json +1 -1
  22. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  23. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  24. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.muse-plugin/plugin.json +1 -1
  25. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-decision/SKILL.md +2 -0
  26. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-fact/SKILL.md +2 -1
  27. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +59 -6
  28. {sidegraph-0.19.0 → sidegraph-0.21.0}/pyproject.toml +4 -1
  29. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/__init__.py +1 -1
  30. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/apply.py +1 -0
  31. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/cli.py +26 -6
  32. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/integrations.py +134 -21
  33. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/model.py +1 -0
  34. sidegraph-0.21.0/src/sidegraph/checkout_window.py +169 -0
  35. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/cli.py +71 -29
  36. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/doctor.py +254 -21
  37. sidegraph-0.21.0/src/sidegraph/drift_checks.py +490 -0
  38. sidegraph-0.21.0/src/sidegraph/drift_groups.py +773 -0
  39. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/claude_settings.py +57 -9
  40. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/hooks.py +5 -1
  41. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/integrity.py +33 -5
  42. sidegraph-0.21.0/src/sidegraph/md_sections.py +218 -0
  43. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/retrieval.py +43 -3
  44. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/schema.py +62 -3
  45. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/server.py +205 -9
  46. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store.py +62 -14
  47. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_layout.py +131 -3
  48. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/sync.py +113 -41
  49. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/validation_errors.py +51 -0
  50. sidegraph-0.21.0/tests/drift_groups_support.py +153 -0
  51. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_cli.py +202 -7
  52. sidegraph-0.21.0/tests/test_bootstrap_integrations.py +564 -0
  53. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_unanchored.py +5 -1
  54. sidegraph-0.21.0/tests/test_checkout_window.py +357 -0
  55. sidegraph-0.21.0/tests/test_ci_workflow.py +168 -0
  56. sidegraph-0.21.0/tests/test_claude_plugin_enabled.py +161 -0
  57. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_doctor.py +52 -1
  58. sidegraph-0.21.0/tests/test_cli_store_open_errors.py +130 -0
  59. sidegraph-0.21.0/tests/test_declared_sections_docs.py +54 -0
  60. sidegraph-0.21.0/tests/test_declared_sections_schema.py +136 -0
  61. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_code_drift.py +214 -0
  62. sidegraph-0.21.0/tests/test_doctor_declared_sections.py +499 -0
  63. sidegraph-0.21.0/tests/test_doctor_grouped_drift.py +515 -0
  64. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_record_identity.py +6 -1
  65. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_drift_checks.py +303 -0
  66. sidegraph-0.21.0/tests/test_drift_checks_blobs.py +150 -0
  67. sidegraph-0.21.0/tests/test_drift_groups.py +1040 -0
  68. sidegraph-0.21.0/tests/test_drift_recency.py +127 -0
  69. sidegraph-0.21.0/tests/test_drift_stamp_cache.py +205 -0
  70. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_spawn_guard.py +14 -0
  71. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_drift_nudge.py +79 -4
  72. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_integrity.py +1 -1
  73. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_index.py +7 -0
  74. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity.py +103 -1
  75. sidegraph-0.21.0/tests/test_markdown_it_dependency.py +13 -0
  76. sidegraph-0.21.0/tests/test_md_sections.py +560 -0
  77. sidegraph-0.21.0/tests/test_record_drift_check_sections.py +464 -0
  78. sidegraph-0.21.0/tests/test_record_drift_check_sections_input.py +82 -0
  79. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_validation_errors.py +1 -0
  80. sidegraph-0.21.0/tests/test_store_marker_checkout.py +222 -0
  81. sidegraph-0.21.0/tests/test_store_marker_checkout_race.py +185 -0
  82. sidegraph-0.21.0/tests/test_sync_drift_stamps.py +709 -0
  83. {sidegraph-0.19.0 → sidegraph-0.21.0}/uv.lock +3 -1
  84. sidegraph-0.19.0/src/sidegraph/drift_checks.py +0 -209
  85. sidegraph-0.19.0/tests/test_bootstrap_integrations.py +0 -280
  86. {sidegraph-0.19.0 → sidegraph-0.21.0}/.agents/plugins/marketplace.json +0 -0
  87. {sidegraph-0.19.0 → sidegraph-0.21.0}/.claude-plugin/marketplace.json +0 -0
  88. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/CODEOWNERS +0 -0
  89. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  90. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  91. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  92. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  93. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/secret_scanning.yml +0 -0
  94. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/workflows/publish.yml +0 -0
  95. {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/workflows/scorecard.yml +0 -0
  96. {sidegraph-0.19.0 → sidegraph-0.21.0}/.gitignore +0 -0
  97. {sidegraph-0.19.0 → sidegraph-0.21.0}/.gitleaks.toml +0 -0
  98. {sidegraph-0.19.0 → sidegraph-0.21.0}/.opencode/INSTALL.md +0 -0
  99. {sidegraph-0.19.0 → sidegraph-0.21.0}/.pre-commit-config.yaml +0 -0
  100. {sidegraph-0.19.0 → sidegraph-0.21.0}/.python-version +0 -0
  101. {sidegraph-0.19.0 → sidegraph-0.21.0}/AGENTS.md +0 -0
  102. {sidegraph-0.19.0 → sidegraph-0.21.0}/CODE_OF_CONDUCT.md +0 -0
  103. {sidegraph-0.19.0 → sidegraph-0.21.0}/LICENSE +0 -0
  104. {sidegraph-0.19.0 → sidegraph-0.21.0}/README.md +0 -0
  105. {sidegraph-0.19.0 → sidegraph-0.21.0}/SECURITY.md +0 -0
  106. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/README.md +0 -0
  107. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/decision-memory.md +0 -0
  108. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/mind-model.md +0 -0
  109. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/retrieval.md +0 -0
  110. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/claude-code-setup.md +0 -0
  111. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/codex-setup.md +0 -0
  112. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/quickstart.md +0 -0
  113. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/adr-export.md +0 -0
  114. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/ci-cd-maintenance.md +0 -0
  115. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/health-check.md +0 -0
  116. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/migrating-to-0.14.md +0 -0
  117. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/migrating-to-0.17.md +0 -0
  118. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/naming-your-domains.md +0 -0
  119. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/semantic-docs.md +0 -0
  120. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/surviving-refactors.md +0 -0
  121. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/team-workflow.md +0 -0
  122. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/using-0.15.md +0 -0
  123. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/using-0.16.md +0 -0
  124. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/verifying-your-setup.md +0 -0
  125. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/claude-code.md +0 -0
  126. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/codex.md +0 -0
  127. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/graphify.md +0 -0
  128. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/grok.md +0 -0
  129. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/muse.md +0 -0
  130. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/opencode.md +0 -0
  131. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/llms.txt +0 -0
  132. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/README.md +0 -0
  133. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/corpus_fit.py +0 -0
  134. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/judge-prompt.md +0 -0
  135. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/questions-prompt.md +0 -0
  136. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/rubric-template.md +0 -0
  137. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/git-bindings.md +0 -0
  138. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/operations.md +0 -0
  139. {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/whitepaper/index.md +0 -0
  140. {sidegraph-0.19.0 → sidegraph-0.21.0}/index.js +0 -0
  141. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.mcp.json +0 -0
  142. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/codex/hooks.json +0 -0
  143. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/codex/mcp.json +0 -0
  144. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  145. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  146. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  147. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/compact/SKILL.md +0 -0
  148. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/compact/agents/openai.yaml +0 -0
  149. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  150. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  151. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  152. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  153. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/health-check/SKILL.md +0 -0
  154. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/health-check/agents/openai.yaml +0 -0
  155. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/health-check/scripts/collect.py +0 -0
  156. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  157. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  158. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  159. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  160. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  161. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  162. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  163. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  164. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  165. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  166. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  167. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  168. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  169. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  170. {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  171. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr.py +0 -0
  172. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr_cli.py +0 -0
  173. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr_files.py +0 -0
  174. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr_identity.py +0 -0
  175. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/anchoring.py +0 -0
  176. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bash_paths.py +0 -0
  177. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  178. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  179. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/planner.py +0 -0
  180. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/proof.py +0 -0
  181. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/review.py +0 -0
  182. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/scan.py +0 -0
  183. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/capture.py +0 -0
  184. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/config.py +0 -0
  185. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/delivery.py +0 -0
  186. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/doc_import.py +0 -0
  187. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/domain_snapshot.py +0 -0
  188. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/domains.py +0 -0
  189. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/engine/__init__.py +0 -0
  190. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/engine/rationale.py +0 -0
  191. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/engine/reader.py +0 -0
  192. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/freshness.py +0 -0
  193. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/gitenv.py +0 -0
  194. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/githooks.py +0 -0
  195. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/gitio.py +0 -0
  196. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/__init__.py +0 -0
  197. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/diagnostics.py +0 -0
  198. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/launch.py +0 -0
  199. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/mcp_entry.py +0 -0
  200. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/session_identity.py +0 -0
  201. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/subagent.py +0 -0
  202. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/hot_index.py +0 -0
  203. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/importer.py +0 -0
  204. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/input_limits.py +0 -0
  205. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/maintenance.py +0 -0
  206. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/maintenance_clock.py +0 -0
  207. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/migrate.py +0 -0
  208. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/nearest_anchored.py +0 -0
  209. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/okf.py +0 -0
  210. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/profiles.py +0 -0
  211. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/redaction_scan.py +0 -0
  212. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/redaction_tokens.py +0 -0
  213. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/seed_ladder.py +0 -0
  214. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/stats/__init__.py +0 -0
  215. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/stats/model.py +0 -0
  216. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/stats/render.py +0 -0
  217. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_format.py +0 -0
  218. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_rules.py +0 -0
  219. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_view.py +0 -0
  220. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/text_paths.py +0 -0
  221. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/tool_rate_limit.py +0 -0
  222. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/verify.py +0 -0
  223. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/__init__.py +0 -0
  224. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  225. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/model.py +0 -0
  226. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/render.py +0 -0
  227. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/template.html +0 -0
  228. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/worktree_seeds.py +0 -0
  229. {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/write_boundary.py +0 -0
  230. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/__init__.py +0 -0
  231. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/bounded_listings_support.py +0 -0
  232. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/conftest.py +0 -0
  233. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/drift_checks_support.py +0 -0
  234. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  235. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bitfinex_slice.json +0 -0
  236. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  237. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  238. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  239. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  240. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  241. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/graph.json +0 -0
  242. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  243. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  244. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  245. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  246. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  247. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  248. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  249. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  250. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  251. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  252. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  253. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  254. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  255. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  256. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  257. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  258. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  259. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  260. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  261. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  262. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  263. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  264. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  265. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  266. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design.md +0 -0
  267. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  268. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  269. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  270. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  271. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  272. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  273. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  274. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  275. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  276. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  277. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  278. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  279. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  280. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  281. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  282. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/member_names_python_graph.json +0 -0
  283. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/member_names_swift_graph.json +0 -0
  284. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/mini_graph.json +0 -0
  285. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/githooks_legacy_helper.py +0 -0
  286. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/githooks_support.py +0 -0
  287. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/graph_fixtures.py +0 -0
  288. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/graph_repo_support.py +0 -0
  289. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/membership_support.py +0 -0
  290. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/moved_adoption_support.py +0 -0
  291. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/opencode_plugin_runner.mjs +0 -0
  292. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/snapshot_support.py +0 -0
  293. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/store_format2_support.py +0 -0
  294. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/store_non_file_support.py +0 -0
  295. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/store_record_support.py +0 -0
  296. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_adr.py +0 -0
  297. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_adr_files.py +0 -0
  298. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_adr_identity.py +0 -0
  299. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_agent_brief_manifests.py +0 -0
  300. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchor_descriptor.py +0 -0
  301. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchor_paths.py +0 -0
  302. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchoring.py +0 -0
  303. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  304. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchoring_membership.py +0 -0
  305. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bash_paths.py +0 -0
  306. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_batch_panel_fixes.py +0 -0
  307. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_apply.py +0 -0
  308. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_catalog.py +0 -0
  309. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
  310. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_model.py +0 -0
  311. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_planner.py +0 -0
  312. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_proof.py +0 -0
  313. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_review.py +0 -0
  314. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_scan.py +0 -0
  315. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_scan_regular.py +0 -0
  316. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bounded_listings.py +0 -0
  317. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_auto_accept.py +0 -0
  318. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_facts.py +0 -0
  319. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_initiative.py +0 -0
  320. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_integration.py +0 -0
  321. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_neighbors.py +0 -0
  322. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_propose.py +0 -0
  323. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_redact.py +0 -0
  324. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_adr.py +0 -0
  325. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_compact.py +0 -0
  326. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_compact_format2.py +0 -0
  327. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_domains.py +0 -0
  328. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_domains_snapshot.py +0 -0
  329. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_graph_paths.py +0 -0
  330. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_import.py +0 -0
  331. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_init.py +0 -0
  332. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_init_hooks.py +0 -0
  333. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_okf.py +0 -0
  334. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_ratify.py +0 -0
  335. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_ratify_facts.py +0 -0
  336. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_stats.py +0 -0
  337. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_store_precedence.py +0 -0
  338. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_sync.py +0 -0
  339. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_sync_check.py +0 -0
  340. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_unreadable_paths.py +0 -0
  341. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_viz.py +0 -0
  342. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_codex_plugin.py +0 -0
  343. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_command_windows.py +0 -0
  344. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_community_baseline.py +0 -0
  345. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_compact_skill.py +0 -0
  346. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_config.py +0 -0
  347. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_config_ancestor_lookup.py +0 -0
  348. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_config_borrowed_graph.py +0 -0
  349. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_corpus_expected_renders.py +0 -0
  350. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_corpus_self_corpus.py +0 -0
  351. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  352. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_delivery_evidence.py +0 -0
  353. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_delivery_stats.py +0 -0
  354. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_delivery_surfaces.py +0 -0
  355. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_digest_integrity.py +0 -0
  356. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doc_corpus_integration.py +0 -0
  357. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doc_import.py +0 -0
  358. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_docs_claims.py +0 -0
  359. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor.py +0 -0
  360. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_auto_share.py +0 -0
  361. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_dangling_supports.py +0 -0
  362. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_duplicate_entity.py +0 -0
  363. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  364. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_graph_stale.py +0 -0
  365. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_integrity.py +0 -0
  366. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_never_surfaced.py +0 -0
  367. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_scan.py +0 -0
  368. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_stale_instructions.py +0 -0
  369. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_unhashable_payload.py +0 -0
  370. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_unratified_accept.py +0 -0
  371. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domain_seed_names.py +0 -0
  372. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domain_snapshot_format.py +0 -0
  373. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domain_snapshot_notices.py +0 -0
  374. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domains.py +0 -0
  375. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_engine_build.py +0 -0
  376. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entity_duplicate_resolution.py +0 -0
  377. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entity_get_or_create_race.py +0 -0
  378. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entity_twins.py +0 -0
  379. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entry_point_arguments.py +0 -0
  380. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_env_isolation.py +0 -0
  381. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_fact_reachability_gate.py +0 -0
  382. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_file_bound_retrieval.py +0 -0
  383. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_flow_profile.py +0 -0
  384. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_format2_notices.py +0 -0
  385. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_format2_windows.py +0 -0
  386. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_bindings_blame.py +0 -0
  387. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_bindings_hook.py +0 -0
  388. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_bindings_provenance.py +0 -0
  389. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_env.py +0 -0
  390. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_output_utf8.py +0 -0
  391. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_githooks.py +0 -0
  392. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_githooks_atomic_lock.py +0 -0
  393. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_graph_freshness.py +0 -0
  394. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_graphify_pin.py +0 -0
  395. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_health_check_skill.py +0 -0
  396. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_body_compaction.py +0 -0
  397. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_contention.py +0 -0
  398. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_failure_diagnostics.py +0 -0
  399. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_payload_encoding.py +0 -0
  400. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_showings.py +0 -0
  401. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_agent_brief.py +0 -0
  402. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_agent_state.py +0 -0
  403. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_borrowed_graph.py +0 -0
  404. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_claude_settings.py +0 -0
  405. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_launch.py +0 -0
  406. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_pretool.py +0 -0
  407. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_pretool_records.py +0 -0
  408. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_session_key.py +0 -0
  409. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_session_start.py +0 -0
  410. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_session_start_concurrent.py +0 -0
  411. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_stop.py +0 -0
  412. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_subagent_start.py +0 -0
  413. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_subdirectory_launch.py +0 -0
  414. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_touch_events.py +0 -0
  415. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_wiring_checks.py +0 -0
  416. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_index_facts.py +0 -0
  417. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_index_hook.py +0 -0
  418. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_path_imports.py +0 -0
  419. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_import_dry_run_preview.py +0 -0
  420. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_importer.py +0 -0
  421. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_index_journal_mode.py +0 -0
  422. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_engine_version.py +0 -0
  423. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_refresh_hook.py +0 -0
  424. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_replay.py +0 -0
  425. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_stranded.py +0 -0
  426. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_lazy_root.py +0 -0
  427. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_clock.py +0 -0
  428. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_dry_run_parity.py +0 -0
  429. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_plan.py +0 -0
  430. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_publish.py +0 -0
  431. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_mcp_entry_ratify_policy.py +0 -0
  432. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_mcp_entry_repo_root.py +0 -0
  433. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_member_anchor_wiring.py +0 -0
  434. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_merge_matrix_format2.py +0 -0
  435. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_migrate.py +0 -0
  436. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_mind_model_additive_fields.py +0 -0
  437. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_muse_plugin.py +0 -0
  438. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_nearest_anchored.py +0 -0
  439. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_okf.py +0 -0
  440. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_opencode_plugin.py +0 -0
  441. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_openspec_profile.py +0 -0
  442. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  443. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  444. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_portable_json.py +0 -0
  445. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_private_tests_isolation.py +0 -0
  446. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_proposal_lifecycle.py +0 -0
  447. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_public_hook_launch.py +0 -0
  448. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  449. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_ratify_policy.py +0 -0
  450. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_rationale_compatibility.py +0 -0
  451. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_community_labels.py +0 -0
  452. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_doc_nodes.py +0 -0
  453. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_engine_version.py +0 -0
  454. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_file_labels.py +0 -0
  455. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_graph.py +0 -0
  456. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_integration.py +0 -0
  457. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_label_conventions.py +0 -0
  458. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_member_name_lookup.py +0 -0
  459. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_member_names.py +0 -0
  460. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_nodes_in_file.py +0 -0
  461. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_perf.py +0 -0
  462. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_rationale.py +0 -0
  463. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_read.py +0 -0
  464. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_resolve.py +0 -0
  465. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_stub_collapse.py +0 -0
  466. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_subdir_mismatch.py +0 -0
  467. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_type_split.py +0 -0
  468. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_version.py +0 -0
  469. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_readers_format2.py +0 -0
  470. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_rebuild_instruction.py +0 -0
  471. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_redaction_scan.py +0 -0
  472. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_redaction_seeded.py +0 -0
  473. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_redaction_tokens.py +0 -0
  474. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_repo_relative_paths_portable.py +0 -0
  475. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_repoint_integration.py +0 -0
  476. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_budget_counters.py +0 -0
  477. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_context.py +0 -0
  478. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_drift_marker.py +0 -0
  479. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_drilldown.py +0 -0
  480. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_facts.py +0 -0
  481. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_guessed.py +0 -0
  482. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_ids.py +0 -0
  483. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_integration.py +0 -0
  484. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_membership_generations.py +0 -0
  485. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_membership_index.py +0 -0
  486. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_rank.py +0 -0
  487. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_related_cap.py +0 -0
  488. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_seeds.py +0 -0
  489. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_shown_ids.py +0 -0
  490. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  491. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_thin_tools.py +0 -0
  492. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_toc.py +0 -0
  493. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_toptier.py +0 -0
  494. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_unratified.py +0 -0
  495. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_schema_descriptor.py +0 -0
  496. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_schema_domain.py +0 -0
  497. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_schema_fact.py +0 -0
  498. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_capture_diagnostics.py +0 -0
  499. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_capture_limits.py +0 -0
  500. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_cli_diagnostics.py +0 -0
  501. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_doc_limits.py +0 -0
  502. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_input_limits.py +0 -0
  503. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
  504. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_numeric_enums.py +0 -0
  505. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_python_shapes.py +0 -0
  506. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_redaction_cursor.py +0 -0
  507. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_write_boundary.py +0 -0
  508. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_seed_ladder.py +0 -0
  509. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_seed_paths_portable.py +0 -0
  510. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_add_anchors.py +0 -0
  511. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_anchoring.py +0 -0
  512. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_annotations.py +0 -0
  513. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_argument_names.py +0 -0
  514. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_borrowed_graph.py +0 -0
  515. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_capture.py +0 -0
  516. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_commit_hint.py +0 -0
  517. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_coverage_events.py +0 -0
  518. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_decision_listing.py +0 -0
  519. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_domains.py +0 -0
  520. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_drilldown.py +0 -0
  521. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_facts.py +0 -0
  522. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_find_entity.py +0 -0
  523. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_get_store.py +0 -0
  524. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_get_task_context.py +0 -0
  525. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_graph_freshness.py +0 -0
  526. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_graph_path.py +0 -0
  527. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_import.py +0 -0
  528. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_invocation_policy.py +0 -0
  529. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_mcp_smoke.py +0 -0
  530. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_nearest_anchored.py +0 -0
  531. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  532. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_ratify_facts.py +0 -0
  533. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_record_types.py +0 -0
  534. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_redaction.py +0 -0
  535. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_refresh.py +0 -0
  536. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_render_events.py +0 -0
  537. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_result_contract.py +0 -0
  538. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_supersede.py +0 -0
  539. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_sync_anchors.py +0 -0
  540. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_telemetry.py +0 -0
  541. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_thin_tools.py +0 -0
  542. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_tolerant_seeds.py +0 -0
  543. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_verify.py +0 -0
  544. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_session_attribution.py +0 -0
  545. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_skill_frontmatter.py +0 -0
  546. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_graph.py +0 -0
  547. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_health.py +0 -0
  548. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_model.py +0 -0
  549. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_render.py +0 -0
  550. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_skill.py +0 -0
  551. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_snapshot.py +0 -0
  552. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stop_hot_path.py +0 -0
  553. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stop_rearm.py +0 -0
  554. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store.py +0 -0
  555. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_agent_state.py +0 -0
  556. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  557. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_bad_file.py +0 -0
  558. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_binding_index.py +0 -0
  559. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_canonical_stat.py +0 -0
  560. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_compact.py +0 -0
  561. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_coverage_telemetry.py +0 -0
  562. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_cross_process_mutations.py +0 -0
  563. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_derived_community.py +0 -0
  564. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_domain_members.py +0 -0
  565. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_domains.py +0 -0
  566. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_entities.py +0 -0
  567. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_fact_cascade.py +0 -0
  568. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_facts.py +0 -0
  569. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_file_anchor_names.py +0 -0
  570. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format.py +0 -0
  571. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format2_load.py +0 -0
  572. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format2_marker.py +0 -0
  573. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format2_writes.py +0 -0
  574. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_git_root_symlink.py +0 -0
  575. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_inventory.py +0 -0
  576. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_junctions.py +0 -0
  577. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_meta.py +0 -0
  578. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_migration.py +0 -0
  579. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_mutation_guard.py +0 -0
  580. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_mutation_immediate.py +0 -0
  581. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_non_file_entries.py +0 -0
  582. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  583. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_persistence.py +0 -0
  584. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_ratification.py +0 -0
  585. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_rebuild_atomicity.py +0 -0
  586. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_record_identity.py +0 -0
  587. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_record_types.py +0 -0
  588. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_render_events.py +0 -0
  589. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_requirement.py +0 -0
  590. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_retrieval.py +0 -0
  591. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_rules.py +0 -0
  592. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_rules_legacy_defaults.py +0 -0
  593. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_slug_conflicts.py +0 -0
  594. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_snapshot_wiring.py +0 -0
  595. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_stamping_marker.py +0 -0
  596. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_symlinks.py +0 -0
  597. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_telemetry.py +0 -0
  598. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_threading.py +0 -0
  599. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_tmp_sweep_age.py +0 -0
  600. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_update_meta_if.py +0 -0
  601. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_subagent_start_manifests.py +0 -0
  602. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_subprocess_text_encoding.py +0 -0
  603. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_canonical_writes.py +0 -0
  604. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_clean.py +0 -0
  605. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_domains.py +0 -0
  606. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_drift_cache.py +0 -0
  607. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_fresh_clone.py +0 -0
  608. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_integration.py +0 -0
  609. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_membership.py +0 -0
  610. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_moved_adoption.py +0 -0
  611. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_rebind.py +0 -0
  612. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_repoint.py +0 -0
  613. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_report_has_findings.py +0 -0
  614. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_run.py +0 -0
  615. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_snapshot_membership.py +0 -0
  616. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_toc_cache.py +0 -0
  617. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_volatile_heal.py +0 -0
  618. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_wiring.py +0 -0
  619. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_telemetry_retention.py +0 -0
  620. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_text_paths.py +0 -0
  621. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_domain_snapshot.py +0 -0
  622. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_format2_against.py +0 -0
  623. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_format2_snapshot.py +0 -0
  624. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_git_framing.py +0 -0
  625. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_git_revisions.py +0 -0
  626. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_git_stdin.py +0 -0
  627. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_snapshot.py +0 -0
  628. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_transitions.py +0 -0
  629. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_asset_packaged.py +0 -0
  630. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_model.py +0 -0
  631. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_render_html.py +0 -0
  632. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_render_json.py +0 -0
  633. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_worktree_seeds.py +0 -0
  634. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/wheel_server_trace.py +0 -0
  635. {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/wheel_smoke.py +0 -0
  636. {sidegraph-0.19.0 → sidegraph-0.21.0}/tools/check_no_session_links.py +0 -0
@@ -7,20 +7,33 @@
7
7
  #
8
8
  # Actions are pinned to commit SHAs (the tag comment records the version): a mutable tag
9
9
  # is a supply-chain hole, and this workflow ships to the public repo by snapshot.
10
+ # Draft PRs run lint, store-lint and anchor-health. Ready PRs, main pushes and
11
+ # workflow_call also run test, sdk-compatibility and windows-core. full-ci is the
12
+ # single required check. Ready pushes validate this revision against the full matrix.
13
+ # Draft runs use another name: a skipped job counts as success.
14
+ # A superseded PR run cannot provide a result for a newer revision.
15
+ # Rollback: disable the ruleset first, then revert this workflow through a PR.
10
16
  name: ci
11
17
 
12
18
  on:
13
19
  push:
14
20
  branches: [main]
15
21
  pull_request:
22
+ types: [opened, synchronize, reopened, ready_for_review]
16
23
  workflow_call: # reused as the pre-publish gate by publish.yml (tag builds)
17
24
 
18
25
  permissions:
19
26
  contents: read
20
27
 
28
+ # PR runs only: main, tag and workflow_call runs each get a unique group.
29
+ # This does not apply to session-link-gate.yml. Re-run only the head run.
30
+ concurrency:
31
+ group: ci-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || format('run-{0}', github.run_id) }}
32
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
33
+
21
34
  jobs:
22
35
  lint:
23
- runs-on: ubuntu-latest
36
+ runs-on: ubuntu-slim
24
37
  timeout-minutes: 15
25
38
  steps:
26
39
  # zizmor artipacked: this job never pushes, so the checkout's git credentials should not
@@ -42,7 +55,7 @@ jobs:
42
55
  uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
43
56
  with:
44
57
  path: ~/.cache/pre-commit
45
- key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
58
+ key: pre-commit-ubuntu-slim-${{ hashFiles('.pre-commit-config.yaml') }}
46
59
 
47
60
  - name: Install dependencies
48
61
  run: uv sync --locked
@@ -77,6 +90,7 @@ jobs:
77
90
  PY
78
91
 
79
92
  test:
93
+ if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
80
94
  runs-on: ubuntu-latest
81
95
  timeout-minutes: 30
82
96
  strategy:
@@ -100,9 +114,10 @@ jobs:
100
114
  run: uv sync --locked
101
115
 
102
116
  - name: Run tests
103
- run: uv run pytest -q
117
+ run: uv run pytest -q --durations=30 --durations-min=1
104
118
 
105
119
  sdk-compatibility:
120
+ if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
106
121
  runs-on: ubuntu-latest
107
122
  timeout-minutes: 15
108
123
  strategy:
@@ -149,6 +164,7 @@ jobs:
149
164
  -k "not t9 and not t14_every and not t14_the_manual and not console_script_is_the_host_entry"
150
165
 
151
166
  windows-core:
167
+ if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
152
168
  runs-on: windows-2022
153
169
  timeout-minutes: 30
154
170
  strategy:
@@ -188,7 +204,7 @@ jobs:
188
204
  if (Test-Path "tests/private/test_older_reader_native.py") {
189
205
  $privateTests += "tests/private/test_older_reader_native.py"
190
206
  }
191
- uv run pytest -q --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
207
+ uv run pytest -q --durations=30 --durations-min=1 --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
192
208
  tests/test_store_mutation_guard.py `
193
209
  tests/test_store_mutation_immediate.py tests/test_store_cross_process_mutations.py `
194
210
  tests/test_hook_contention.py tests/test_retrieval_seeds.py `
@@ -207,6 +223,7 @@ jobs:
207
223
  tests/test_git_output_utf8.py `
208
224
  tests/test_githooks_atomic_lock.py::test_windows_pid_probe_is_never_a_signal_from_python `
209
225
  tests/test_health_check_skill.py `
226
+ tests/test_checkout_window.py tests/test_store_marker_checkout_race.py `
210
227
  $privateTests
211
228
  if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
212
229
 
@@ -289,7 +306,7 @@ jobs:
289
306
  # this workflow ships to the public repo.
290
307
  store-lint:
291
308
  if: github.event_name == 'pull_request'
292
- runs-on: ubuntu-latest
309
+ runs-on: ubuntu-slim
293
310
  timeout-minutes: 10
294
311
  steps:
295
312
  # zizmor artipacked: this job never pushes; do not persist git credentials past checkout.
@@ -352,3 +369,47 @@ jobs:
352
369
  uvx --from graphifyy==0.9.90 graphify update .
353
370
  uv sync --locked
354
371
  uv run sidegraph-sync --json --check
372
+
373
+ full-ci:
374
+ name: "${{ (github.event_name != 'pull_request' || !github.event.pull_request.draft) && 'full-ci' || 'full-ci (draft: full matrix not run)' }}"
375
+ if: ${{ always() }}
376
+ needs: [lint, test, sdk-compatibility, windows-core, store-lint, anchor-health]
377
+ runs-on: ubuntu-latest
378
+ timeout-minutes: 5
379
+ steps:
380
+ - name: Every required job passed on this revision
381
+ env:
382
+ FULL: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
383
+ EVENT: ${{ github.event_name }}
384
+ LINT: ${{ needs.lint.result }}
385
+ TEST: ${{ needs.test.result }}
386
+ SDK: ${{ needs.sdk-compatibility.result }}
387
+ WINDOWS: ${{ needs.windows-core.result }}
388
+ STORE_LINT: ${{ needs.store-lint.result }}
389
+ ANCHOR_HEALTH: ${{ needs.anchor-health.result }}
390
+ run: |
391
+ status=0
392
+ need() { # need <job> <result> <allowed...>
393
+ job="$1"; result="$2"; shift 2
394
+ for ok in "$@"; do [ "$result" = "$ok" ] && return 0; done
395
+ echo "::error::$job: '${result:-none}' (needs: $*)"; status=1
396
+ }
397
+ if [ "$FULL" != true ]; then
398
+ echo "::notice::Draft pull request: the full matrix did not run. Mark it Ready; the required check is full-ci."
399
+ need lint "$LINT" success
400
+ need store-lint "$STORE_LINT" success
401
+ need anchor-health "$ANCHOR_HEALTH" success
402
+ exit "$status"
403
+ fi
404
+ need lint "$LINT" success
405
+ need test "$TEST" success
406
+ need sdk-compatibility "$SDK" success
407
+ need windows-core "$WINDOWS" success
408
+ if [ "$EVENT" = pull_request ]; then
409
+ need store-lint "$STORE_LINT" success
410
+ need anchor-health "$ANCHOR_HEALTH" success
411
+ else
412
+ need store-lint "$STORE_LINT" success skipped
413
+ need anchor-health "$ANCHOR_HEALTH" success skipped
414
+ fi
415
+ exit "$status"
@@ -26,7 +26,7 @@ permissions:
26
26
 
27
27
  jobs:
28
28
  pr-description-link-gate:
29
- runs-on: ubuntu-latest
29
+ runs-on: ubuntu-slim
30
30
  timeout-minutes: 5
31
31
  steps:
32
32
  # zizmor artipacked: this job never pushes; do not persist git credentials past checkout.
@@ -7,6 +7,77 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.21.0] — 2026-10-28
11
+
12
+ ### Changed
13
+
14
+ - Draft pull requests run only the quick CI checks. The full test matrix runs when a pull
15
+ request is marked ready for review, on `main` and before release, behind one aggregate
16
+ `full-ci` gate.
17
+
18
+ ### Fixed
19
+
20
+ - `sidegraph-bootstrap` recognises a plugin install. When the manual registration files are
21
+ not complete, an enabled Sidegraph plugin satisfies the host check: Claude Code prints
22
+ `INTEGRATION Claude Code plugin sidegraph@sidegraph enabled (MCP + hooks)`, Codex prints
23
+ `INTEGRATION Codex best-effort` with `plugin sidegraph@sidegraph enabled; its hooks run
24
+ once trusted in Codex (/hooks)`, and a run that is otherwise complete exits `0` instead of
25
+ `2`. The `--report` integration section gains `- via: plugin` or `- via: manual`, and
26
+ `--report` refuses the user-level Claude Code settings and Codex config the check now reads.
27
+
28
+ - `sidegraph-viz` (with or without `--json`) and `sidegraph-export-okf` report a store that
29
+ cannot be opened, such as a damaged `index.db`, a format marker from another version or a
30
+ minimum-version requirement this release does not meet, as one
31
+ `store not readable (<path>): <error>` line on stderr and exit `2`, the documented
32
+ operational-error code. Before, they ended with a traceback and exit `1`. With `--json`,
33
+ nothing is printed on stdout in that case.
34
+
35
+ - Opening a store while git checks out a commit that changes `.sidegraph/format` (a pull of
36
+ a raised requirement or a migration, a branch switch, a clone) no longer writes a default
37
+ marker in its place. Git removes the old file before writing the new one. An open in that
38
+ moment could publish `sidegraph-store 0.6.0`, and git could not create its own file,
39
+ leaving the default without its `requires-sidegraph` line. The open now waits up to 2 seconds
40
+ for git's marker and refuses without writing if git stays busy or `HEAD` records a missing
41
+ marker. The message names the recovery step.
42
+
43
+ ## [0.20.0] — 2026-10-28
44
+
45
+ ### Added
46
+
47
+ - **Contract change:** `record_drift_check` takes an optional `sections` argument for
48
+ markdown files: the sections you read, plus sections to also watch. The record then
49
+ re-arms on that file only when one of them, or the file's link reference definitions,
50
+ changes. The result echoes `declared_sections` (`first_line`, `lines`) and eleven new
51
+ fixed error codes name each refusal. The capsule gains an optional `declared_sections`
52
+ field inside `schema_version` 1 (hashes only, no heading text); plain capsules write an
53
+ empty list. An older release ignores the field, compares whole blobs and warns more,
54
+ never less. An unknown scheme or role, or a file whose structure cannot be bounded, still
55
+ compares by whole blob, and so does a partial clone on Git older than 2.45, where reading
56
+ section text could fetch objects.
57
+ - `sidegraph-doctor` groups per-record `code-drift` by the drifted file. Each record names the
58
+ blob it was compared against (a capture, check or scope baseline, with its mode) and shares
59
+ one `git diff <old blob> <new blob>` per distinct change; a mode-only or type change says so.
60
+ A record whose anchored Python function or Markdown section is identical at both ends carries
61
+ `anchored region unchanged; sibling sections of the file may still matter`, a reading aid
62
+ that never clears or reorders anything. `--json` gains a `drift_groups` key; `findings` is
63
+ unchanged. `--flat` restores one line per record and skips the grouping.
64
+ - `markdown-it-py>=4,<5` is a direct dependency (Markdown heading spans for the hint and for
65
+ declared sections).
66
+
67
+ ### Changed
68
+
69
+ - The SessionStart drift line says how many of the records needing review are recent:
70
+ `Sidegraph: 190 record(s) need content review (12 new in the last 7 days): …`, or
71
+ `(none new in the last 7 days)`. A record without a recorded first-seen time counts as
72
+ unknown age, never as new. An index built before this version prints the line without the
73
+ clause on its first day, `(none new since <date>)` while its stamping is younger than
74
+ 7 days, and `(none new in the last 7 days)` from then on, until a record newly drifts.
75
+ `SIDEGRAPH_DRIFT_NUDGE=off` silences it with the rest of the line.
76
+ - `sidegraph-doctor --json` findings carry `first_seen`: the ISO time a `code-drift`
77
+ record was first seen drifted, otherwise `null`.
78
+ - The default `sidegraph-doctor` text for per-record `code-drift` is the grouped block above
79
+ instead of one line per record. The summary count, `--check` and the exit codes are unchanged.
80
+
10
81
  ## [0.19.0] — 2026-10-27
11
82
 
12
83
  ### Changed
@@ -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.19.0) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.21.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
@@ -59,7 +59,9 @@ issue when there is one, keep the patch focused, and update affected documentati
59
59
  Use an area-prefixed imperative commit subject, for example `store: preserve history`,
60
60
  and sign off each commit as described below.
61
61
 
62
- CI runs the full suite on Linux/Python 3.13 and 3.14 and a selected native Windows
62
+ CI runs lint on every PR push. On a pull request that is ready for review (not a draft),
63
+ on `main` and before publishing, it also runs the full suite on Linux/Python 3.13 and 3.14
64
+ and a selected native Windows
63
65
  core/MCP suite on both versions; see [platform coverage](docs/getting-started/installation.md#platform-coverage).
64
66
  If your change touches paths, permissions,
65
67
  subprocesses, or shell commands, describe any additional platform checks you performed.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sidegraph
3
- Version: 0.19.0
3
+ Version: 0.21.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
@@ -24,6 +24,7 @@ Requires-Python: >=3.13
24
24
  Requires-Dist: anyio>=4
25
25
  Requires-Dist: certifi>=2026.10.19
26
26
  Requires-Dist: fastmcp<4,>=3.4.10
27
+ Requires-Dist: markdown-it-py<5,>=4
27
28
  Requires-Dist: mcp<2,>=1.30
28
29
  Requires-Dist: opentelemetry-api>=1.45.1
29
30
  Requires-Dist: pydantic>=2.9
@@ -133,6 +133,9 @@ Anchoring and sync collapse the stubs; what agents read keeps the ambiguous answ
133
133
 
134
134
  ## Why multi-anchor matters for doc corpora
135
135
 
136
+ Anchoring decides where a record surfaces. Which sections of a long document a later
137
+ `record_drift_check` must watch is declared when the record is checked, not anchored.
138
+
136
139
  On a docs corpus (ADRs/SAD), both a heading and its containing file are anchorable nodes
137
140
  (`file_type` in `{code, document, concept, rationale}` — an allowlist that also keeps
138
141
  unanchorable types like `image` out, per the same never-guess principle; `concept` and
@@ -314,8 +314,9 @@ the shared canonical digest/index record tables. See
314
314
  | `required_files` | list[str] | Exact current required anchor-file set, separate from optional inspected dependencies. |
315
315
  | `checked_files` | list[`CheckedCodeFile`] | Explicit inspected regular-file snapshots, covering every required file; 1–256 unique safe paths. |
316
316
  | `subject_digest` | str | SHA-256 of fixed immutable decision/provenance fields and durable leaf descriptors; excludes lifecycle and volatile mapping/status fields. |
317
+ | `declared_sections` | list[`DeclaredSectionFile`] | Optional per-file section scope for markdown files, `[]` for a plain whole-file check; at most 64 entries, each path one of `checked_files`. |
317
318
 
318
- Changed inspected files/modes or required scope re-arm review. A matching snapshot after
319
+ Changed inspected files/modes or required scope re-arm review; for a file with declared sections, a change to a declared or also-watched section, or to the file's link definitions, re-arms instead of any change to the file. A matching snapshot after
319
320
  an unrelated commit remains covered. A mistaken semantic assertion cannot be detected
320
321
  from these hashes; a genuine successor corrects the decision and preserves the check as
321
322
  history. Optional comparison failure has the bounded behavior described in store-format.
@@ -330,3 +331,25 @@ mappings. The total checked-path budget is 16384 UTF-8 bytes.
330
331
  | `path` | str | Safe repository-relative forward-slash path, at most 1024 UTF-8 bytes. |
331
332
  | `blob_id` | str | Full Git content address of the inspected file. |
332
333
  | `mode` | `100644` \| `100755` | Regular-file Git mode; mode changes participate in applicability. |
334
+
335
+ ## `DeclaredSectionFile` — declared sections of one checked file
336
+
337
+ Nested in `DriftCheck`; this stores locators and digests, never heading text or source
338
+ bodies. A scheme or role this release does not know is accepted and compared by whole blob.
339
+
340
+ | Field | Type | Meaning |
341
+ |---|---|---|
342
+ | `path` | str | One of the check's `checked_files`; unique across entries. |
343
+ | `scheme` | token | How sections are located; `md1` (markdown block structure) is the one scheme this release resolves. |
344
+ | `refs_hash` | hex \| `null` | `md1`: digest of the file's link reference definitions. |
345
+ | `sections` | list[`DeclaredSection`] | 1–256 sections; at most 1024 across the check. |
346
+
347
+ ## `DeclaredSection` — one declared or also-watched section
348
+
349
+ Nested in `DeclaredSectionFile`.
350
+
351
+ | Field | Type | Meaning |
352
+ |---|---|---|
353
+ | `heading_hash` | hex | `md1`: digest of the heading chain that locates the section. |
354
+ | `role` | token | `declared` (the checker read it) or `watch` (a sibling the claim depends on). |
355
+ | `text_hash` | hex | `md1`: digest of the section's text, subsections included. |
@@ -124,20 +124,28 @@ current-graph anchor proof. Optional domain suggestions do not block that proof.
124
124
  | Claude Code | verified | verified | verified | verified | complete v1 flow |
125
125
  | Codex | verified when configured | verified when configured | verified when configured | unsupported | best-effort only |
126
126
 
127
- The host check reads the manual registration files only: `.mcp.json` and the `hooks` of
127
+ The host check reads the manual registration files first: `.mcp.json` and the `hooks` of
128
128
  `.claude/settings.json` for Claude Code, `.codex/config.toml` and `.codex/hooks.json` for Codex.
129
- It does not recognise a plugin install, whose MCP server and hooks live in the plugin
130
- manifest. On a project that uses the plugin, `INTEGRATION` is therefore reported `incomplete`
131
- and the command exits `2` even though the plugin works. Ignore that result if the plugin is
132
- installed, or register the entry points by hand as described in the
133
- [Claude Code](../integrations/claude-code.md) or [Codex](../integrations/codex.md) setup guide.
129
+ When they are not complete, an enabled Sidegraph plugin satisfies the check.
130
+
131
+ For Claude Code, the `enabledPlugins` merge must enable `sidegraph@<marketplace>` for a session
132
+ launched at the bootstrap root: user settings, that directory's `.claude/settings.json` and
133
+ `.claude/settings.local.json`, then the repository root's `.claude/settings.local.json` when
134
+ launching below it. `$CLAUDE_CONFIG_DIR` replaces `~/.claude` for user settings when set.
135
+ The terminal prints `INTEGRATION Claude Code plugin sidegraph@sidegraph enabled (MCP + hooks)`.
136
+ For Codex, `[plugins."sidegraph@<marketplace>"]` with `enabled = true` in
137
+ `$CODEX_HOME/config.toml` (default `~/.codex/config.toml`) satisfies its supported checks.
138
+ Under `INTEGRATION Codex best-effort`, it prints
139
+ `plugin sidegraph@sidegraph enabled; its hooks run once trusted in Codex (/hooks)`.
140
+ Bootstrap cannot see Codex hook trust.
134
141
 
135
142
  Claude Code has the complete v1 flow. Codex has MCP, SessionStart, and Stop support, but no
136
143
  Read/Grep PreToolUse equivalent. When store, anchors, all three supported Codex checks, and
137
144
  production proof are complete, the command reports `best-effort`. In that state, best-effort completion exits 0
138
145
  with an explicit warning. The terminal never prints `fully supported` for Codex (the optional
139
146
  `--report` markdown does write `- fully supported: false` for Codex). A missing or invalid
140
- supported check is actionable incomplete and exits `2`.
147
+ supported check is actionable incomplete and exits `2`, unless an enabled Sidegraph plugin
148
+ provides MCP and hooks for this host.
141
149
 
142
150
  Exit `0` also covers full Claude Code activation and safe diagnostics with no required write.
143
151
  A run whose approved candidates were all skipped as unanchored (see below) is such a
@@ -16,7 +16,8 @@ file- and domain-linked records without a graph; the complete workflow below ins
16
16
 
17
17
  ### Platform coverage
18
18
 
19
- The automated matrix runs the full suite on Linux with Python 3.13 and 3.14. Native
19
+ On every pull request that is ready for review (not a draft), on `main` and before every
20
+ publish, the automated matrix runs the full suite on Linux with Python 3.13 and 3.14. Native
20
21
  Windows x64 (`windows-2022`) runs a selected portable core/MCP suite on both versions:
21
22
  Store mutation/rollback and cross-process conflicts, UTF-8 and descriptor cleanup,
22
23
  MCP result contracts, invocation admission, and wheel-probe guards. It also builds and
@@ -45,7 +46,8 @@ with Git for Windows installed; they do not establish support for Windows hosts
45
46
  remains outside these checks.
46
47
  See [Windows](#windows) before installing a host plugin.
47
48
 
48
- Package dependencies support `fastmcp>=3.4.10,<4` and `mcp>=1.30,<2`. Runtime security
49
+ Package dependencies support `fastmcp>=3.4.10,<4`, `mcp>=1.30,<2` and `markdown-it-py>=4,<5`
50
+ (markdown section scope for drift checks). Runtime security
49
51
  floors also require `certifi>=2026.10.19` and
50
52
  `opentelemetry-api>=1.45.1`, including standalone wheel installations. Major SDK upgrades
51
53
  require a separate compatibility review; an unlocked package install may resolve newer
@@ -42,6 +42,9 @@ named, is a separate decision-level Tier-0 binding made by the write path, not p
42
42
  `name` is a **heading text** or the **file name itself**; for code, a **function/class name**
43
43
  or the file — all valid entity names in a Graphify graph.
44
44
 
45
+ For a long document, section scope is declared when the record is checked (see
46
+ [`record_drift_check`](../reference/mcp-tools.md#record_drift_check)), not when it is anchored.
47
+
45
48
  **Always add the containing file as a second anchor — for code symbols and doc headings
46
49
  alike.** A heading rename or symbol move orphans the precise anchor on the next sync; the
47
50
  file anchor survives and keeps the decision retrievable (and its community fallback intact).
@@ -297,5 +297,8 @@ Use `sidegraph:triage-drift` to read the claim and current code. If the claim st
297
297
  `record_drift_check` can append a justified inspection of the current clean committed
298
298
  files without changing the decision. If it no longer holds, propose a real successor.
299
299
  The [tool reference](../reference/mcp-tools.md#record_drift_check) describes refusal cases
300
- and coverage. Changed inspected files or scope re-arm the warning; unrelated commits do
301
- not. The check is an attributed assertion and can be wrong.
300
+ and coverage. Changed inspected files or scope re-arm the warning, and for a markdown file
301
+ checked with declared sections only a change to a declared or also-watched section or to the
302
+ file's link definitions does; unrelated commits do not. The check is an attributed assertion and can be wrong. `sidegraph-doctor` groups the
303
+ records by drifted file and may note `anchored region unchanged; sibling sections of the file
304
+ may still matter`: that shortens the reading, it does not replace it.
@@ -113,14 +113,21 @@ that depends on the exception:
113
113
  - A store that requires a newer Sidegraph (`This store requires Sidegraph >= X.Y.Z; this is
114
114
  A.B.C.`): upgrade to at least that version and start a new session. A teammate raised it
115
115
  with `sidegraph-require`.
116
+ - A missing format marker (`the store format marker … is missing`, or
117
+ `store format marker is missing and git did not answer in time`): if a git command is
118
+ running (a pull or checkout), start a new session when it finishes. Otherwise restore a
119
+ committed marker with `git -C .sidegraph checkout HEAD -- format`. If the message names an
120
+ index lock and no git command is running, remove that named lock and open again. For a
121
+ repeated timeout with no git command running, check `git -C .sidegraph status`.
116
122
  - A store written by a different Sidegraph version, for example a packed (format 2) store opened
117
123
  by 0.14 to 0.16, whose message ends `migration tooling is deferred — use a fresh store`:
118
124
  upgrade Sidegraph, or use the version that wrote it. The message predates `sidegraph-migrate`
119
125
  and does not mean you need a fresh store.
120
126
  - Anything else: `sidegraph-verify` gives the details.
121
127
 
122
- A lock that another process holds is not a broken store. The hook stays silent for it, and the
123
- next session start opens the store.
128
+ An ordinary store write lock held by another process is transient. The hook stays silent for
129
+ it, and the next session start opens the store. The marker-specific git refusal above instead
130
+ names its recovery step.
124
131
 
125
132
  ### pending-ratification
126
133
 
@@ -134,7 +141,8 @@ notice.
134
141
  Records needing content review after code changed or a prior scoped check stopped applying.
135
142
  The line says how many. Inspect current code: record an explicit `record_drift_check` if the
136
143
  claim still holds, or propose a real successor if it does not. There is no user notice.
137
- `sidegraph-doctor` lists them as `code-drift` findings, and the `sidegraph:triage-drift` skill walks them.
144
+ `sidegraph-doctor` lists them as `code-drift` findings, grouped by the drifted file with one `git diff` per distinct
145
+ change (`sidegraph-doctor --flat` prints one line per record instead), and the `sidegraph:triage-drift` skill walks them.
138
146
  `SIDEGRAPH_DRIFT_NUDGE=off` silences the line.
139
147
 
140
148
  ### graph-borrowed
@@ -89,14 +89,16 @@ exclusions, review/state table, host matrix, and recovery semantics.
89
89
  | `--codex-config` | `.codex/config.toml` | alternate Codex MCP config path |
90
90
  | `--candidate` | all candidates | review only the displayed candidate key |
91
91
  | `--task` | deterministic proof selection | additional repository path for production retrieval proof |
92
- | `--report` | none | after a confirmed apply (including the all-unanchored diagnostic), write an aggregate, source-content-free Markdown report; never uploaded. The pre-apply diagnostics (no candidates, every candidate skipped in review, a changed plan with no writes) write none. The destination must not be, or be hard-linked to, the graph, any host's config file (both hosts', whichever `--host` is set) or a scanned source, and must not lie inside the store; the report replaces the file rather than truncating it in place |
92
+ | `--report` | none | after a confirmed apply (including the all-unanchored diagnostic), write an aggregate, source-content-free Markdown report; never uploaded. The pre-apply diagnostics (no candidates, every candidate skipped in review, a changed plan with no writes) write none. The destination must not be, or be hard-linked to, the graph, any host config file the check reads (both hosts', whichever `--host` is set, including the user-level Claude Code settings and Codex config) or a scanned source, and must not lie inside the store; the report replaces the file rather than truncating it in place |
93
93
  | `--resume` | off | marker only, for the resume command a failed run prints — it changes no behavior. The scan/review/reconcile flow is idempotent, so reissuing the same command without it behaves identically |
94
94
 
95
95
  Output keeps `STORE`, `ANCHORS`, `INTEGRATION`, and `PROOF` independent. Claude Code can
96
96
  complete the full v1 flow. Codex verifies MCP, SessionStart, and Stop but reports Read/Grep
97
97
  PreToolUse as unsupported; a green supported subset plus store, anchor, and proof completion
98
98
  is `best-effort` and exits `0`, but is never labeled fully supported. A missing supported
99
- check exits `2`.
99
+ check exits `2`. An enabled Sidegraph plugin satisfies the host check when the manual
100
+ registration files are not complete; see
101
+ [Completion, recovery, and hosts](../getting-started/bootstrap.md#completion-recovery-and-hosts).
100
102
 
101
103
  **Exit codes:** `0` for complete activation, Codex best-effort completion, or a safe
102
104
  no-write diagnostic; `1` for usage or operational failure, unreachable once anything has been
@@ -1515,7 +1517,7 @@ Once any record, hot or archived, carries an `auto:` stamp, two more information
1515
1517
  When an entity is named by a path, full or partial, of its file (`src/sidegraph/store.py`, `sidegraph/store.py`) beside one named by that file's basename (`store.py`), a `spelling twins: N …` line follows, then one line per such entity: `<id> '<path name>' (K binding(s)) → <id> '<basename>' (M binding(s))`. Lookups and new anchors use the basename entity, and retrieval reaches both, so there is nothing to fix. Like the lines above, these are never findings, never change the exit code, and never appear in `--json`.
1516
1518
 
1517
1519
  ```
1518
- sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--json] [--graph PATH]
1520
+ sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--json] [--flat] [--graph PATH]
1519
1521
  ```
1520
1522
 
1521
1523
  | Flag | Default | Meaning |
@@ -1524,7 +1526,8 @@ sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--j
1524
1526
  | `--against GIT_REF` | none | also run `sidegraph-verify`'s transition layer vs `GIT_REF` (identical semantics — same operational-error rules) |
1525
1527
  | `--check` | off | advisory findings also exit `2`, except `maintenance-due` (default: report only; a *skipped* check never fails, even with `--check`) |
1526
1528
  | `--stale-days N` | `30` | flag a proposed decision/domain whose id timestamp is strictly older than `N` days; must be `>= 0` |
1527
- | `--json` | off | print `{"clean", "violations", "findings", "skipped"}` as one JSON object to stdout (nothing else) |
1529
+ | `--json` | off | print `{"clean", "violations", "findings", "skipped"}`, plus `drift_groups` when per-record `code-drift` is grouped, as one JSON object to stdout (nothing else) |
1530
+ | `--flat` | off | one `code-drift` line per record, as before: restores the flat listing and skips the grouping by file |
1528
1531
  | `--graph` | `$SIDEGRAPH_GRAPH` or `graphify-out/graph.json`, in the store's project | read-only input used for the `graph-root-mismatch` and `graph-stale` checks below; missing or unreadable skips both and says so (see *Skipped checks* below) |
1529
1532
 
1530
1533
  One-stop store health: composes `sidegraph-verify`'s strict snapshot (+ optional
@@ -1554,7 +1557,7 @@ plain-text line):
1554
1557
  | `stale-proposal` | a proposed decision/domain whose ULID timestamp is strictly older than `--stale-days` |
1555
1558
  | `unreferenced-entity` | a hot entity no committed anchor set references (structural `domain:*`/`community:*` entities are exempt) |
1556
1559
  | `expired-open-validity` | a decision's `valid_to` is strictly past but its status is still open (`proposed`/`accepted`) |
1557
- | `code-drift` | an open (`proposed`/`accepted`) decision's anchored file(s) changed since capture, or an earlier scoped check no longer applies; `record_drift_check` can record an explicit current inspection without rewriting the decision (MCP only); when binding statuses are uncomputed or unavailable, excludes committed deletions and says "binding status unknown"; also carries the "N record(s) predate commit stamping — not checkable" and git-unavailable notes, in place, when either applies |
1560
+ | `code-drift` | an open (`proposed`/`accepted`) decision's anchored file(s) changed since capture, or an earlier scoped check (including its declared sections) no longer applies; `record_drift_check` can record an explicit current inspection without rewriting the decision (MCP only); when binding statuses are uncomputed or unavailable, excludes committed deletions and says "binding status unknown"; also carries the "N record(s) predate commit stamping — not checkable" and git-unavailable notes, in place, when either applies. The default text groups the per-record lines by drifted file (`code-drift: N record(s) in M file group(s)`), numbers each distinct `git diff <old blob> <new blob>` once, and may add `anchored region unchanged; sibling sections of the file may still matter` to a record whose anchored Python function or Markdown section is textually identical at both ends; `--flat` restores one line per record. The hint is a reading aid, never a verdict: it changes no count and no exit code. `--json` adds a sibling `drift_groups` key (`partial`, `notes`, `groups[].records[]` with `basis`, `reason`, `diff` and `hint`); `findings` is unchanged |
1558
1561
  | `never-surfaced` | an accepted decision has `0` shows against `N > 0` queries on its anchored file(s) — anchored where people repeatedly work, never once rendered or injected by a hook |
1559
1562
  | `stale-instructions` | an auto-injected agent-instructions file beside the store (`CLAUDE.md`, `AGENTS.md`, `GEMINI.md`, `.cursorrules`) still carries the distinctive wording of a **superseded** decision — that file reaches the agent at turn zero, before retrieval, so an abandoned rule surviving there outranks the store's correction by default. Verbatim-ish match on normalized text with length/word floors; superseded records only; no git call. Advisory: it reports a quotation, not a proven contradiction — the file may be narrating history |
1560
1563
  | `unratified-accept` | an **accepted** record whose provenance says `agent` and which carries no ratifier stamp — the signature `SIDEGRAPH_AUTO_ACCEPT=on` leaves in a shared store (one environment's setting bypassing the ratification gate for everyone). Scoped to records created at/after the EARLIER of the store's earliest ratifier stamp and its creation marker (`.sidegraph/stamping_live_since`, written once when a store is genuinely new — never backfilled onto an existing one), so a store predating both reports nothing rather than everything; a store that has never ratified anything but was created by a marker-writing version is still in scope from its own creation, closing the blind window an unratified store would otherwise sit in forever. A stamped record — including one stamped `auto:<policy>` by an auto-ratification policy — and a human-sourced one are never flagged. A **supersession successor** (`supersedes` set — `supersede_decision`/`supersede_fact`) is never flagged either: reversal has no ratification queue to bypass and lands accepted immediately by design, so it reproduces the signature with no relation to the env var this check hunts. Narrowed exception: a `supersedes`-bearing record IS still flagged if it carries a `layer`, a `provenance.ref`, or a tier-0 `tag:`/`initiative:` binding absent from its predecessor — neither `supersede_decision` nor `supersede_fact` can produce any of the three, so one present proves the `propose_decisions`/auto-accept path wrote it. (The fact half is defensive only: `supersede_fact` always stamps `source="human"`, so a fact successor never reaches this agent-sourced check, and no draft shape carries `supersedes` on a fact.) Only a MINIMAL superseding draft (none of the three) is indistinguishable from a legitimate successor by the record's own fields, and stays excluded — a known, accepted, narrower trade-off than treating every supersession alike. Advisory: the signature is not proof — verify before concluding |
@@ -1620,7 +1623,8 @@ neither flagged nor cleared. `drill_down` does record a `domain:<slug>` seed, bu
1620
1623
  consumes it yet; its *shows* count normally, so surfacing only through a domain drill-down
1621
1624
  still protects a decision from a false flag.
1622
1625
 
1623
- Each JSON finding has `code`, `path`, `detail`, `record_id` and `record_type`.
1626
+ Each JSON finding has `code`, `path`, `detail`, `record_id`, `record_type` and `first_seen`
1627
+ (the ISO time Sidegraph first saw a `code-drift` finding's record drifted, otherwise `null`).
1624
1628
  Per-record findings carry their logical identity (`decision`, `fact`, `entity`, `domain`,
1625
1629
  or `bindings`); global notes have null record fields. A malformed raw record whose id
1626
1630
  cannot be read also has a null subject; use its violation and physical path for repair. `path` retains the physical source,
@@ -1700,9 +1704,10 @@ Rendering does not mutate canonical records or `graph.json`. It opens the ordina
1700
1704
  so startup may migrate supported legacy data or rebuild `index.db`. Binding status
1701
1705
  (live/degraded/orphaned) reflects the last `sidegraph-sync`; run sync first for a fresh view.
1702
1706
  Exit code 0 on success (a store with problems still exits 0 — the problems are the output), 2
1703
- on an operational error (uninitialized store or unwritable output path). A store that cannot be
1704
- opened at all (for example a corrupt `index.db`) is not caught: the command exits 1 with a
1705
- traceback.
1707
+ on an operational error: an uninitialized store, a store that cannot be opened (for example
1708
+ a corrupt `index.db` or a format marker this version does not read; one
1709
+ `store not readable (<path>): <error>` line on stderr, and with `--json` nothing on stdout),
1710
+ or an unwritable output path.
1706
1711
 
1707
1712
  ## `sidegraph-export-adr`
1708
1713
 
@@ -1785,9 +1790,9 @@ write failure there can leave a partial export. A killed export can leave `.<out
1785
1790
  or `.<out>.okf-old-*` beside `--out` (the repo root for the default `--out`). The `-old-`
1786
1791
  one holds the previous export: if `--out` is missing, rename it back; if `--out` already holds
1787
1792
  the new bundle, delete it. Exit `0` on success, `2` on an operational error
1788
- (uninitialized store — never auto-created — or a refused/unwritable out dir or its
1789
- parent). A store that cannot be opened at all (for example a corrupt `index.db`) is not
1790
- caught: the command exits 1 with a traceback.
1793
+ (uninitialized store — never auto-created — a store that cannot be opened, printed as
1794
+ `store not readable (<path>): <error>` on stderr, or a refused/unwritable out dir or its
1795
+ parent).
1791
1796
 
1792
1797
  ## `sidegraph-stats`
1793
1798
 
@@ -15,7 +15,7 @@ a per-call parameter, not an environment/config setting.
15
15
  | `SIDEGRAPH_CAPTURE_NUDGE` | unset | `host/hooks.py` (`stop` only). Set to `off` to disable the `Stop` block-to-distill nudge entirely — no other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-stop). |
16
16
  | `SIDEGRAPH_RATIFY_NUDGE` | unset | `host/hooks.py` (`session_start` only). Set to `off` to disable the pending-ratification line entirely — no other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-session-start). |
17
17
  | `SIDEGRAPH_SUBAGENT_BRIEF` | unset | `host/subagent.py` (`subagent_start` only). Set to `off` to stop the `SubagentStart` hook from giving each subagent the memory brief — no other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-subagent-start). |
18
- | `SIDEGRAPH_DRIFT_NUDGE` | unset | `host/hooks.py` (`session_start` and `stop`). Set to `off` to suppress the two drift PROSE surfaces — the SessionStart "N record(s) need content review" line and the Stop-nudge drift clause. **The code-drift cache refresh still runs either way** (it is what keeps the `[drifted]` retrieval markers fresh — gating it would freeze markers at their last pre-`off` state), and the `[drifted]` tags in `get_task_context`/`query_decisions`/`drill_down` output are retrieval content, not gated by this switch. No other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-session-start). |
18
+ | `SIDEGRAPH_DRIFT_NUDGE` | unset | `host/hooks.py` (`session_start` and `stop`). Set to `off` to suppress the two drift PROSE surfaces — the SessionStart "N record(s) need content review" line (its recency clause included) and the Stop-nudge drift clause. **The code-drift cache refresh still runs either way** (it is what keeps the `[drifted]` retrieval markers fresh — gating it would freeze markers at their last pre-`off` state), and the `[drifted]` tags in `get_task_context`/`query_decisions`/`drill_down` output are retrieval content, not gated by this switch. No other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-session-start). |
19
19
  | `SIDEGRAPH_AUTO_ACCEPT` | unset | `server.py` (`propose_decisions`'s tool shell, read at point of use via `_auto_accept()`). Set to `on` to land agent-proposed decisions and facts as `status="accepted"` directly, bypassing the ratification queue — no other value has any effect, and `propose_domains` is never affected by this flag (domains always land `proposed` under it; only `SIDEGRAPH_RATIFY_POLICY=auto-all` can ratify an eligible domain, with a stamp). Detectable after the fact: `sidegraph-doctor`'s `unratified-accept` finding reports accepted agent-sourced records carrying no ratifier stamp, so a shared store can assert the gate in CI rather than trust it. See [`guides/capturing-decisions.md#4-auto-accept-opt-in`](../guides/capturing-decisions.md#4-auto-accept-opt-in). |
20
20
  | `SIDEGRAPH_RATIFY_POLICY` | unset (`"manual"`) | `server.py` (`_ratify_policy()`, read at point of use inside the `propose_decisions` and `propose_domains` tool shells) and `cli.py` (each of the doc-import, rationale-import, and domain-bootstrap commands, read once immediately before its batch call). Parsed by the pure `capture.parse_ratify_policy`, which never reads the environment itself — every reader above resolves the raw value and threads the parsed policy down as a keyword, so one batch samples a single value throughout. `manual` (default) introduces no new transition and leaves every existing write path's semantics exactly as they are — it does not mean every write lands `proposed`; some paths already land `accepted` under their own pre-existing flags (e.g. `importer.py`'s `propose=False`), unaffected by this knob. `auto-low-risk` lets eligible `lesson`/`gotcha` decisions and standalone facts self-ratify at write time (never `adr`/`constraint` decisions or domains). `auto-all` additionally admits `adr`/`constraint` decisions and domains. Eligibility is deterministic and conjunctive: the policy admits the shape (under `auto-low-risk` a draft that `supersedes` another is never eligible); the record has at least one live Tier-1/Tier-2 anchor binding (a domain instead needs a graph reader, a clean `path_prefixes` lint, and a resolving seed anchor or non-empty prefixes); the write was clean and not a dry run; provenance is present. An attached fact never ratifies itself — it rides its decision's cascade, and one ineligible attached fact keeps the decision proposed. Scope: `propose_decisions` (decisions and standalone facts), `propose_domains` (`auto-all` only), `sidegraph-import` rationale mode only with `--propose`, `sidegraph-import --docs` only for `--propose` writes that land as a new `proposed` record (status-derived drafts, `superseded` re-imports and `status: rejected` documents never auto-ratify), and `sidegraph-domains bootstrap` (`auto-all` only; a candidate whose derived `path_prefixes` is empty stays proposed); `--dry-run` never transitions, and `add_domain`, `sidegraph-domains add`, `supersede_domain` successors and `sidegraph-bootstrap` are never affected. Under either auto policy a superseding proposal's predecessor stays open until the successor is ratified — automatically, or later by a human. Outcomes are always reported: `ratified_by`/`auto_ratify_error` on each propose result; under a non-`manual` policy the three CLI batch summaries append `, auto-ratified N` and print each failure on stderr as `auto-ratify failure: <id>: <reason>`; `sidegraph-doctor` adds two informational lines (see [`cli.md`](cli.md#sidegraph-doctor)). Matching is exact after trimming surrounding whitespace — `AUTO-ALL` falls back to `manual`. `sidegraph-init` never writes this value silently: in an interactive terminal it asks one question, defaulting to `auto-low-risk` on a bare Enter, and writes whichever answer the person gave (`auto-low-risk` or `manual`) into the project's `.claude/settings.json` `env` block explicitly; outside a terminal (CI, a script, an agent-driven session) it asks nothing and writes nothing, printing the line to add by hand instead; either way it never overwrites an existing value there. `--ratify-policy VALUE` sets it with no prompt, and `--no-settings` skips the whole step (see [`cli.md`](cli.md#sidegraph-init)). `manual` remains the library's own default when the variable is unset with no committed override, and is also what a freshly initialized project gets unless a person answers yes to the prompt (or passes `--ratify-policy auto-low-risk`/`auto-all`); `adr`/`constraint` decisions and domains still wait for a human under both `manual` and `auto-low-risk`. For a committed, CI-checkable setting, pin it in the repository's `.claude/settings.json` `env` block. Claude Code applies that block to the MCP server; under any other host the `sidegraph-mcp` entry point reads the committed value from the selected store's project when its environment sets none (an explicit environment value wins), so the policy also applies under Codex. Any unknown or empty value falls back to `manual` — fail-safe, never fail-open, the `SIDEGRAPH_PROPOSAL_WINDOW_DAYS` precedent. Auto-ratified records are stamped `ratified_by="auto:<policy>"`, distinguishing them from human review. When both knobs are set, legacy `SIDEGRAPH_AUTO_ACCEPT=on` wins over this policy — its direct-`ACCEPTED`, stamp-less write lands before any auto-ratify block runs, and `sidegraph-doctor`'s `unratified-accept` finding keeps flagging it regardless. |
21
21
  | `SIDEGRAPH_UNRATIFIED` | unset (`"on"`) | `store_layout.py` (`proposal_surfaces`, read at point of use — the single proposal-surfacing policy every render surface funnels through: `retrieval.py` delegates to it, and so does the PreToolUse hook's index reader). Set to `off` for **regulated mode**: `proposed` records never surface as content — not in `get_task_context`, drill-down, the SessionStart TOC's unratified block, the PreToolUse records block, or the records appended to a subagent's brief on an `Agent` call — regardless of age. The `SubagentStart` brief's counts then include accepted decisions only. The SessionStart pending-ratification **counter stays** (it is queue metadata, not record content). No other value has any effect. For a committed, CI-checkable setting, pin it in the repository's `.claude/settings.json` `env` block. See [`hooks.md`](hooks.md#sidegraph-session-start). |
@@ -256,10 +256,18 @@ raises costs only its own line.
256
256
  `$SIDEGRAPH_DRIFT_NUDGE != "off"`, one more line is appended (own `try/except`, same
257
257
  never-cost-the-map guard as step 6). Verbatim, with `N` substituted:
258
258
 
259
- > Sidegraph: N record(s) need content review: code changed or a prior check no longer applies —
259
+ > Sidegraph: N record(s) need content review (M new in the last 7 days): code changed or a prior check no longer applies —
260
260
  > task-relevant ones carry a [drifted] tag in retrieval; full list: sidegraph-doctor;
261
261
  > record_drift_check if still true, supersede if no longer true.
262
262
 
263
+ The parenthesised clause counts the records first seen drifted within the last 7 days; it
264
+ reads `(none new in the last 7 days)` when there are none and `(M new since YYYY-MM-DD)`
265
+ while the index is younger than 7 days. A record the store has not stamped counts as unknown
266
+ age, never as new, and the clause is left out whenever it cannot be certified. An index
267
+ built before this version prints no clause on its first day (a zero count that early says
268
+ nothing), `(none new since <date>)` while its stamping is younger than 7 days, and
269
+ `(none new in the last 7 days)` from then on, until a record newly drifts.
270
+
263
271
  `N` counts the whole store; the `[drifted]` tags (see
264
272
  [`concepts/retrieval.md`](../concepts/retrieval.md)) mark only the records a given
265
273
  retrieval call actually surfaces — the line says where each lives. A duplicate