sidegraph 0.17.1__tar.gz → 0.17.3__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 (607) hide show
  1. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/workflows/ci.yml +1 -0
  2. {sidegraph-0.17.1 → sidegraph-0.17.3}/CHANGELOG.md +42 -0
  3. {sidegraph-0.17.1 → sidegraph-0.17.3}/CLAUDE.md +1 -1
  4. {sidegraph-0.17.1 → sidegraph-0.17.3}/PKG-INFO +1 -1
  5. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/ci-cd-maintenance.md +9 -7
  6. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/troubleshooting.md +5 -2
  7. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/graphify.md +14 -2
  8. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/cli.md +11 -1
  9. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/hooks.md +11 -0
  10. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/mcp-tools.md +34 -13
  11. {sidegraph-0.17.1 → sidegraph-0.17.3}/package.json +1 -1
  12. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  13. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  14. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.muse-plugin/plugin.json +1 -1
  15. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/explain-why/SKILL.md +4 -2
  16. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/heal-anchors/SKILL.md +21 -14
  17. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/manage-domains/SKILL.md +5 -6
  18. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/triage-drift/SKILL.md +27 -11
  19. {sidegraph-0.17.1 → sidegraph-0.17.3}/pyproject.toml +1 -1
  20. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/__init__.py +1 -1
  21. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/cli.py +21 -8
  22. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/doctor.py +46 -6
  23. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/githooks.py +152 -30
  24. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/hooks.py +12 -3
  25. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/integrity.py +43 -5
  26. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/server.py +48 -19
  27. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/validation_errors.py +21 -0
  28. sidegraph-0.17.3/tests/githooks_legacy_helper.py +46 -0
  29. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/githooks_support.py +0 -21
  30. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bounded_listings.py +28 -9
  31. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_doctor.py +1 -1
  32. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_code_drift.py +2 -1
  33. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_integrity.py +2 -1
  34. sidegraph-0.17.3/tests/test_doctor_record_identity.py +138 -0
  35. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_stale_instructions.py +2 -0
  36. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_drift_checks.py +46 -0
  37. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_githooks.py +2 -5
  38. sidegraph-0.17.3/tests/test_githooks_atomic_lock.py +246 -0
  39. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_pretool_records.py +30 -0
  40. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity.py +2 -2
  41. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_refresh_hook.py +87 -0
  42. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_readers_format2.py +5 -2
  43. {sidegraph-0.17.1 → sidegraph-0.17.3}/uv.lock +1 -1
  44. {sidegraph-0.17.1 → sidegraph-0.17.3}/.agents/plugins/marketplace.json +0 -0
  45. {sidegraph-0.17.1 → sidegraph-0.17.3}/.claude-plugin/marketplace.json +0 -0
  46. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/CODEOWNERS +0 -0
  47. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  48. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  49. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  50. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  51. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/secret_scanning.yml +0 -0
  52. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/workflows/publish.yml +0 -0
  53. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/workflows/scorecard.yml +0 -0
  54. {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/workflows/session-link-gate.yml +0 -0
  55. {sidegraph-0.17.1 → sidegraph-0.17.3}/.gitignore +0 -0
  56. {sidegraph-0.17.1 → sidegraph-0.17.3}/.gitleaks.toml +0 -0
  57. {sidegraph-0.17.1 → sidegraph-0.17.3}/.opencode/INSTALL.md +0 -0
  58. {sidegraph-0.17.1 → sidegraph-0.17.3}/.pre-commit-config.yaml +0 -0
  59. {sidegraph-0.17.1 → sidegraph-0.17.3}/.python-version +0 -0
  60. {sidegraph-0.17.1 → sidegraph-0.17.3}/AGENTS.md +0 -0
  61. {sidegraph-0.17.1 → sidegraph-0.17.3}/CODE_OF_CONDUCT.md +0 -0
  62. {sidegraph-0.17.1 → sidegraph-0.17.3}/CONTRIBUTING.md +0 -0
  63. {sidegraph-0.17.1 → sidegraph-0.17.3}/LICENSE +0 -0
  64. {sidegraph-0.17.1 → sidegraph-0.17.3}/README.md +0 -0
  65. {sidegraph-0.17.1 → sidegraph-0.17.3}/SECURITY.md +0 -0
  66. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/README.md +0 -0
  67. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/anchoring.md +0 -0
  68. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/data-model.md +0 -0
  69. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/decision-memory.md +0 -0
  70. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/mind-model.md +0 -0
  71. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/retrieval.md +0 -0
  72. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/bootstrap.md +0 -0
  73. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/claude-code-setup.md +0 -0
  74. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/codex-setup.md +0 -0
  75. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/installation.md +0 -0
  76. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/quickstart.md +0 -0
  77. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/adr-export.md +0 -0
  78. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/capturing-decisions.md +0 -0
  79. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/health-check.md +0 -0
  80. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/migrating-to-0.14.md +0 -0
  81. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/migrating-to-0.17.md +0 -0
  82. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/naming-your-domains.md +0 -0
  83. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/retrieval-in-sessions.md +0 -0
  84. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/semantic-docs.md +0 -0
  85. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/surviving-refactors.md +0 -0
  86. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/team-workflow.md +0 -0
  87. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/using-0.15.md +0 -0
  88. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/using-0.16.md +0 -0
  89. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/verifying-your-setup.md +0 -0
  90. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/claude-code.md +0 -0
  91. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/codex.md +0 -0
  92. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/grok.md +0 -0
  93. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/muse.md +0 -0
  94. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/opencode.md +0 -0
  95. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/llms.txt +0 -0
  96. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/README.md +0 -0
  97. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/corpus_fit.py +0 -0
  98. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/judge-prompt.md +0 -0
  99. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/questions-prompt.md +0 -0
  100. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/rubric-template.md +0 -0
  101. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/configuration.md +0 -0
  102. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/git-bindings.md +0 -0
  103. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/operations.md +0 -0
  104. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/releasing.md +0 -0
  105. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/stability.md +0 -0
  106. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/store-format.md +0 -0
  107. {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/whitepaper/index.md +0 -0
  108. {sidegraph-0.17.1 → sidegraph-0.17.3}/index.js +0 -0
  109. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.mcp.json +0 -0
  110. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/codex/hooks.json +0 -0
  111. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/codex/mcp.json +0 -0
  112. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/hooks/hooks.json +0 -0
  113. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  114. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  115. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/compact/SKILL.md +0 -0
  116. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/compact/agents/openai.yaml +0 -0
  117. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  118. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  119. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/health-check/SKILL.md +0 -0
  120. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/health-check/agents/openai.yaml +0 -0
  121. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/health-check/scripts/collect.py +0 -0
  122. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  123. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  124. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  125. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  126. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  127. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  128. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  129. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
  130. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  131. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
  132. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  133. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  134. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  135. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  136. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  137. {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  138. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr.py +0 -0
  139. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr_cli.py +0 -0
  140. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr_files.py +0 -0
  141. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr_identity.py +0 -0
  142. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/anchoring.py +0 -0
  143. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bash_paths.py +0 -0
  144. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/__init__.py +0 -0
  145. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/apply.py +0 -0
  146. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/catalog.py +0 -0
  147. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/cli.py +0 -0
  148. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/integrations.py +0 -0
  149. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/model.py +0 -0
  150. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/planner.py +0 -0
  151. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/proof.py +0 -0
  152. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/review.py +0 -0
  153. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/scan.py +0 -0
  154. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/capture.py +0 -0
  155. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/config.py +0 -0
  156. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/delivery.py +0 -0
  157. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/doc_import.py +0 -0
  158. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/domain_snapshot.py +0 -0
  159. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/domains.py +0 -0
  160. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/drift_checks.py +0 -0
  161. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/engine/__init__.py +0 -0
  162. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/engine/rationale.py +0 -0
  163. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/engine/reader.py +0 -0
  164. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/freshness.py +0 -0
  165. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/gitenv.py +0 -0
  166. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/gitio.py +0 -0
  167. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/__init__.py +0 -0
  168. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/claude_settings.py +0 -0
  169. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/diagnostics.py +0 -0
  170. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/launch.py +0 -0
  171. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/mcp_entry.py +0 -0
  172. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/session_identity.py +0 -0
  173. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/subagent.py +0 -0
  174. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/hot_index.py +0 -0
  175. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/importer.py +0 -0
  176. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/input_limits.py +0 -0
  177. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/maintenance.py +0 -0
  178. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/maintenance_clock.py +0 -0
  179. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/migrate.py +0 -0
  180. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/nearest_anchored.py +0 -0
  181. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/okf.py +0 -0
  182. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/profiles.py +0 -0
  183. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/redaction_scan.py +0 -0
  184. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/redaction_tokens.py +0 -0
  185. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/retrieval.py +0 -0
  186. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/schema.py +0 -0
  187. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/seed_ladder.py +0 -0
  188. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/stats/__init__.py +0 -0
  189. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/stats/model.py +0 -0
  190. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/stats/render.py +0 -0
  191. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store.py +0 -0
  192. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_format.py +0 -0
  193. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_layout.py +0 -0
  194. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_rules.py +0 -0
  195. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_view.py +0 -0
  196. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/sync.py +0 -0
  197. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/text_paths.py +0 -0
  198. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/tool_rate_limit.py +0 -0
  199. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/verify.py +0 -0
  200. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/__init__.py +0 -0
  201. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  202. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/model.py +0 -0
  203. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/render.py +0 -0
  204. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/template.html +0 -0
  205. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/worktree_seeds.py +0 -0
  206. {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/write_boundary.py +0 -0
  207. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/__init__.py +0 -0
  208. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/bounded_listings_support.py +0 -0
  209. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/conftest.py +0 -0
  210. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/drift_checks_support.py +0 -0
  211. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  212. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bitfinex_slice.json +0 -0
  213. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  214. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  215. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  216. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  217. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  218. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/graph.json +0 -0
  219. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  220. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  221. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  222. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  223. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  224. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  225. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  226. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/openspec/graph.json +0 -0
  227. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  228. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  229. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  230. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  231. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  232. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  233. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  234. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  235. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  236. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/sad.md +0 -0
  237. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  238. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  239. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  240. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  241. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  242. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  243. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design.md +0 -0
  244. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  245. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/proposal.md +0 -0
  246. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  247. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  248. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  249. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  250. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  251. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  252. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  253. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  254. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  255. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  256. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  257. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  258. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  259. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/member_names_python_graph.json +0 -0
  260. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/member_names_swift_graph.json +0 -0
  261. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/mini_graph.json +0 -0
  262. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/graph_fixtures.py +0 -0
  263. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/graph_repo_support.py +0 -0
  264. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/membership_support.py +0 -0
  265. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/moved_adoption_support.py +0 -0
  266. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/opencode_plugin_runner.mjs +0 -0
  267. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/snapshot_support.py +0 -0
  268. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/store_format2_support.py +0 -0
  269. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/store_non_file_support.py +0 -0
  270. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/store_record_support.py +0 -0
  271. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_adr.py +0 -0
  272. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_adr_files.py +0 -0
  273. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_adr_identity.py +0 -0
  274. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_agent_brief_manifests.py +0 -0
  275. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchor_descriptor.py +0 -0
  276. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchor_paths.py +0 -0
  277. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchoring.py +0 -0
  278. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchoring_mapping_refresh.py +0 -0
  279. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchoring_membership.py +0 -0
  280. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bash_paths.py +0 -0
  281. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_batch_panel_fixes.py +0 -0
  282. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_apply.py +0 -0
  283. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_catalog.py +0 -0
  284. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_cli.py +0 -0
  285. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
  286. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_integrations.py +0 -0
  287. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_model.py +0 -0
  288. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_planner.py +0 -0
  289. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_proof.py +0 -0
  290. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_review.py +0 -0
  291. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_scan.py +0 -0
  292. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_scan_regular.py +0 -0
  293. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_unanchored.py +0 -0
  294. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_auto_accept.py +0 -0
  295. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_facts.py +0 -0
  296. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_initiative.py +0 -0
  297. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_integration.py +0 -0
  298. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_neighbors.py +0 -0
  299. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_propose.py +0 -0
  300. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_redact.py +0 -0
  301. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_adr.py +0 -0
  302. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_compact.py +0 -0
  303. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_compact_format2.py +0 -0
  304. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_domains.py +0 -0
  305. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_domains_snapshot.py +0 -0
  306. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_graph_paths.py +0 -0
  307. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_import.py +0 -0
  308. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_init.py +0 -0
  309. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_init_hooks.py +0 -0
  310. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_okf.py +0 -0
  311. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_ratify.py +0 -0
  312. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_ratify_facts.py +0 -0
  313. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_stats.py +0 -0
  314. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_store_precedence.py +0 -0
  315. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_sync.py +0 -0
  316. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_sync_check.py +0 -0
  317. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_unreadable_paths.py +0 -0
  318. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_viz.py +0 -0
  319. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_codex_plugin.py +0 -0
  320. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_command_windows.py +0 -0
  321. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_community_baseline.py +0 -0
  322. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_compact_skill.py +0 -0
  323. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_config.py +0 -0
  324. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_config_ancestor_lookup.py +0 -0
  325. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_config_borrowed_graph.py +0 -0
  326. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_corpus_expected_renders.py +0 -0
  327. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_corpus_self_corpus.py +0 -0
  328. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_coverage_telemetry_e2e.py +0 -0
  329. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_delivery_evidence.py +0 -0
  330. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_delivery_stats.py +0 -0
  331. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_delivery_surfaces.py +0 -0
  332. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_digest_integrity.py +0 -0
  333. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doc_corpus_integration.py +0 -0
  334. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doc_import.py +0 -0
  335. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_docs_claims.py +0 -0
  336. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor.py +0 -0
  337. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_auto_share.py +0 -0
  338. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_dangling_supports.py +0 -0
  339. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_duplicate_entity.py +0 -0
  340. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_graph_root_mismatch.py +0 -0
  341. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_graph_stale.py +0 -0
  342. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_never_surfaced.py +0 -0
  343. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_scan.py +0 -0
  344. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_unhashable_payload.py +0 -0
  345. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_unratified_accept.py +0 -0
  346. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domain_seed_names.py +0 -0
  347. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domain_snapshot_format.py +0 -0
  348. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domain_snapshot_notices.py +0 -0
  349. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domains.py +0 -0
  350. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_engine_build.py +0 -0
  351. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entity_duplicate_resolution.py +0 -0
  352. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entity_get_or_create_race.py +0 -0
  353. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entity_twins.py +0 -0
  354. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entry_point_arguments.py +0 -0
  355. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_env_isolation.py +0 -0
  356. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_fact_reachability_gate.py +0 -0
  357. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_file_bound_retrieval.py +0 -0
  358. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_flow_profile.py +0 -0
  359. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_format2_notices.py +0 -0
  360. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_bindings_blame.py +0 -0
  361. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_bindings_hook.py +0 -0
  362. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_bindings_provenance.py +0 -0
  363. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_env.py +0 -0
  364. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_output_utf8.py +0 -0
  365. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_graph_freshness.py +0 -0
  366. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_graphify_pin.py +0 -0
  367. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_health_check_skill.py +0 -0
  368. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_body_compaction.py +0 -0
  369. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_contention.py +0 -0
  370. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_failure_diagnostics.py +0 -0
  371. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_payload_encoding.py +0 -0
  372. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_showings.py +0 -0
  373. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_spawn_guard.py +0 -0
  374. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_agent_brief.py +0 -0
  375. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_agent_state.py +0 -0
  376. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_borrowed_graph.py +0 -0
  377. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_claude_settings.py +0 -0
  378. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_drift_nudge.py +0 -0
  379. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_integrity.py +0 -0
  380. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_launch.py +0 -0
  381. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_pretool.py +0 -0
  382. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_session_key.py +0 -0
  383. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_session_start.py +0 -0
  384. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_session_start_concurrent.py +0 -0
  385. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_stop.py +0 -0
  386. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_subagent_start.py +0 -0
  387. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_subdirectory_launch.py +0 -0
  388. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_touch_events.py +0 -0
  389. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_wiring_checks.py +0 -0
  390. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_index.py +0 -0
  391. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_index_facts.py +0 -0
  392. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_index_hook.py +0 -0
  393. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_path_imports.py +0 -0
  394. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_import_dry_run_preview.py +0 -0
  395. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_importer.py +0 -0
  396. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_index_journal_mode.py +0 -0
  397. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_engine_version.py +0 -0
  398. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_replay.py +0 -0
  399. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_stranded.py +0 -0
  400. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_lazy_root.py +0 -0
  401. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_clock.py +0 -0
  402. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_dry_run_parity.py +0 -0
  403. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_plan.py +0 -0
  404. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_publish.py +0 -0
  405. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_mcp_entry_ratify_policy.py +0 -0
  406. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_mcp_entry_repo_root.py +0 -0
  407. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_member_anchor_wiring.py +0 -0
  408. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_merge_matrix_format2.py +0 -0
  409. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_migrate.py +0 -0
  410. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_mind_model_additive_fields.py +0 -0
  411. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_muse_plugin.py +0 -0
  412. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_nearest_anchored.py +0 -0
  413. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_okf.py +0 -0
  414. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_opencode_plugin.py +0 -0
  415. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_openspec_profile.py +0 -0
  416. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_pathless_descriptor_adoption.py +0 -0
  417. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_pilot_kit_corpus_fit.py +0 -0
  418. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_portable_json.py +0 -0
  419. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_private_tests_isolation.py +0 -0
  420. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_proposal_lifecycle.py +0 -0
  421. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_public_hook_launch.py +0 -0
  422. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_ratify_listing_gone_dark.py +0 -0
  423. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_ratify_policy.py +0 -0
  424. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_rationale_compatibility.py +0 -0
  425. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_community_labels.py +0 -0
  426. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_doc_nodes.py +0 -0
  427. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_engine_version.py +0 -0
  428. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_file_labels.py +0 -0
  429. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_graph.py +0 -0
  430. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_integration.py +0 -0
  431. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_label_conventions.py +0 -0
  432. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_member_name_lookup.py +0 -0
  433. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_member_names.py +0 -0
  434. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_nodes_in_file.py +0 -0
  435. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_perf.py +0 -0
  436. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_rationale.py +0 -0
  437. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_read.py +0 -0
  438. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_resolve.py +0 -0
  439. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_stub_collapse.py +0 -0
  440. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_subdir_mismatch.py +0 -0
  441. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_type_split.py +0 -0
  442. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_version.py +0 -0
  443. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_rebuild_instruction.py +0 -0
  444. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_redaction_scan.py +0 -0
  445. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_redaction_seeded.py +0 -0
  446. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_redaction_tokens.py +0 -0
  447. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_repo_relative_paths_portable.py +0 -0
  448. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_repoint_integration.py +0 -0
  449. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_budget_counters.py +0 -0
  450. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_context.py +0 -0
  451. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_drift_marker.py +0 -0
  452. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_drilldown.py +0 -0
  453. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_facts.py +0 -0
  454. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_guessed.py +0 -0
  455. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_ids.py +0 -0
  456. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_integration.py +0 -0
  457. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_membership_generations.py +0 -0
  458. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_membership_index.py +0 -0
  459. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_rank.py +0 -0
  460. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_seeds.py +0 -0
  461. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_shown_ids.py +0 -0
  462. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_terminal_evidence.py +0 -0
  463. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_thin_tools.py +0 -0
  464. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_toc.py +0 -0
  465. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_toptier.py +0 -0
  466. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_unratified.py +0 -0
  467. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_schema_descriptor.py +0 -0
  468. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_schema_domain.py +0 -0
  469. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_schema_fact.py +0 -0
  470. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_capture_diagnostics.py +0 -0
  471. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_capture_limits.py +0 -0
  472. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_cli_diagnostics.py +0 -0
  473. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_doc_limits.py +0 -0
  474. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_input_limits.py +0 -0
  475. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_mcp_write_diagnostics.py +0 -0
  476. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_numeric_enums.py +0 -0
  477. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_python_shapes.py +0 -0
  478. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_redaction_cursor.py +0 -0
  479. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_validation_errors.py +0 -0
  480. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_write_boundary.py +0 -0
  481. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_seed_ladder.py +0 -0
  482. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_seed_paths_portable.py +0 -0
  483. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_add_anchors.py +0 -0
  484. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_anchoring.py +0 -0
  485. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_annotations.py +0 -0
  486. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_argument_names.py +0 -0
  487. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_borrowed_graph.py +0 -0
  488. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_capture.py +0 -0
  489. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_commit_hint.py +0 -0
  490. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_coverage_events.py +0 -0
  491. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_decision_listing.py +0 -0
  492. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_domains.py +0 -0
  493. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_drilldown.py +0 -0
  494. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_facts.py +0 -0
  495. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_find_entity.py +0 -0
  496. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_get_store.py +0 -0
  497. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_get_task_context.py +0 -0
  498. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_graph_freshness.py +0 -0
  499. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_graph_path.py +0 -0
  500. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_import.py +0 -0
  501. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_invocation_policy.py +0 -0
  502. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_mcp_smoke.py +0 -0
  503. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_nearest_anchored.py +0 -0
  504. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_prewrite_anchor_validation.py +0 -0
  505. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_ratify_facts.py +0 -0
  506. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_record_types.py +0 -0
  507. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_redaction.py +0 -0
  508. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_refresh.py +0 -0
  509. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_render_events.py +0 -0
  510. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_result_contract.py +0 -0
  511. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_supersede.py +0 -0
  512. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_sync_anchors.py +0 -0
  513. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_telemetry.py +0 -0
  514. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_thin_tools.py +0 -0
  515. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_tolerant_seeds.py +0 -0
  516. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_verify.py +0 -0
  517. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_session_attribution.py +0 -0
  518. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_skill_frontmatter.py +0 -0
  519. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_graph.py +0 -0
  520. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_health.py +0 -0
  521. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_model.py +0 -0
  522. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_render.py +0 -0
  523. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_skill.py +0 -0
  524. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_snapshot.py +0 -0
  525. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stop_hot_path.py +0 -0
  526. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stop_rearm.py +0 -0
  527. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store.py +0 -0
  528. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_agent_state.py +0 -0
  529. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_atomic_write_tmp_names.py +0 -0
  530. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_bad_file.py +0 -0
  531. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_binding_index.py +0 -0
  532. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_canonical_stat.py +0 -0
  533. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_compact.py +0 -0
  534. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_coverage_telemetry.py +0 -0
  535. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_cross_process_mutations.py +0 -0
  536. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_derived_community.py +0 -0
  537. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_domain_members.py +0 -0
  538. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_domains.py +0 -0
  539. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_entities.py +0 -0
  540. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_fact_cascade.py +0 -0
  541. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_facts.py +0 -0
  542. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_file_anchor_names.py +0 -0
  543. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format.py +0 -0
  544. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format2_load.py +0 -0
  545. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format2_marker.py +0 -0
  546. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format2_writes.py +0 -0
  547. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_git_root_symlink.py +0 -0
  548. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_inventory.py +0 -0
  549. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_meta.py +0 -0
  550. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_migration.py +0 -0
  551. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_mutation_guard.py +0 -0
  552. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_mutation_immediate.py +0 -0
  553. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_non_file_entries.py +0 -0
  554. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  555. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_persistence.py +0 -0
  556. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_ratification.py +0 -0
  557. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_rebuild_atomicity.py +0 -0
  558. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_record_identity.py +0 -0
  559. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_record_types.py +0 -0
  560. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_render_events.py +0 -0
  561. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_requirement.py +0 -0
  562. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_retrieval.py +0 -0
  563. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_rules.py +0 -0
  564. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_slug_conflicts.py +0 -0
  565. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_snapshot_wiring.py +0 -0
  566. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_stamping_marker.py +0 -0
  567. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_symlinks.py +0 -0
  568. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_telemetry.py +0 -0
  569. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_threading.py +0 -0
  570. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_tmp_sweep_age.py +0 -0
  571. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_update_meta_if.py +0 -0
  572. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_subagent_start_manifests.py +0 -0
  573. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_subprocess_text_encoding.py +0 -0
  574. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_canonical_writes.py +0 -0
  575. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_clean.py +0 -0
  576. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_domains.py +0 -0
  577. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_drift_cache.py +0 -0
  578. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_fresh_clone.py +0 -0
  579. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_integration.py +0 -0
  580. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_membership.py +0 -0
  581. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_moved_adoption.py +0 -0
  582. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_rebind.py +0 -0
  583. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_repoint.py +0 -0
  584. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_report_has_findings.py +0 -0
  585. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_run.py +0 -0
  586. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_snapshot_membership.py +0 -0
  587. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_toc_cache.py +0 -0
  588. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_volatile_heal.py +0 -0
  589. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_wiring.py +0 -0
  590. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_telemetry_retention.py +0 -0
  591. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_text_paths.py +0 -0
  592. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_domain_snapshot.py +0 -0
  593. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_format2_against.py +0 -0
  594. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_format2_snapshot.py +0 -0
  595. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_git_framing.py +0 -0
  596. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_git_revisions.py +0 -0
  597. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_git_stdin.py +0 -0
  598. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_snapshot.py +0 -0
  599. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_transitions.py +0 -0
  600. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_asset_packaged.py +0 -0
  601. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_model.py +0 -0
  602. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_render_html.py +0 -0
  603. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_render_json.py +0 -0
  604. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_worktree_seeds.py +0 -0
  605. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/wheel_server_trace.py +0 -0
  606. {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/wheel_smoke.py +0 -0
  607. {sidegraph-0.17.1 → sidegraph-0.17.3}/tools/check_no_session_links.py +0 -0
@@ -201,6 +201,7 @@ jobs:
201
201
  tests/test_hot_index_facts.py `
202
202
  tests/test_delivery_evidence.py tests/test_delivery_stats.py tests/test_delivery_surfaces.py `
203
203
  tests/test_git_output_utf8.py `
204
+ tests/test_githooks_atomic_lock.py::test_windows_pid_probe_is_never_a_signal_from_python `
204
205
  tests/test_health_check_skill.py `
205
206
  $privateTests
206
207
  if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
@@ -7,6 +7,48 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.17.3] — 2026-10-26
11
+
12
+ ### Fixed
13
+
14
+ - Graph refresh hooks acquire both the runner lock and stale-breaker gate with exclusive
15
+ shell PID files. Concurrent hooks remain serialized on systems whose external `mkdir`
16
+ can report success to two racing callers, while live legacy directory locks are respected.
17
+ - Installer cleanup coordinates with the same breaker gate and preserves a lock whose owner
18
+ changed during its PID check. Optional native-lock failures no longer prevent publishing
19
+ an updated helper, and a failed gate PID write no longer leaves a permanent gate.
20
+ - Doctor detects the complete older directory-lock helper; plain `sidegraph-init` repairs
21
+ it while keeping hook bytes and the recorded choice. Automatic detection conservatively
22
+ preserves unfamiliar scripts and quoted examples. Run `sidegraph-init` after upgrading
23
+ in each clone that uses the old helper.
24
+ - Native Windows installer cleanup leaves PID-bearing locks untouched, instead of using
25
+ Python signal probes on process ids from a potentially different POSIX-shell namespace.
26
+
27
+ ## [0.17.2] — 2026-10-25
28
+
29
+ ### Fixed
30
+
31
+ - Doctor identifies per-record advisory findings with `record_id` and `record_type` in
32
+ JSON and prints the subject beside its physical path in text. Decisions sharing one
33
+ packed shard, source file and capture commit can now be triaged separately. This also
34
+ covers never-surfaced, orphaned-record, binding and other record findings; global notes
35
+ remain subjectless. Fixes [#1](https://github.com/SantyagoSeaman/sidegraph/issues/1).
36
+ - MCP domain-listing hints use the local Store API for oversized records, including packed
37
+ domains, and pending-proposal hints explain the visibility policy instead of promising
38
+ that an explicit id can bypass it.
39
+ - Drift checks distinguish missing required anchor files, absent checkable anchors and
40
+ untracked inspected paths with safe fixed diagnostics. Missing-scope errors explain how
41
+ to inspect the full anchor scope locally without reading SQLite. Unavailable anchor
42
+ entities and failed Git scope lookups get specific diagnostics before any check is published.
43
+ - Ratification refusals explain that an accepted decision or fact is not proposed. The
44
+ drift and anchor playbooks no longer recommend dropping accepted decisions, and clarify
45
+ that drift markers appear in formatted context rather than raw decision-listing JSON.
46
+ - PreToolUse refuses delivery before claiming files if a record-selection read fails.
47
+ Concurrent zero-wait hooks therefore cannot skip an unreadable early file and consume
48
+ different three-file sets from the same command.
49
+ - Complete the headless anchor-healing example's write-tool deny list with drift-check
50
+ writes and domain proposals.
51
+
10
52
  ## [0.17.1] — 2026-10-25
11
53
 
12
54
  ### Security
@@ -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.17.1) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.17.3) — the full loop (capture, ratification, mistakes-first
17
17
  retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
18
18
  facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
19
19
  a stable release. See
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sidegraph
3
- Version: 0.17.1
3
+ Version: 0.17.3
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
@@ -10,9 +10,10 @@ unattended.
10
10
 
11
11
  1. **CI never ratifies.** Nothing in these recipes calls `ratify`/`sidegraph-ratify --accept`
12
12
  (or `--drop`, for that matter). A scheduled job may *propose* a superseding decision
13
- (`propose_decisions` with `supersedes`) or *recommend* a drop in its summary, but turning
14
- a proposal into an accepted/rejected terminal state stays a human action, every
15
- time. See [`heal-anchors`](../../plugin/sidegraph/skills/heal-anchors/SKILL.md#triage-decision-tree-add_anchors-propose_decisions-or-recommend-a-drop)
13
+ (`propose_decisions` with `supersedes`) or report obsolete subjects in its summary.
14
+ Recommend drop only for proposed decisions/facts or a supported domain drop; accepted
15
+ decisions without a meaningful successor retain their history. A proposal verdict
16
+ stays a human action. See [`heal-anchors`](../../plugin/sidegraph/skills/heal-anchors/SKILL.md#triage-decision-tree-re-anchor-supersede-or-report-an-obsolete-subject)
16
17
  for the triage tree these jobs run. An auto-ratification policy would break this rule
17
18
  without any `ratify` call — the transition rides `propose_decisions` itself, which the
18
19
  deny list below cannot block. Legacy `SIDEGRAPH_AUTO_ACCEPT=on` bypasses the queue too.
@@ -316,9 +317,10 @@ jobs:
316
317
  claude -p 'Run the heal-anchors playbook: call sync_anchors(force=True), then for
317
318
  every orphaned/ambiguous entity and every stale decision, follow the triage tree —
318
319
  add_anchors for code that moved, propose_decisions(supersedes=...) for content
319
- that is genuinely outdated, and a plain-text recommendation (never a tool call)
320
- for anything to drop. Summarize every action taken and every recommendation at
321
- the end.' \
320
+ that is genuinely outdated, and a status-aware summary for obsolete subjects.
321
+ Recommend drop only for proposed decisions/facts or a supported domain drop;
322
+ retain accepted decision history when there is no meaningful successor.
323
+ Summarize every action taken and recommendation at the end.' \
322
324
  --model "$SIDEGRAPH_TRIAGE_MODEL" \
323
325
  --mcp-config mcp-config.json --strict-mcp-config \
324
326
  --allowedTools "mcp__sidegraph__sync_anchors mcp__sidegraph__find_entity mcp__sidegraph__query_structure mcp__sidegraph__query_decisions mcp__sidegraph__add_anchors mcp__sidegraph__propose_decisions mcp__sidegraph__list_proposed mcp__sidegraph__retrieve_decisions mcp__sidegraph__get_entity_history mcp__sidegraph__list_facts mcp__sidegraph__verify_store" \
@@ -355,7 +357,7 @@ CLI default.
355
357
 
356
358
  Do not add `--permission-mode bypassPermissions`: it disables both tool lists. The
357
359
  `--disallowedTools` list is the ratification guard: it names the tools that ratify or write a
358
- record directly and the one that records a drift check. The allowlist only narrows normal MCP
360
+ record directly, records a drift check, or proposes a domain. The allowlist only narrows normal MCP
359
361
  access and can be widened by ambient host settings. Keep both. Read-only built-in
360
362
  tools can still inspect the checkout in a headless run; the troubleshooting note below states
361
363
  that boundary explicitly. The matching
@@ -222,8 +222,11 @@ entity file is skipped, an anchor to the same name mints a second entity; once t
222
222
 
223
223
  ### refresh-helper-outdated
224
224
 
225
- A git hook runs a graph refresh helper that starts Graphify without `GRAPHIFY_NO_AUTO_REFRESH=1`
226
- (an older Sidegraph wrote it). Graphify 0.9.87 and later refresh the agent skills they installed,
225
+ A git hook runs an older graph refresh helper that uses directory-based locking, or starts
226
+ Graphify without `GRAPHIFY_NO_AUTO_REFRESH=1`.
227
+ The directory lock can admit overlapping rebuilds with uutils `mkdir`; the replacement uses
228
+ exclusive PID files for both the runner lock and the stale-breaker gate.
229
+ Graphify 0.9.87 and later refresh the agent skills they installed,
227
230
  such as `~/.claude/skills/graphify/`, on the first run after a Graphify upgrade unless that
228
231
  variable is set. One hook that runs the helper is enough for the check to fire, and a recorded "no"
229
232
  does not silence it. Run `sidegraph-init` with no flag: it rewrites the helper and keeps your
@@ -242,13 +242,25 @@ the `/graphify` skill's `--update` form).
242
242
  [above](#linked-worktrees-read-the-main-checkouts-graph)), so a commit in one does nothing.
243
243
  Rebuilding there as well costs about 18 MB and 43 s for a cold build on one field corpus with
244
244
  25 worktrees, and agents commit in worktrees constantly.
245
- - **In the background, one at a time.** Git never waits for the rebuild. A lock directory keeps
245
+ - **In the background, one at a time.** Git never waits for the rebuild. An exclusively created PID file keeps
246
246
  one rebuild running; a hook that fires while it runs makes it go once more when it finishes, so
247
247
  the graph never settles on a tree older than the last request. A lock left by a job that died
248
248
  is detected and cleared: by its pid, or, when the job died before writing one (a full disk, a
249
- quota), by its age, ten minutes. `sidegraph-init --hooks` clears such a lock at once. One risk
249
+ quota), by its age, ten minutes. Re-running `sidegraph-init --hooks` refreshes the helper and clears a dead lock;
250
+ a fresh lock without a PID is kept until the ten-minute grace period expires. One risk
250
251
  remains: after a reboot a pid can belong to a live, unrelated process, and the hook then waits
251
252
  until that process exits.
253
+ Plain `sidegraph-init` also repairs an outdated helper in use, keeping the recorded choice.
254
+ Older helpers used lock directories; the new helper respects a live old runner and can
255
+ recover its stale directory. Both the lock and the stale-breaker gate now use shell
256
+ exclusive creation, so locking does not depend on external `mkdir`.
257
+ Installer cleanup takes the same breaker gate before removing a dead runner lock. A small
258
+ native OS lock on `sidegraph-graph-refresh.repair` serializes installers while they recover
259
+ a dead gate; the coordination file stays in the common git directory to keep a stable inode.
260
+ Where native locks are unsupported, helper publication still proceeds and optional installer
261
+ cleanup is skipped. On Windows, PID-bearing locks are left to the POSIX helper to recover,
262
+ because its PIDs need not be native Windows PIDs. Installing or repairing a helper does not
263
+ itself start a rebuild.
252
264
  - **Where the output goes.** The last rebuild's output is `sidegraph-graph-refresh.log` in the
253
265
  common git directory (`.git/` in a normal clone).
254
266
  - **No `sidegraph-sync` in the hook.** The next memory call notices the new graph version and
@@ -1562,7 +1562,7 @@ plain-text line):
1562
1562
  | `orphaned-record` | an open (`proposed`/`accepted`) decision or fact whose every Tier-2 (leaf) anchor is `orphaned`, so retrieval reaches it only through its file or domain; one finding per record, at its canonical file, naming how many leaf anchors it has. Statuses come from `index.db` and read "as of last sync", so the check is skipped while the statuses are not computed for the current graph (see *Skipped checks* below; run `sidegraph-sync`). It is the record-level view of `orphaned-binding` (any record it flags has orphaned bindings, which that code already reports), so it adds no new reason for `--check` to exit `2`. The fix is to rebuild a stale graph, then `sidegraph-sync`; otherwise re-anchor the record with `add_anchors` or the `heal-anchors` skill, or supersede it if the code is gone. Needs a usable `index.db` |
1563
1563
  | `store-uncommitted` | store files nobody committed for at least 24 hours: records, bindings, entities, an archive segment or the root files (`format`, `.gitignore`, `stamping_live_since`) that `git status` shows as new, modified or deleted. One finding, at the store path, naming how many files there are, how old the oldest is and what kinds they are (a new `archive/` segment beside deleted records reads as "a compaction"). A new record or entity file is aged by its ULID name, which a `git stash` cannot rewrite; a modified file, or anything under `bindings/`, by its modification time; a deleted file by its subdirectory's, a lower bound. Entries fully staged in the index are not counted, so a `--check` run in a pre-commit hook does not block the commit that fixes the problem. **`--check` exits `2` on it.** The fix is to commit the store in a pull request. Silent, and not run, outside a git repository, with no `git`, or when git is slower than 2 seconds |
1564
1564
  | `plugin-off-in-subdirectories` | Claude Code sessions started below the repository root run without the Sidegraph plugin. Claude Code reads the project settings (`.claude/settings.json`) of the launch directory only, and the repository root's `.claude/settings.local.json` for every launch inside the repository; `enabledPlugins` merges key by key (user settings, then project, then local). Two problems, reported as up to two findings: (a) the plugin is enabled only in the root's `.claude/settings.json`, so every directory below the root without its own enabling settings runs without it (reported at that file); (b) nested directories with a `.claude/settings.json` or `.claude/settings.local.json` of their own that sets `enabledPlugins` and whose merge leaves the plugin off (reported at the first such directory, naming how many there are; a nested settings file without `enabledPlugins` cannot change the merge, so it is not counted). The walk covers every directory that holds a tracked file (one `git ls-files` over the index, a few tens of milliseconds on a large repository) and looks for the two settings files in each directly, so a repository that ignores `.claude/` is covered. User settings are read from `$CLAUDE_CONFIG_DIR/settings.json` when that variable is set and non-empty, else from `~/.claude/settings.json`. Silent when the plugin is not enabled for a launch at the root at all, and not run outside a git repository, with no `git`, or when `git ls-files` takes longer than 5 seconds. **`--check` exits `2` on it**, like any finding; enabling the plugin at user scope or in the root's `.claude/settings.local.json` clears it |
1565
- | `refresh-helper-outdated` | a git hook runs a graph refresh helper whose Graphify line lacks `GRAPHIFY_NO_AUTO_REFRESH=1` (an older Sidegraph wrote it), so Graphify 0.9.87 and later can rewrite the agent skills they installed on the first rebuild after an upgrade. Advisory, per clone (the helper lives in `.git/hooks`); **`--check` exits `2` on it**, like any finding. One hook that runs the helper is enough, and a recorded decline does not silence it. The fix is `sidegraph-init` (no flag), which refreshes the helper and keeps a recorded hook choice. Silent outside a git repository, with no helper, or when no hook runs it |
1565
+ | `refresh-helper-outdated` | a git hook runs an older graph refresh helper that uses directory-based locking (unsafe with uutils `mkdir`), or whose Graphify line lacks `GRAPHIFY_NO_AUTO_REFRESH=1` (Graphify 0.9.87 and later can rewrite installed agent skills after an upgrade). Advisory, per clone (the helper lives in `.git/hooks`); **`--check` exits `2` on it**, like any finding. One hook that runs the helper is enough, and a recorded decline does not silence it. The fix is `sidegraph-init` (no flag), which refreshes the helper and keeps a recorded hook choice. Silent outside a git repository, with no helper, or when no hook runs it |
1566
1566
  | `engine-version` | the graph was built by a Graphify release this Sidegraph was not tested with (its `graph.graphify_version` stamp is neither absent nor in the tested set), so anchors and domains may read differently. Advisory; **`--check` exits `2` on it**, like any finding. Pin Graphify to a tested release listed under [Engine version pinning](../integrations/graphify.md#engine-version-pinning), then rebuild the graph. It also fires for a mention-edge graph (Graphify 0.9.62 or later) over a store without a minimum Sidegraph version; follow the [0.14 migration guide](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/guides/migrating-to-0.14.md). A malformed marker leaves this second case silent. Silent without a readable graph |
1567
1567
  | `store-not-migrated` | the store uses the pre-0.17 layout (a format marker below major 2) and holds at least one record of any kind (initiatives included). One finding, at the store path, naming `sidegraph-migrate` (run on the default branch, after the team checklist in the [0.17 migration guide](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/guides/migrating-to-0.17.md)) and the `sidegraph:compact` skill. Degraded; **`--check` exits `2` on it**, like any finding. Silent on an empty store and on a store that is already format 2 |
1568
1568
  | `maintenance-due` | a format-2 store that `sidegraph-compact` would tidy: more than 200 per-record files, or a legacy `archive/` segment it would delete, or a misplaced or duplicated shard line, or a stray shard file. `sidegraph-verify` does not report these; maintenance heals them. A segment kept because one of its lines is not safe to delete does not count. Advisory; **`--check` exits `2` on it**, like any finding. Run `sidegraph-compact` on the default branch. Silent on a store that is not format 2 |
@@ -1617,6 +1617,16 @@ neither flagged nor cleared. `drill_down` does record a `domain:<slug>` seed, bu
1617
1617
  consumes it yet; its *shows* count normally, so surfacing only through a domain drill-down
1618
1618
  still protects a decision from a false flag.
1619
1619
 
1620
+ Each JSON finding has `code`, `path`, `detail`, `record_id` and `record_type`.
1621
+ Per-record findings carry their logical identity (`decision`, `fact`, `entity`, `domain`,
1622
+ or `bindings`); global notes have null record fields. A malformed raw record whose id
1623
+ cannot be read also has a null subject; use its violation and physical path for repair. `path` retains the physical source,
1624
+ including a shared shard or archive segment, so it is not a record locator. Text prints
1625
+ `<code> <record_type>:<record_id> <path> <detail>` for identified subjects; global notes
1626
+ omit the subject column. `duplicate-entity` identifies the selected lowest-id entity;
1627
+ its detail names the other members. A `bindings` subject uses the bound record's id.
1628
+ Use `record_id` to retrieve or check a drifted decision; do not parse the shard or detail.
1629
+
1620
1630
  `clean` is `true` only when both `violations` and `findings` are empty.
1621
1631
 
1622
1632
  **Skipped checks.** A check that cannot look says so and is never a finding: it affects neither
@@ -402,6 +402,13 @@ raises costs only its own line.
402
402
  > installed on the first rebuild after an upgrade. Ask the user to run `sidegraph-init`,
403
403
  > which refreshes the helper and keeps their recorded hook choice; do not run it unasked.
404
404
 
405
+ A helper using the old directory-based lock is also reported: uutils `mkdir` can admit
406
+ overlapping rebuilds. `sidegraph-init` replaces it with exclusive PID-file locking while
407
+ preserving hook bytes and the recorded choice. The outdated-helper check recognizes concrete defects in simple shell helpers,
408
+ rather than comparing the whole template. It conservatively skips unfamiliar scripts with
409
+ heredocs or multiline quotes. This controls automatic defect repair; an ordinary init
410
+ that refreshes a fully installed hook still rewrites its managed helper.
411
+
405
412
  It also sends a notice for the person. See
406
413
  [`refresh-helper-outdated`](../guides/troubleshooting.md#refresh-helper-outdated).
407
414
  15. **Refresh-hook line.** When no git hook keeps the graph fresh, one line tells the model to
@@ -832,6 +839,10 @@ permission flow, untouched:
832
839
  session's own agent, so the main agent's keys do not start with any subagent's prefix. The value
833
840
  is the claim's ISO timestamp. These keys are deliberately **not** the `Stop` hook's
834
841
  `capture_sessions` ledger, so the guards can't consume each other.
842
+ If any record-selection read fails, the hook refuses this delivery before claiming any
843
+ file. An unreadable early file is not treated as an empty one: otherwise parallel hooks
844
+ could choose different triples from the same command. A later clean call may deliver
845
+ the files because this refusal consumes no per-file claim or showing.
835
846
  7. If at least one claim succeeded, the winner emits one non-blocking, `additionalContext`-only
836
847
  block for the files it won:
837
848
 
@@ -765,8 +765,10 @@ hundreds of records, so the answer fills in this order:
765
765
  `omitted_ids_unlisted` counts ids the budget cut as well.
766
766
 
767
767
  Nothing is dropped silently: a superseded record is at worst a short row or a bare id. Read an
768
- omitted decision with `retrieve_decisions(ids=[...])` and an omitted fact with
769
- `list_facts(ids=[...])`, or narrow with `status=[...]` (for example `["superseded"]`).
768
+ omitted decision locally with `Store.get_decision(id)` and an omitted fact with
769
+ `Store.get_fact(id)` on the configured store, or narrow with `status=[...]` (for example
770
+ `["superseded"]`). Explicit-id `retrieve_decisions`/`list_facts` calls still obey the
771
+ proposal-surfacing policy and may omit older or regulated-mode proposals.
770
772
  `omitted_records` and `omitted_ids` appear only when something was left out.
771
773
 
772
774
  ## `get_task_context`
@@ -1228,10 +1230,13 @@ initial prefix of complete rows, sorted by slug. Each row retains the existing f
1228
1230
  "seed_anchor_count", "parent_slug", "child_slugs"}`. `member_count` remains
1229
1231
  `len(domain.communities)`. Parent/child lineage comes from the full store even when filters
1230
1232
  exclude relatives. When the character budget omits rows, `hint` identifies the effective bound,
1231
- suggests filters, and names a bounded relative local-file fallback for the next omitted domain
1232
- (`domains/<id>.json`). That file exists only while the domain is stored as a per-record file;
1233
- once maintenance has packed it into a shard (store format 2), narrow with `status`, `query` or
1234
- `ids` instead of following the path.
1233
+ suggests filters, and names a bounded local Python fallback for the next omitted domain:
1234
+ `Store.get_domain("<id>")` on the configured store. It returns the full model, including
1235
+ `seed_anchors`, for both per-record and packed layouts. Open the configured store with
1236
+ `with Store(store_path) as store:` and call `store.get_domain(id)`; a domain may no longer
1237
+ have an individual `.json` file. If the id itself cannot fit the hint, use
1238
+ `Store.iter_domains()`. This local Store access can rebuild the derived index; it is distinct
1239
+ from the read-only MCP listing.
1235
1240
  When `limit` cuts the list, the hint suggests filters and raising `limit` only below 100. Empty
1236
1241
  stores say `No domains in the store.`; empty filtered matches name active filter keys without
1237
1242
  echoing their values. This is the provisional MCP return shape and sends no output schema or
@@ -1494,12 +1499,14 @@ When the queue does not fit, the first line counts it (`Pending: 31 decisions, 4
1494
1499
  domains. Showing 18 decisions, 0 facts, 2 domains.`), the sections fill in order with the
1495
1500
  blocks that fit (a block that does not fit is skipped and the fill goes on), and the end lists
1496
1501
  what is missing, in the order of the blocks, as `<id> <title head>` entries (then `and N more
1497
- ids`). `ratify` accepts an id you have not read, so nothing is out of reach. The end also says how to read
1498
- an item that is not shown (`retrieve_decisions(ids=[...])`, `list_facts(ids=[...])`,
1499
- `list_domains(status="proposed")`). Those reads obey the proposal window
1500
- (`SIDEGRAPH_PROPOSAL_WINDOW_DAYS`), so a proposed decision or fact older than the window is not
1501
- returned by id; read it with `sidegraph-ratify` without flags, which lists every pending
1502
- proposal. Ratify what is shown, then call again, or raise `budget_chars`.
1502
+ ids`). Read every item before deciding its verdict. The hint explains that decision
1503
+ or fact proposals may be hidden from `retrieve_decisions`/`list_facts` by the proposal
1504
+ window or regulated mode;
1505
+ explicit ids do not bypass that policy. Inspect omitted decisions locally with
1506
+ `Store.get_decision(id)` and omitted facts with `Store.get_fact(id)` on the configured
1507
+ store, or use `sidegraph-ratify` without flags for the full pending queue. Domains use
1508
+ `list_domains(status="proposed")`. Ratify what is shown, then call again, or raise
1509
+ `budget_chars`.
1503
1510
 
1504
1511
  **Returns:** a plain-text string.
1505
1512
 
@@ -1556,6 +1563,12 @@ makes `bootstrap → ratify` turn the TOC on in the same session, without waitin
1556
1563
  two only ever appear for a fact id that rode a decision's cascade rather than being named
1557
1564
  directly.
1558
1565
 
1566
+ Decisions and facts can be accepted or dropped only while `proposed`. A refusal names
1567
+ the existing status; an accepted decision cannot be retired through `drop`. Propose a
1568
+ meaningful supersession when the recorded claim becomes obsolete. If no successor exists,
1569
+ report that limitation and retain history rather than editing canonical status fields.
1570
+ Domain drop has its separate accepted-domain exception.
1571
+
1559
1572
  ## `ratify_decisions` (deprecated)
1560
1573
 
1561
1574
  ```python
@@ -1815,7 +1828,15 @@ that exact HEAD; unrelated dirty files do not block the check. All current check
1815
1828
  concrete anchor files are required; explicitly inspected dependencies may extend coverage.
1816
1829
  Unknown binding status conservatively includes existing committed anchor paths. Abstract-only,
1817
1830
  unstamped, skipped or terminal subjects, missing Git HEAD, incomplete scope and dirty
1818
- inspected files are refused without a new check. Existing safe write diagnostics apply.
1831
+ inspected files are refused without a new check. Missing required anchors return the
1832
+ fixed code `missing_required_files`, distinct from `no_checkable_files` and `untracked_files`.
1833
+ To inspect the scope locally without querying SQLite, open the configured Store, call
1834
+ `store.bindings_for_record(decision_id)`, and resolve each `binding.entity_id` with
1835
+ `store.get_entity(...)`; inspect the descriptors' file paths and current Git entries.
1836
+ Include every current checkable concrete anchor, not just doctor's changed-file subset.
1837
+ An unloadable required entity returns `unavailable_anchor_scope`; a failed initial Git
1838
+ scope lookup returns `git_scope_unavailable`. Both refusals occur before check publication.
1839
+ Write errors keep their bounded schema vocabulary and do not echo file names or raw causes.
1819
1840
 
1820
1841
  The result names `id`, `decision_id`, `checked_commit`, `required_files`, `checked_files`,
1821
1842
  `provenance`, `cache_cleared` and `redactions`. `cache_cleared` only says whether an existing
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sidegraph",
3
- "version": "0.17.1",
3
+ "version": "0.17.3",
4
4
  "type": "module",
5
5
  "exports": "./index.js"
6
6
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sidegraph",
3
3
  "displayName": "Sidegraph",
4
- "version": "0.17.1",
4
+ "version": "0.17.3",
5
5
  "description": "Durable decision/lessons memory over your code graph — ADRs, gotchas, and constraints that survive refactors, retrieved mistakes-first.",
6
6
  "author": { "name": "SantyagoSeaman", "url": "https://github.com/SantyagoSeaman" },
7
7
  "homepage": "https://github.com/SantyagoSeaman/sidegraph",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sidegraph",
3
- "version": "0.17.1",
3
+ "version": "0.17.3",
4
4
  "description": "Durable decision/lessons memory over your code graph — ADRs, gotchas, and constraints that survive refactors, retrieved mistakes-first.",
5
5
  "license": "Apache-2.0",
6
6
  "skills": "./skills/",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "name": "sidegraph",
4
- "version": "0.17.1",
4
+ "version": "0.17.3",
5
5
  "description": "Durable decisions, facts and lessons over your code graph.",
6
6
  "compat": {
7
7
  "source": "native",
@@ -45,8 +45,10 @@ accepted it yet — present it as a proposal, not settled memory.
45
45
 
46
46
  `get_entity_history` returns superseded records too — that's the point. On a long-lived
47
47
  entity the newest records come in full and the rest as short rows (`omitted_records`) or bare
48
- ids (`omitted_ids`): read one with `retrieve_decisions(ids=[...])` / `list_facts(ids=[...])`, or
49
- narrow with `status=["superseded"]`. The answer to a
48
+ ids (`omitted_ids`). Explicit-id `retrieve_decisions` / `list_facts` calls obey the
49
+ proposal-surfacing policy and can omit old or regulated-mode proposals. For complete local
50
+ records use `Store.get_decision(id)` / `Store.get_fact(id)` on the configured store, or
51
+ narrow history with `status=["superseded"]`. The answer to a
50
52
  why-question has two layers, and the reader deserves both, clearly separated:
51
53
 
52
54
  1. **Current truth** — the live (`accepted`) records: the standing decision, its
@@ -74,6 +74,9 @@ store write or a source change: confirm before acting.
74
74
  with **explicit fresh `anchors` pointing at the successor code**. Do NOT omit
75
75
  `anchors` here: omitting inherits the predecessor's bindings verbatim — *including
76
76
  their orphaned status* — which reproduces exactly the problem you're healing.
77
+ If an accepted decision has no meaningful successor, report the obsolete subject to
78
+ the human and retain its history. `ratify(drop=...)` rejects only proposed decisions
79
+ and facts; it cannot retire an accepted decision. Do not edit canonical status fields.
77
80
  2. **A lone `orphaned: <name> (no match)`** whose decision is NOT in the stale block —
78
81
  multi-anchor did its job: another anchor still holds the decision live. No action
79
82
  needed unless the orphaned one was the load-bearing anchor.
@@ -89,8 +92,9 @@ store write or a source change: confirm before acting.
89
92
  domain's frozen membership is, and a re-scope applies only after
90
93
  `sidegraph-domains snapshot --refresh --domain <slug>`); read the old rule back first
91
94
  (`list_domains(ids=[<domain_id>])` returns the exact complete row, including
92
- `path_prefixes`; check its `hint` and use its local-file fallback if the row does not fit;
93
- for the actual `seed_anchors` list read `.sidegraph/domains/<domain_id>.json`) and carry what's still
95
+ `path_prefixes`; check its `hint` and use its local Store fallback if the row does not fit;
96
+ for the actual `seed_anchors` list use local Python `Store.get_domain(domain_id)`
97
+ on the configured store, which works for files and packed shards) and carry what's still
94
98
  right — then `ratify(accept=[<new_id>])`. Or retire it: `ratify(drop=[<domain_id>])`
95
99
  if the area is genuinely gone.
96
100
  5. **`path rule too broad — path contribution dropped (...):`** — a `path_prefixes` rule
@@ -127,7 +131,7 @@ store write or a source change: confirm before acting.
127
131
  not, `ratify(drop=[<the part that should not exist>])`: the remaining domain takes the
128
132
  frozen membership back at once.
129
133
 
130
- ## Triage decision tree (add_anchors, propose_decisions, or recommend a drop)
134
+ ## Triage decision tree (re-anchor, supersede, or report an obsolete subject)
131
135
 
132
136
  For every `orphaned`/`ambiguous` entity and every `stale_decisions` entry, walk this tree
133
137
  before touching anything — the same tree whether you're triaging interactively or running
@@ -174,16 +178,17 @@ is gated on a human's `ratify`. Never call `supersede_decision`/`supersede_fact`
174
178
  immediately-`accepted` MCP tools) from an unattended/CI context — unlike `propose_decisions`,
175
179
  they skip the ratify gate entirely.
176
180
 
177
- **(c) The subject is genuinely gone.** The code (or doc section) the decision was about was
178
- deleted outright, not renamed or moved. There is no tool call for this: recommend a drop in
179
- your summary (`ratify(drop=[<id>])`, or `sidegraph-ratify --drop <id>`, for a *human* to
180
- run) and stop there. **Never drop a decision yourself.** Dropping is append-only-safe, but
181
- it is a ratify-gate action exactly like accepting one — that judgment call belongs to a
182
- human, same as every other write this skill routes to a human instead of performing.
181
+ **(c) The subject is genuinely gone.** Confirm that it was deleted rather than renamed
182
+ or moved. Check the record's current status. For an accepted decision, propose a meaningful
183
+ supersession when something remains true or successor code exists; otherwise report the
184
+ obsolete subject and retain its history. There is no accepted-decision retirement API.
185
+ `ratify(drop=[<id>])` and `sidegraph-ratify --drop <id>` reject only proposed decisions/facts.
186
+ Recommend those only for proposed records, and leave the verdict to the human. Domain drop
187
+ has its separate accepted-domain exception. Never edit canonical status or valid_to fields.
183
188
 
184
189
  ## Running this playbook headlessly (CI)
185
190
 
186
- Everything above except the drop in (c) is a tool call, not a judgment a human has to make
191
+ The lookup, binding-repair and proposal steps above can run without a human verdict
187
192
  in the moment — `sync_anchors`/`find_entity`/`query_structure`/`add_anchors`/
188
193
  `propose_decisions` all run fine unattended, and so do the tools that read records
189
194
  (`retrieve_decisions`/`get_entity_history`/`list_facts`/`verify_store`) used to confirm a
@@ -199,12 +204,13 @@ policy would ratify through `propose_decisions` with no `ratify` call at all, wh
199
204
  claude -p 'Run the heal-anchors playbook: call sync_anchors(force=True), then for every
200
205
  orphaned/ambiguous entity and every stale decision, follow the triage tree — add_anchors
201
206
  for code that moved, propose_decisions(supersedes=...) for content that is genuinely
202
- outdated, and a plain-text recommendation (never a tool call) for anything to drop. Do not
203
- call ratify. Summarize every action taken and every recommendation at the end.' \
207
+ outdated, and a status-aware summary for obsolete subjects. Recommend drop only for
208
+ proposed decisions/facts or a supported domain drop; retain accepted decision history when
209
+ there is no meaningful successor. Do not call ratify. Summarize every action taken and every recommendation at the end.' \
204
210
  --model claude-sonnet-5 \
205
211
  --mcp-config mcp-config.json --strict-mcp-config \
206
212
  --allowedTools "mcp__sidegraph__*" \
207
- --disallowedTools "mcp__sidegraph__ratify,mcp__sidegraph__ratify_decisions,mcp__sidegraph__add_decision,mcp__sidegraph__supersede_decision,mcp__sidegraph__supersede_fact,mcp__sidegraph__supersede_domain,mcp__sidegraph__add_domain,mcp__sidegraph__add_fact" \
213
+ --disallowedTools "mcp__sidegraph__ratify,mcp__sidegraph__ratify_decisions,mcp__sidegraph__add_decision,mcp__sidegraph__supersede_decision,mcp__sidegraph__supersede_fact,mcp__sidegraph__supersede_domain,mcp__sidegraph__add_domain,mcp__sidegraph__add_fact,mcp__sidegraph__record_drift_check,mcp__sidegraph__propose_domains" \
208
214
  --output-format stream-json --verbose
209
215
  ```
210
216
 
@@ -214,7 +220,8 @@ system itself consults, so under bypass they'd bind nothing at all, and the run
214
220
  able to call every tool including `ratify`. **The `--disallowedTools` deny list is the
215
221
  load-bearing guard**: it names the exact write-gate tools this playbook must never call
216
222
  unattended — `ratify`/`ratify_decisions`, `add_decision`/`supersede_decision`,
217
- `add_fact`/`supersede_fact`, `add_domain`/`supersede_domain` — and blocks them regardless
223
+ `add_fact`/`supersede_fact`, `add_domain`/`supersede_domain`, `record_drift_check`,
224
+ `propose_domains` — and blocks them regardless
218
225
  of the machine's ambient permission configuration. The `--allowedTools` wildcard is scoping,
219
226
  not enforcement: on a pristine machine a headless `-p` run auto-denies *MCP* tool calls
220
227
  outside it (no terminal to prompt), but a permissive user- or project-level `settings.json`
@@ -28,8 +28,8 @@ path_prefixes, seed_anchor_count, parent_slug, child_slugs}`. `member_count` is
28
28
  `len(communities)` (0 for a domain not yet ratified/synced), and lineage reflects the full store.
29
29
  Read `hint` before assuming the listing is complete. Narrow with `status`, `query` (AND terms
30
30
  across slug/title/summary), or `ids` (exact domain ids). `limit` is clamped to 1..100 and
31
- `budget_chars` to 4,000..40,000. A budget cut includes the relative domain-file fallback for
32
- the next omitted row; a count cut suggests filters and raising `limit` only while it is below
31
+ `budget_chars` to 4,000..40,000. A budget cut includes a local `Store.get_domain(id)` fallback for
32
+ the next omitted row in either storage layout; a count cut suggests filters and raising `limit` only while it is below
33
33
  100. This is the tool for "show me all domains" — prefer it over the narrower views below:
34
34
 
35
35
  - **`list_proposed()`** — domains awaiting ratification only (`status=proposed`), rendered
@@ -97,10 +97,9 @@ need git-history archaeology either:
97
97
  the row still does not fit.
98
98
  - **`seed_anchors`** has no structured tool-read for the descriptors themselves —
99
99
  `list_domains()` gives you only `seed_anchor_count` (how many, not what). For the actual
100
- `{"name", "file_path"}` list, read the committed domain file directly:
101
- `.sidegraph/domains/<domain_id>.json` (the full row minus the volatile `communities` field —
102
- see [store format](../../../../docs/reference/store-format.md)) — still structured JSON, just
103
- not exposed through an MCP tool yet.
100
+ `{"name", "file_path"}` list, use local Python `Store.get_domain(domain_id)` on the configured store and read
101
+ its `seed_anchors`. This works for per-record files and packed shards; a domain may no
102
+ longer have its own `.json` file (see [store format](../../../../docs/reference/store-format.md)).
104
103
 
105
104
  `supersede_domain` is also the mechanism behind the naming guide's [recovering from a
106
105
  mass-drop](../../../../docs/guides/naming-your-domains.md#recovering-from-a-mass-drop): give
@@ -28,10 +28,18 @@ The CLI runs through uvx at the session's version, never the copy on `PATH` ([wh
28
28
  uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-doctor --json # findings[] entries with "code": "code-drift"
29
29
  ```
30
30
 
31
- Each finding names the record and changed files or why its prior check no longer
32
- applies (including subject/anchor-scope changes). Original `provenance.commit` stays history. `sidegraph-doctor` is a pure read — safe to run any time. From
33
- inside a session, the drifted set also announces itself: the SessionStart line and
34
- `[drifted]` tags in retrieval output are the same population, surfaced lazily.
31
+ For a per-decision `code-drift` finding, use `record_id` and `record_type` ("decision")
32
+ to identify the subject. `path` is its physical source: several records may share one shard.
33
+ Never infer identity from the shard, capture commit or human-readable `detail`. Global notes
34
+ (commit stamping unavailable, Git unavailable, check skipped) have null record fields; they
35
+ are not records to triage. `detail` names changed files or why a prior check no longer applies.
36
+ Original `provenance.commit` stays history. Doctor is a pure read.
37
+
38
+ The SessionStart count and `[drifted]` tags in detailed formatted `get_task_context`,
39
+ `query_decisions` and `drill_down` output use the lazily refreshed drift cache. Budgets can
40
+ omit records, and compact related-record lines do not all show the marker. Raw
41
+ `retrieve_decisions` JSON has no drift field or tag in either storage layout; use doctor
42
+ for the explicit current list.
35
43
 
36
44
  Triage in batches — a 35-record queue does not need 35 interrupts. Group verdicts and
37
45
  **put every question to the human into one message** (same discipline as
@@ -60,7 +68,10 @@ Triage in batches — a 35-record queue does not need 35 interrupts. Group verdi
60
68
  ```
61
69
 
62
70
  Include every current checkable concrete anchor file and each additional dependency
63
- actually inspected. The files must be tracked regular files and clean relative to
71
+ actually inspected. If `missing_required_files` is returned, inspect the local configured
72
+ Store: `bindings_for_record(decision_id)`, then `get_entity(binding.entity_id).descriptor`
73
+ for each binding. Include every current checkable concrete file, not just the files
74
+ named as changed by doctor. The files must be tracked regular files and clean relative to
64
75
  that HEAD; unrelated dirt is allowed. The target must be open, commit-stamped and
65
76
  concretely anchored. With no Git HEAD, dirty inspected files, incomplete scope or an
66
77
  ineligible target, report the judgment and why no check was recorded; retain the
@@ -88,10 +99,14 @@ Triage in batches — a 35-record queue does not need 35 interrupts. Group verdi
88
99
  The direct `supersede_decision` path is legitimate only when the human has dictated
89
100
  or approved the successor text in this conversation. For an invalidated *fact*,
90
101
  the same split applies with `supersede_fact`.
91
- - **(c) The anchored code is gone entirely** — deleted, not changed. That's binding
92
- damage, not content drift: run `sidegraph:heal-anchors` (its stale-decisions tree
93
- already covers restore-the-name vs. supersede vs. recommend-a-drop). Never drop a
94
- record yourself — a drop is a ratify-gate action for a human.
102
+ - **(c) The anchored code is gone entirely** — deleted, not changed. Run
103
+ `sidegraph:heal-anchors` to distinguish a rename from a lost subject. For accepted
104
+ decisions, propose a meaningful supersession that explains the obsolete scope and
105
+ anchors what remains true. `ratify(drop=...)` only rejects proposed decisions/facts;
106
+ it cannot retire an accepted decision. If there is no meaningful successor, report
107
+ that limitation to the human and retain history; do not invent an empty successor
108
+ or edit status/valid_to in canonical files. Accepted domains have their own supported
109
+ drop path; do not generalize that exception to decisions.
95
110
 
96
111
  ## Calibrate the effort
97
112
 
@@ -115,8 +130,9 @@ of the wave's own definition of done, not a later triage's discovery.
115
130
 
116
131
  End with one summary the human can act on in a single pass: checked (decision id, returned check id, revision, inspected scope and cache-clear outcome), still true but
117
132
  check unavailable (id and reason), proposed supersessions (old id → new draft title, awaiting
118
- `sidegraph:ratify-decisions`), handed to heal-anchors (ids), and recommended drops
119
- (ids + reason — recommendation only, the human runs `ratify(drop=[...])`).
133
+ `sidegraph:ratify-decisions`), handed to heal-anchors (ids), and unresolved obsolete subjects
134
+ (ids + current status + reason). Recommend `ratify(drop=[...])` only for proposed
135
+ decisions/facts, or domains whose drop path explicitly permits it.
120
136
 
121
137
  ## See also
122
138
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sidegraph"
3
- version = "0.17.1"
3
+ version = "0.17.3"
4
4
  description = "Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -30,7 +30,7 @@ if TYPE_CHECKING:
30
30
  )
31
31
  from .store import Store
32
32
 
33
- __version__ = "0.17.1"
33
+ __version__ = "0.17.3"
34
34
 
35
35
  # name -> the submodule that defines it
36
36
  _LAZY = {