sidegraph 0.17.3__tar.gz → 0.19.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/workflows/ci.yml +6 -2
  2. {sidegraph-0.17.3 → sidegraph-0.19.0}/CHANGELOG.md +52 -0
  3. {sidegraph-0.17.3 → sidegraph-0.19.0}/CLAUDE.md +1 -1
  4. {sidegraph-0.17.3 → sidegraph-0.19.0}/PKG-INFO +1 -1
  5. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/concepts/retrieval.md +13 -6
  6. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/adr-export.md +8 -3
  7. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/ci-cd-maintenance.md +2 -2
  8. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/migrating-to-0.17.md +9 -9
  9. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/retrieval-in-sessions.md +3 -2
  10. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/team-workflow.md +1 -1
  11. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/troubleshooting.md +2 -2
  12. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/cli.md +27 -20
  13. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/mcp-tools.md +3 -1
  14. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/store-format.md +23 -3
  15. {sidegraph-0.17.3 → sidegraph-0.19.0}/package.json +1 -1
  16. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  17. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  18. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/.muse-plugin/plugin.json +1 -1
  19. {sidegraph-0.17.3 → sidegraph-0.19.0}/pyproject.toml +1 -1
  20. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/__init__.py +1 -1
  21. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/adr.py +37 -34
  22. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/cli.py +5 -3
  23. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/doctor.py +48 -2
  24. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/maintenance.py +6 -2
  25. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/okf.py +31 -4
  26. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/retrieval.py +63 -8
  27. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/store.py +22 -11
  28. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/store_layout.py +49 -16
  29. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/store_rules.py +62 -10
  30. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/verify.py +106 -25
  31. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/bounded_listings_support.py +10 -0
  32. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/auto_policy/parity_goldens.json +1 -1
  33. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_adr.py +32 -5
  34. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bounded_listings.py +10 -5
  35. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_adr.py +1 -1
  36. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_integrity.py +2 -1
  37. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_format2_notices.py +27 -0
  38. sidegraph-0.19.0/tests/test_format2_windows.py +269 -0
  39. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_okf.py +100 -0
  40. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_readers_format2.py +4 -11
  41. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_guessed.py +2 -1
  42. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_ids.py +4 -4
  43. sidegraph-0.19.0/tests/test_retrieval_related_cap.py +256 -0
  44. sidegraph-0.19.0/tests/test_store_junctions.py +71 -0
  45. sidegraph-0.19.0/tests/test_store_rules_legacy_defaults.py +293 -0
  46. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_format2_against.py +106 -0
  47. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_snapshot.py +208 -0
  48. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_transitions.py +7 -6
  49. {sidegraph-0.17.3 → sidegraph-0.19.0}/uv.lock +1 -1
  50. {sidegraph-0.17.3 → sidegraph-0.19.0}/.agents/plugins/marketplace.json +0 -0
  51. {sidegraph-0.17.3 → sidegraph-0.19.0}/.claude-plugin/marketplace.json +0 -0
  52. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/CODEOWNERS +0 -0
  53. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  54. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  55. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  56. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  57. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/secret_scanning.yml +0 -0
  58. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/workflows/publish.yml +0 -0
  59. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/workflows/scorecard.yml +0 -0
  60. {sidegraph-0.17.3 → sidegraph-0.19.0}/.github/workflows/session-link-gate.yml +0 -0
  61. {sidegraph-0.17.3 → sidegraph-0.19.0}/.gitignore +0 -0
  62. {sidegraph-0.17.3 → sidegraph-0.19.0}/.gitleaks.toml +0 -0
  63. {sidegraph-0.17.3 → sidegraph-0.19.0}/.opencode/INSTALL.md +0 -0
  64. {sidegraph-0.17.3 → sidegraph-0.19.0}/.pre-commit-config.yaml +0 -0
  65. {sidegraph-0.17.3 → sidegraph-0.19.0}/.python-version +0 -0
  66. {sidegraph-0.17.3 → sidegraph-0.19.0}/AGENTS.md +0 -0
  67. {sidegraph-0.17.3 → sidegraph-0.19.0}/CODE_OF_CONDUCT.md +0 -0
  68. {sidegraph-0.17.3 → sidegraph-0.19.0}/CONTRIBUTING.md +0 -0
  69. {sidegraph-0.17.3 → sidegraph-0.19.0}/LICENSE +0 -0
  70. {sidegraph-0.17.3 → sidegraph-0.19.0}/README.md +0 -0
  71. {sidegraph-0.17.3 → sidegraph-0.19.0}/SECURITY.md +0 -0
  72. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/README.md +0 -0
  73. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/concepts/anchoring.md +0 -0
  74. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/concepts/data-model.md +0 -0
  75. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/concepts/decision-memory.md +0 -0
  76. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/concepts/mind-model.md +0 -0
  77. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/getting-started/bootstrap.md +0 -0
  78. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/getting-started/claude-code-setup.md +0 -0
  79. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/getting-started/codex-setup.md +0 -0
  80. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/getting-started/installation.md +0 -0
  81. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/getting-started/quickstart.md +0 -0
  82. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/capturing-decisions.md +0 -0
  83. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/health-check.md +0 -0
  84. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/migrating-to-0.14.md +0 -0
  85. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/naming-your-domains.md +0 -0
  86. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/semantic-docs.md +0 -0
  87. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/surviving-refactors.md +0 -0
  88. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/using-0.15.md +0 -0
  89. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/using-0.16.md +0 -0
  90. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/guides/verifying-your-setup.md +0 -0
  91. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/integrations/claude-code.md +0 -0
  92. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/integrations/codex.md +0 -0
  93. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/integrations/graphify.md +0 -0
  94. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/integrations/grok.md +0 -0
  95. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/integrations/muse.md +0 -0
  96. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/integrations/opencode.md +0 -0
  97. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/llms.txt +0 -0
  98. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/pilot-kit/README.md +0 -0
  99. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/pilot-kit/corpus_fit.py +0 -0
  100. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/pilot-kit/judge-prompt.md +0 -0
  101. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/pilot-kit/questions-prompt.md +0 -0
  102. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/pilot-kit/rubric-template.md +0 -0
  103. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/configuration.md +0 -0
  104. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/git-bindings.md +0 -0
  105. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/hooks.md +0 -0
  106. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/operations.md +0 -0
  107. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/releasing.md +0 -0
  108. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/reference/stability.md +0 -0
  109. {sidegraph-0.17.3 → sidegraph-0.19.0}/docs/whitepaper/index.md +0 -0
  110. {sidegraph-0.17.3 → sidegraph-0.19.0}/index.js +0 -0
  111. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/.mcp.json +0 -0
  112. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/codex/hooks.json +0 -0
  113. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/codex/mcp.json +0 -0
  114. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  115. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  116. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  117. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/compact/SKILL.md +0 -0
  118. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/compact/agents/openai.yaml +0 -0
  119. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  120. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  121. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  122. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  123. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/health-check/SKILL.md +0 -0
  124. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/health-check/agents/openai.yaml +0 -0
  125. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/health-check/scripts/collect.py +0 -0
  126. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  127. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  128. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  129. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  130. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  131. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  132. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  133. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  134. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
  135. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  136. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
  137. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  138. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  139. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  140. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  141. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  142. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
  143. {sidegraph-0.17.3 → sidegraph-0.19.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  144. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/adr_cli.py +0 -0
  145. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/adr_files.py +0 -0
  146. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/adr_identity.py +0 -0
  147. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/anchoring.py +0 -0
  148. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bash_paths.py +0 -0
  149. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  150. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/apply.py +0 -0
  151. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  152. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/cli.py +0 -0
  153. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/integrations.py +0 -0
  154. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/model.py +0 -0
  155. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/planner.py +0 -0
  156. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/proof.py +0 -0
  157. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/review.py +0 -0
  158. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/bootstrap/scan.py +0 -0
  159. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/capture.py +0 -0
  160. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/config.py +0 -0
  161. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/delivery.py +0 -0
  162. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/doc_import.py +0 -0
  163. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/domain_snapshot.py +0 -0
  164. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/domains.py +0 -0
  165. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/drift_checks.py +0 -0
  166. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/engine/__init__.py +0 -0
  167. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/engine/rationale.py +0 -0
  168. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/engine/reader.py +0 -0
  169. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/freshness.py +0 -0
  170. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/gitenv.py +0 -0
  171. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/githooks.py +0 -0
  172. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/gitio.py +0 -0
  173. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/__init__.py +0 -0
  174. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/claude_settings.py +0 -0
  175. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/diagnostics.py +0 -0
  176. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/hooks.py +0 -0
  177. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/launch.py +0 -0
  178. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/mcp_entry.py +0 -0
  179. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/session_identity.py +0 -0
  180. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/host/subagent.py +0 -0
  181. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/hot_index.py +0 -0
  182. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/importer.py +0 -0
  183. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/input_limits.py +0 -0
  184. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/integrity.py +0 -0
  185. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/maintenance_clock.py +0 -0
  186. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/migrate.py +0 -0
  187. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/nearest_anchored.py +0 -0
  188. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/profiles.py +0 -0
  189. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/redaction_scan.py +0 -0
  190. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/redaction_tokens.py +0 -0
  191. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/schema.py +0 -0
  192. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/seed_ladder.py +0 -0
  193. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/server.py +0 -0
  194. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/stats/__init__.py +0 -0
  195. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/stats/model.py +0 -0
  196. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/stats/render.py +0 -0
  197. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/store_format.py +0 -0
  198. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/store_view.py +0 -0
  199. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/sync.py +0 -0
  200. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/text_paths.py +0 -0
  201. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/tool_rate_limit.py +0 -0
  202. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/validation_errors.py +0 -0
  203. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/viz/__init__.py +0 -0
  204. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  205. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/viz/model.py +0 -0
  206. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/viz/render.py +0 -0
  207. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/viz/template.html +0 -0
  208. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/worktree_seeds.py +0 -0
  209. {sidegraph-0.17.3 → sidegraph-0.19.0}/src/sidegraph/write_boundary.py +0 -0
  210. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/__init__.py +0 -0
  211. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/conftest.py +0 -0
  212. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/drift_checks_support.py +0 -0
  213. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bitfinex_slice.json +0 -0
  214. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  215. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  216. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  217. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  218. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  219. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/graph.json +0 -0
  220. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  221. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  222. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  223. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  224. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  225. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  226. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  227. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  228. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  229. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  230. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  231. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  232. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  233. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  234. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  235. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  236. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  237. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  238. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  239. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  240. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  241. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  242. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  243. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  244. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/design.md +0 -0
  245. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  246. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  247. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  248. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  249. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  250. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  251. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  252. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  253. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  254. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  255. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  256. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  257. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  258. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  259. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  260. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/member_names_python_graph.json +0 -0
  261. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/member_names_swift_graph.json +0 -0
  262. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/fixtures/mini_graph.json +0 -0
  263. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/githooks_legacy_helper.py +0 -0
  264. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/githooks_support.py +0 -0
  265. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/graph_fixtures.py +0 -0
  266. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/graph_repo_support.py +0 -0
  267. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/membership_support.py +0 -0
  268. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/moved_adoption_support.py +0 -0
  269. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/opencode_plugin_runner.mjs +0 -0
  270. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/snapshot_support.py +0 -0
  271. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/store_format2_support.py +0 -0
  272. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/store_non_file_support.py +0 -0
  273. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/store_record_support.py +0 -0
  274. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_adr_files.py +0 -0
  275. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_adr_identity.py +0 -0
  276. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_agent_brief_manifests.py +0 -0
  277. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_anchor_descriptor.py +0 -0
  278. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_anchor_paths.py +0 -0
  279. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_anchoring.py +0 -0
  280. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  281. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_anchoring_membership.py +0 -0
  282. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bash_paths.py +0 -0
  283. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_batch_panel_fixes.py +0 -0
  284. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_apply.py +0 -0
  285. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_catalog.py +0 -0
  286. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_cli.py +0 -0
  287. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
  288. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_integrations.py +0 -0
  289. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_model.py +0 -0
  290. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_planner.py +0 -0
  291. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_proof.py +0 -0
  292. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_review.py +0 -0
  293. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_scan.py +0 -0
  294. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_scan_regular.py +0 -0
  295. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_bootstrap_unanchored.py +0 -0
  296. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_capture_auto_accept.py +0 -0
  297. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_capture_facts.py +0 -0
  298. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_capture_initiative.py +0 -0
  299. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_capture_integration.py +0 -0
  300. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_capture_neighbors.py +0 -0
  301. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_capture_propose.py +0 -0
  302. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_capture_redact.py +0 -0
  303. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_compact.py +0 -0
  304. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_compact_format2.py +0 -0
  305. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_doctor.py +0 -0
  306. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_domains.py +0 -0
  307. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_domains_snapshot.py +0 -0
  308. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_graph_paths.py +0 -0
  309. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_import.py +0 -0
  310. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_init.py +0 -0
  311. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_init_hooks.py +0 -0
  312. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_okf.py +0 -0
  313. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_ratify.py +0 -0
  314. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_ratify_facts.py +0 -0
  315. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_stats.py +0 -0
  316. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_store_precedence.py +0 -0
  317. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_sync.py +0 -0
  318. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_sync_check.py +0 -0
  319. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_unreadable_paths.py +0 -0
  320. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_cli_viz.py +0 -0
  321. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_codex_plugin.py +0 -0
  322. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_command_windows.py +0 -0
  323. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_community_baseline.py +0 -0
  324. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_compact_skill.py +0 -0
  325. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_config.py +0 -0
  326. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_config_ancestor_lookup.py +0 -0
  327. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_config_borrowed_graph.py +0 -0
  328. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_corpus_expected_renders.py +0 -0
  329. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_corpus_self_corpus.py +0 -0
  330. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  331. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_delivery_evidence.py +0 -0
  332. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_delivery_stats.py +0 -0
  333. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_delivery_surfaces.py +0 -0
  334. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_digest_integrity.py +0 -0
  335. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doc_corpus_integration.py +0 -0
  336. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doc_import.py +0 -0
  337. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_docs_claims.py +0 -0
  338. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor.py +0 -0
  339. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_auto_share.py +0 -0
  340. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_code_drift.py +0 -0
  341. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_dangling_supports.py +0 -0
  342. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_duplicate_entity.py +0 -0
  343. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
  344. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_graph_stale.py +0 -0
  345. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_never_surfaced.py +0 -0
  346. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_record_identity.py +0 -0
  347. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_scan.py +0 -0
  348. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_stale_instructions.py +0 -0
  349. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_unhashable_payload.py +0 -0
  350. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_doctor_unratified_accept.py +0 -0
  351. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_domain_seed_names.py +0 -0
  352. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_domain_snapshot_format.py +0 -0
  353. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_domain_snapshot_notices.py +0 -0
  354. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_domains.py +0 -0
  355. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_drift_checks.py +0 -0
  356. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_engine_build.py +0 -0
  357. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_entity_duplicate_resolution.py +0 -0
  358. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_entity_get_or_create_race.py +0 -0
  359. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_entity_twins.py +0 -0
  360. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_entry_point_arguments.py +0 -0
  361. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_env_isolation.py +0 -0
  362. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_fact_reachability_gate.py +0 -0
  363. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_file_bound_retrieval.py +0 -0
  364. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_flow_profile.py +0 -0
  365. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_git_bindings_blame.py +0 -0
  366. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_git_bindings_hook.py +0 -0
  367. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_git_bindings_provenance.py +0 -0
  368. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_git_env.py +0 -0
  369. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_git_output_utf8.py +0 -0
  370. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_githooks.py +0 -0
  371. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_githooks_atomic_lock.py +0 -0
  372. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_graph_freshness.py +0 -0
  373. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_graphify_pin.py +0 -0
  374. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_health_check_skill.py +0 -0
  375. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hook_body_compaction.py +0 -0
  376. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hook_contention.py +0 -0
  377. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hook_failure_diagnostics.py +0 -0
  378. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hook_payload_encoding.py +0 -0
  379. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hook_showings.py +0 -0
  380. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hook_spawn_guard.py +0 -0
  381. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_agent_brief.py +0 -0
  382. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_agent_state.py +0 -0
  383. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_borrowed_graph.py +0 -0
  384. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_claude_settings.py +0 -0
  385. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_drift_nudge.py +0 -0
  386. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_integrity.py +0 -0
  387. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_launch.py +0 -0
  388. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_pretool.py +0 -0
  389. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_pretool_records.py +0 -0
  390. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_session_key.py +0 -0
  391. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_session_start.py +0 -0
  392. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_session_start_concurrent.py +0 -0
  393. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_stop.py +0 -0
  394. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_subagent_start.py +0 -0
  395. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_subdirectory_launch.py +0 -0
  396. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_touch_events.py +0 -0
  397. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_host_wiring_checks.py +0 -0
  398. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hot_index.py +0 -0
  399. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hot_index_facts.py +0 -0
  400. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hot_index_hook.py +0 -0
  401. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_hot_path_imports.py +0 -0
  402. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_import_dry_run_preview.py +0 -0
  403. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_importer.py +0 -0
  404. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_index_journal_mode.py +0 -0
  405. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_integrity.py +0 -0
  406. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_integrity_engine_version.py +0 -0
  407. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_integrity_refresh_hook.py +0 -0
  408. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_integrity_replay.py +0 -0
  409. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_integrity_stranded.py +0 -0
  410. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_lazy_root.py +0 -0
  411. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_maintenance_clock.py +0 -0
  412. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_maintenance_dry_run_parity.py +0 -0
  413. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_maintenance_plan.py +0 -0
  414. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_maintenance_publish.py +0 -0
  415. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_mcp_entry_ratify_policy.py +0 -0
  416. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_mcp_entry_repo_root.py +0 -0
  417. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_member_anchor_wiring.py +0 -0
  418. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_merge_matrix_format2.py +0 -0
  419. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_migrate.py +0 -0
  420. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_mind_model_additive_fields.py +0 -0
  421. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_muse_plugin.py +0 -0
  422. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_nearest_anchored.py +0 -0
  423. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_opencode_plugin.py +0 -0
  424. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_openspec_profile.py +0 -0
  425. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  426. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  427. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_portable_json.py +0 -0
  428. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_private_tests_isolation.py +0 -0
  429. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_proposal_lifecycle.py +0 -0
  430. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_public_hook_launch.py +0 -0
  431. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  432. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_ratify_policy.py +0 -0
  433. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_rationale_compatibility.py +0 -0
  434. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_community_labels.py +0 -0
  435. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_doc_nodes.py +0 -0
  436. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_engine_version.py +0 -0
  437. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_file_labels.py +0 -0
  438. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_graph.py +0 -0
  439. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_integration.py +0 -0
  440. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_label_conventions.py +0 -0
  441. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_member_name_lookup.py +0 -0
  442. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_member_names.py +0 -0
  443. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_nodes_in_file.py +0 -0
  444. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_perf.py +0 -0
  445. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_rationale.py +0 -0
  446. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_read.py +0 -0
  447. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_resolve.py +0 -0
  448. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_stub_collapse.py +0 -0
  449. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_subdir_mismatch.py +0 -0
  450. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_type_split.py +0 -0
  451. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_reader_version.py +0 -0
  452. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_rebuild_instruction.py +0 -0
  453. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_redaction_scan.py +0 -0
  454. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_redaction_seeded.py +0 -0
  455. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_redaction_tokens.py +0 -0
  456. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_repo_relative_paths_portable.py +0 -0
  457. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_repoint_integration.py +0 -0
  458. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_budget_counters.py +0 -0
  459. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_context.py +0 -0
  460. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_drift_marker.py +0 -0
  461. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_drilldown.py +0 -0
  462. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_facts.py +0 -0
  463. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_integration.py +0 -0
  464. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_membership_generations.py +0 -0
  465. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_membership_index.py +0 -0
  466. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_rank.py +0 -0
  467. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_seeds.py +0 -0
  468. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_shown_ids.py +0 -0
  469. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  470. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_thin_tools.py +0 -0
  471. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_toc.py +0 -0
  472. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_toptier.py +0 -0
  473. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_retrieval_unratified.py +0 -0
  474. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_schema_descriptor.py +0 -0
  475. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_schema_domain.py +0 -0
  476. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_schema_fact.py +0 -0
  477. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_capture_diagnostics.py +0 -0
  478. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_capture_limits.py +0 -0
  479. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_cli_diagnostics.py +0 -0
  480. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_doc_limits.py +0 -0
  481. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_input_limits.py +0 -0
  482. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
  483. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_numeric_enums.py +0 -0
  484. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_python_shapes.py +0 -0
  485. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_redaction_cursor.py +0 -0
  486. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_validation_errors.py +0 -0
  487. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_security_write_boundary.py +0 -0
  488. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_seed_ladder.py +0 -0
  489. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_seed_paths_portable.py +0 -0
  490. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_add_anchors.py +0 -0
  491. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_anchoring.py +0 -0
  492. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_annotations.py +0 -0
  493. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_argument_names.py +0 -0
  494. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_borrowed_graph.py +0 -0
  495. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_capture.py +0 -0
  496. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_commit_hint.py +0 -0
  497. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_coverage_events.py +0 -0
  498. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_decision_listing.py +0 -0
  499. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_domains.py +0 -0
  500. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_drilldown.py +0 -0
  501. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_facts.py +0 -0
  502. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_find_entity.py +0 -0
  503. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_get_store.py +0 -0
  504. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_get_task_context.py +0 -0
  505. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_graph_freshness.py +0 -0
  506. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_graph_path.py +0 -0
  507. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_import.py +0 -0
  508. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_invocation_policy.py +0 -0
  509. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_mcp_smoke.py +0 -0
  510. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_nearest_anchored.py +0 -0
  511. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
  512. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_ratify_facts.py +0 -0
  513. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_record_types.py +0 -0
  514. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_redaction.py +0 -0
  515. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_refresh.py +0 -0
  516. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_render_events.py +0 -0
  517. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_result_contract.py +0 -0
  518. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_supersede.py +0 -0
  519. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_sync_anchors.py +0 -0
  520. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_telemetry.py +0 -0
  521. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_thin_tools.py +0 -0
  522. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_tolerant_seeds.py +0 -0
  523. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_server_verify.py +0 -0
  524. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_session_attribution.py +0 -0
  525. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_skill_frontmatter.py +0 -0
  526. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stats_graph.py +0 -0
  527. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stats_health.py +0 -0
  528. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stats_model.py +0 -0
  529. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stats_render.py +0 -0
  530. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stats_skill.py +0 -0
  531. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stats_snapshot.py +0 -0
  532. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stop_hot_path.py +0 -0
  533. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_stop_rearm.py +0 -0
  534. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store.py +0 -0
  535. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_agent_state.py +0 -0
  536. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  537. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_bad_file.py +0 -0
  538. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_binding_index.py +0 -0
  539. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_canonical_stat.py +0 -0
  540. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_compact.py +0 -0
  541. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_coverage_telemetry.py +0 -0
  542. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_cross_process_mutations.py +0 -0
  543. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_derived_community.py +0 -0
  544. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_domain_members.py +0 -0
  545. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_domains.py +0 -0
  546. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_entities.py +0 -0
  547. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_fact_cascade.py +0 -0
  548. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_facts.py +0 -0
  549. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_file_anchor_names.py +0 -0
  550. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_format.py +0 -0
  551. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_format2_load.py +0 -0
  552. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_format2_marker.py +0 -0
  553. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_format2_writes.py +0 -0
  554. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_git_root_symlink.py +0 -0
  555. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_inventory.py +0 -0
  556. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_meta.py +0 -0
  557. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_migration.py +0 -0
  558. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_mutation_guard.py +0 -0
  559. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_mutation_immediate.py +0 -0
  560. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_non_file_entries.py +0 -0
  561. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  562. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_persistence.py +0 -0
  563. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_ratification.py +0 -0
  564. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_rebuild_atomicity.py +0 -0
  565. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_record_identity.py +0 -0
  566. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_record_types.py +0 -0
  567. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_render_events.py +0 -0
  568. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_requirement.py +0 -0
  569. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_retrieval.py +0 -0
  570. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_rules.py +0 -0
  571. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_slug_conflicts.py +0 -0
  572. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_snapshot_wiring.py +0 -0
  573. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_stamping_marker.py +0 -0
  574. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_symlinks.py +0 -0
  575. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_telemetry.py +0 -0
  576. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_threading.py +0 -0
  577. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_tmp_sweep_age.py +0 -0
  578. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_store_update_meta_if.py +0 -0
  579. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_subagent_start_manifests.py +0 -0
  580. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_subprocess_text_encoding.py +0 -0
  581. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_canonical_writes.py +0 -0
  582. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_clean.py +0 -0
  583. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_domains.py +0 -0
  584. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_drift_cache.py +0 -0
  585. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_fresh_clone.py +0 -0
  586. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_integration.py +0 -0
  587. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_membership.py +0 -0
  588. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_moved_adoption.py +0 -0
  589. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_rebind.py +0 -0
  590. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_repoint.py +0 -0
  591. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_report_has_findings.py +0 -0
  592. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_run.py +0 -0
  593. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_snapshot_membership.py +0 -0
  594. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_toc_cache.py +0 -0
  595. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_volatile_heal.py +0 -0
  596. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_sync_wiring.py +0 -0
  597. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_telemetry_retention.py +0 -0
  598. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_text_paths.py +0 -0
  599. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_domain_snapshot.py +0 -0
  600. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_format2_snapshot.py +0 -0
  601. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_git_framing.py +0 -0
  602. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_git_revisions.py +0 -0
  603. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_verify_git_stdin.py +0 -0
  604. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_viz_asset_packaged.py +0 -0
  605. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_viz_model.py +0 -0
  606. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_viz_render_html.py +0 -0
  607. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_viz_render_json.py +0 -0
  608. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/test_worktree_seeds.py +0 -0
  609. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/wheel_server_trace.py +0 -0
  610. {sidegraph-0.17.3 → sidegraph-0.19.0}/tests/wheel_smoke.py +0 -0
  611. {sidegraph-0.17.3 → sidegraph-0.19.0}/tools/check_no_session_links.py +0 -0
@@ -180,10 +180,13 @@ jobs:
180
180
  - name: Test portable core and MCP contracts
181
181
  shell: pwsh
182
182
  run: |
183
- # The wheel-smoke tests are release-only (tests/private); the public snapshot has no copy.
183
+ # Private acceptance files are absent from the public snapshot.
184
184
  $privateTests = @()
185
185
  if (Test-Path "tests/private/test_installed_wheel_smoke.py") {
186
- $privateTests = @("tests/private/test_installed_wheel_smoke.py")
186
+ $privateTests += "tests/private/test_installed_wheel_smoke.py"
187
+ }
188
+ if (Test-Path "tests/private/test_older_reader_native.py") {
189
+ $privateTests += "tests/private/test_older_reader_native.py"
187
190
  }
188
191
  uv run pytest -q --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
189
192
  tests/test_store_mutation_guard.py `
@@ -195,6 +198,7 @@ jobs:
195
198
  tests/test_verify_format2_snapshot.py `
196
199
  tests/test_store_format.py tests/test_store_rules.py `
197
200
  tests/test_maintenance_publish.py tests/test_migrate.py `
201
+ tests/test_store_junctions.py tests/test_format2_windows.py `
198
202
  tests/test_repo_relative_paths_portable.py `
199
203
  tests/test_command_windows.py `
200
204
  tests/test_hook_payload_encoding.py tests/test_hook_failure_diagnostics.py `
@@ -7,6 +7,58 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.19.0] — 2026-10-27
11
+
12
+ ### Changed
13
+
14
+ - `sidegraph-doctor --check` no longer exits `2` on `maintenance-due` alone. The finding is
15
+ still printed, listed in `--json` and shown as a session notice; `store-not-migrated` and
16
+ every other finding still fail `--check`.
17
+ - `sidegraph-export-adr` names store records (the ADR's own record, supporting facts,
18
+ domains, successors without a document) by id instead of linking into `.sidegraph/`.
19
+ Migrating or maintaining the store no longer rewrites every exported ADR. The first export
20
+ with this version rewrites each generated document once. The `$record_link` template
21
+ placeholder is now a code span with the id, not a link target.
22
+
23
+ ### Fixed
24
+
25
+ - One record file that cannot be read or decoded no longer fans out into findings at every
26
+ record that refers to it. `sidegraph-verify` reports the one `parse-error`; a fact that
27
+ supports it, a successor that supersedes it and a binding to such an entity raise nothing
28
+ more, and `sidegraph-doctor` adds no `dangling-record` for the supporting fact.
29
+ - `sidegraph-verify --against` no longer reports `illegal-deletion` or `illegal-field-change`
30
+ for a committed file the store never loads: a stray copy under an unsafe name, or a file
31
+ whose baseline id is unsafe. Deleting such a file is the fix; the snapshot still reports it
32
+ as `unsafe-record-id` while it exists.
33
+ - Ratifying, dropping or closing a decision written before the `scope` field existed no longer
34
+ reads as an illegal `scope` change. `sidegraph-verify`, `sidegraph-compact` and maintenance
35
+ accept the default `repo` that the writer or the archive line adds, so such a record can be
36
+ compacted and packed again. A real `scope` edit is still refused. Entities without `kind`
37
+ get the same treatment for its default, `concrete`.
38
+ - `sidegraph-export-okf` no longer exports a domain's superseded row when its successor's id
39
+ happens to sort lower, which can happen for two ids minted in the same millisecond, or
40
+ after a domain is renamed away and back. A row with a later revision under the same slug
41
+ never becomes that slug's page.
42
+
43
+ ## [0.18.0] — 2026-10-26
44
+
45
+ ### Changed
46
+
47
+ - `get_task_context` and `query_decisions` show at most 5 lines of related memory reached by
48
+ expansion. Each line has a short choice snippet and the record's id. The rest are counted
49
+ in one closing `- (+N more related not shown: …)` line. Global-scope rules and a seed's
50
+ superseded one-liners are not capped.
51
+
52
+ ### Fixed
53
+
54
+ - Internal Windows directory junctions are refused by the store's link guard, including
55
+ junctions added before maintenance. Deliberately linked store roots remain supported.
56
+
57
+ ### Tests
58
+
59
+ - Native Windows CI exercises packed-store migration, edits, compaction, Git checkout under
60
+ both autocrlf settings, long paths, busy files, case aliases and older-reader refusal.
61
+
10
62
  ## [0.17.3] — 2026-10-26
11
63
 
12
64
  ### Fixed
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
13
13
  continuing participant in the project. A core feature must preserve, organize, or deliver
14
14
  accumulated project understanding. Document search by itself is not the product.
15
15
 
16
- Sidegraph is pre-1.0 (v0.17.3) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.19.0) — the full loop (capture, ratification, mistakes-first
17
17
  retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
18
18
  facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
19
19
  a stable release. See
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sidegraph
3
- Version: 0.17.3
3
+ Version: 0.19.0
4
4
  Summary: Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine.
5
5
  Project-URL: Homepage, https://github.com/SantyagoSeaman/sidegraph
6
6
  Project-URL: Repository, https://github.com/SantyagoSeaman/sidegraph
@@ -250,11 +250,18 @@ unrelated question. The render is tiered instead:
250
250
  clipped to ~1200 characters, plus `rejected` and `consequences` (when populated) each
251
251
  clipped to ~400 characters, rendered as `"(context: ...)"`/`"(rejected: ...)"`/
252
252
  `"(consequences: ...)"` suffixes.
253
- - **Related tier** (`TaskContext.related` — bucket C/D and superseded one-liners): the
254
- original tight one-liner — `choice` clipped to ~240 characters, title + snippet only, no
255
- `context`/`rejected`/`consequences` at all, regardless of whether those fields are
256
- populated. This is also what stops an off-topic decision's `rejected`/`consequences` from
257
- repeating across unrelated questions — a related entry never renders them.
253
+ - **Related tier** (`TaskContext.related` — bucket C/D and superseded one-liners): a
254
+ short one-liner with no `context`/`rejected`/`consequences` and no inline evidence,
255
+ regardless of whether those fields are populated. This is also what stops an off-topic
256
+ decision's `rejected`/`consequences` from repeating across unrelated questions — a
257
+ related entry never renders them. Records reached through community, domain, peripheral
258
+ or guessed-seed expansion show at most **5** lines, each with `choice` clipped to ~80
259
+ characters and the record's `(id: …)` so it can be expanded with
260
+ `retrieve_decisions(ids=[…])`; any further ones are counted in one closing
261
+ `- (+N more related not shown: …)` line instead of rendered. Most of these records were
262
+ measured off-task for the task at hand. Two kinds stay outside that cap and keep the
263
+ plain one-liner (`choice` clipped to ~240 characters, no id): `scope: global` decisions,
264
+ which are repo-wide rules, and the seed's own superseded one-liners, which are its history.
258
265
 
259
266
  Every clip cuts at a word boundary with a trailing ellipsis. The one exception is a single unbroken token longer than the limit (a long identifier or URL), which is cut hard at the limit. The per-field
260
267
  clips are applied *before* the `memory_chars` check, not a bypass of it: a single
@@ -291,7 +298,7 @@ already on the line (the `(id: …)` suffix these tiers carry).
291
298
 
292
299
  Whenever at least one marker renders, one fixed legend line is appended to the context
293
300
  (and `drill_down` returns it as a separate `"legend"` key) explaining exactly that. The
294
- related tight tier never carries the marker — no id, no supersede consumer there. Marker
301
+ related tight tier never carries the marker, even on the capped lines that show an id. Marker
295
302
  freshness rides a store-meta cache refreshed by the SessionStart/Stop hooks
296
303
  (`sync.refresh_code_drift_cache`, one bounded git scan); records superseded mid-session are
297
304
  filtered out at read time, so a marker never outlives its record's liveness. Only
@@ -24,8 +24,10 @@ consequences come from the record. Missing optional reasoning says `Not recorded
24
24
 
25
25
  A fixed footer retains status, validity, history, source pointers, durable code descriptors
26
26
  and complete accepted, unclosed supporting facts. Even a future `valid_to` closes a fact;
27
- the exporter never infers a sample size or runtime qualifier. A successor of another kind
28
- links to its source record rather than a nonexistent ADR. `index.md` groups documents by
27
+ the exporter never infers a sample size or runtime qualifier. Store records (the ADR's own
28
+ record, supporting facts, domains, a successor of another kind) are named by id, never by a
29
+ path into `.sidegraph/`, so migrating or maintaining the store changes no generated
30
+ document. `index.md` groups documents by
29
31
  explicit accepted domain bindings, otherwise under Unassigned. These are membership
30
32
  intent and durable descriptors, not claims of current graph resolution.
31
33
 
@@ -68,7 +70,10 @@ A custom template is a regular UTF-8 file up to 64 KiB, using literal text and
68
70
  `string.Template` placeholders. It must include `$title`, `$context`, `$choice`, `$rejected`
69
71
  and `$consequences`; `$$` prints a dollar sign. Optional fields are `$kind`, `$status`,
70
72
  `$valid_from`, `$valid_to`, `$evidence`, `$anchors`, `$domains`, `$supersedes`, `$successors`,
71
- `$record_link` and `$source`. The fixed footer remains even if the template omits these.
73
+ `$record_link` and `$source`. `$record_link` is the record's id as a code span, not a link
74
+ target (store records are never linked by path, so migrating the store changes no document);
75
+ a template that used it as the target of a markdown link must drop the link syntax. The fixed
76
+ footer remains even if the template omits these.
72
77
  Default templates avoid duplicating it. Unknown placeholders or reserved marker lines are
73
78
  errors. The generated ownership marker precedes the template, so template YAML frontmatter
74
79
  is not at the first byte of the generated file.
@@ -228,8 +228,8 @@ the branch. (That holds on that checkout; on your own machine the merge base is
228
228
  target's tip only after you merged the target into your branch.) Run `sidegraph-verify` against that value: a local run against the fork point can
229
229
  differ, and CI's answer is the one that gates the merge. Findings and their remedies:
230
230
  [migrating to 0.17](migrating-to-0.17.md). A job that runs `sidegraph-doctor --check` exits `2`
231
- on the `store-not-migrated` and `maintenance-due` notices until the store is migrated or
232
- maintained.
231
+ on the `store-not-migrated` notice until the store is migrated. The `maintenance-due` notice is
232
+ reported but never fails `--check`.
233
233
 
234
234
  ## Recipe 3: scheduled triage
235
235
 
@@ -154,12 +154,12 @@ needs no other change. Three things to know:
154
154
  the target branch's tip, as CI computes it: `git merge-base origin/<target> HEAD` on GitHub's
155
155
  pull-request checkout gives that tip. A local `sidegraph-verify --against` run against the
156
156
  fork point can differ; CI's answer is the one that gates the merge.
157
- - **`sidegraph-doctor --check` exits 2 on the new notices.** While a store is unmigrated,
158
- doctor reports `store-not-migrated`, and on a packed store with work pending it reports
159
- `maintenance-due`; `--check` fails on any finding. A CI job that runs `doctor --check` turns
160
- red until you migrate (or run maintenance). Migrate in the same window you upgrade the job,
161
- or, since doctor has no flag to exclude a finding, run it with `--json` and filter the two
162
- finding names out (for example with `jq`) before deciding.
157
+ - **`sidegraph-doctor --check` exits 2 on an unmigrated store.** While a store is
158
+ unmigrated, doctor reports `store-not-migrated`, and `--check` fails on it. A CI job that
159
+ runs `doctor --check` turns red until you migrate. Migrate in the same window you upgrade the
160
+ job, or, since doctor has no flag to exclude a finding, run it with `--json` and filter that
161
+ finding name out (for example with `jq`) before deciding. On a packed store with work
162
+ pending doctor reports `maintenance-due`; since 0.19.0 `--check` does not fail on it.
163
163
  - **`sidegraph-verify` has new findings**, all errors: `bad-shard-line`, `shard-conflict`,
164
164
  `duplicate-packed-record`, `shadow-divergence`, `binding-entry-dropped`, `shard-name-case`
165
165
  and `shards-without-format2` (these on the tree itself), and `shard-body-without-source` and
@@ -168,9 +168,9 @@ needs no other change. Three things to know:
168
168
 
169
169
  A tool that reads the store files directly, not through Sidegraph, now has to read shard lines
170
170
  too: [store format](../reference/store-format.md#format-2-packed-shards) says how. ADR export
171
- works as before, but each ADR's `Record:` link then points at the shard file (not the
172
- per-record file), so the first export after the migration rewrites every ADR document, and
173
- again after maintenance folds a file.
171
+ works as before. Before 0.19.0, each ADR's `Record:` link pointed at the record's file or
172
+ shard, so an export after migration or maintenance rewrote every ADR document; since 0.19.0
173
+ generated documents name store records by id and stay byte-identical.
174
174
 
175
175
  ## Open branches
176
176
 
@@ -200,8 +200,9 @@ Proposed records use the final quarantine block instead of the accepted sections
200
200
  A `Fact` you attached to a decision (its own `facts` list — see
201
201
  [`guides/capturing-decisions.md#facts-the-evidence-layer`](capturing-decisions.md#facts-the-evidence-layer))
202
202
  rides that decision's line after both records are accepted: the moment an accepted decision is
203
- rendered in `## ⚠ Known mistakes & gotchas`, `## Decisions`, or `## Related`, its accepted
204
- supporting facts render right under it, one indented line each. A proposed fact is collected
203
+ rendered in `## ⚠ Known mistakes & gotchas`, `## Decisions`, or as a `scope: global` line in
204
+ `## Related`, its accepted supporting facts render right under it, one indented line each. The
205
+ other `## Related` lines are short capped one-liners and carry no evidence. A proposed fact is collected
205
206
  for `## Unratified proposals` instead. The one exception:
206
207
  the `~ tried, reverted 2026-01: ...` superseded one-liners also shown under `## Related` never
207
208
  get evidence — a reverted decision's evidence isn't useful at that tight, unbudgeted-for-detail
@@ -54,7 +54,7 @@ local branches, with a notice when such a branch is more than a week old
54
54
  `.sidegraph/` in the same pull request as the work that produced the records, and merge the
55
55
  branch that holds the rest. Fully staged store files do not count toward `store-uncommitted`,
56
56
  so that one check never blocks the commit that fixes it. A pre-commit hook that runs
57
- `sidegraph-doctor --check` still fails often. `--check` makes every advisory finding exit `2`,
57
+ `sidegraph-doctor --check` still fails often. `--check` makes every advisory finding except `maintenance-due` exit `2`,
58
58
  and `code-drift` is one of them: it fires after any commit that touches a file an accepted
59
59
  record is anchored to. For a gate on the store itself, use `sidegraph-verify`. It exits `2`
60
60
  only for a violation of the store's own write rules, and `0` for a clean store whatever the
@@ -326,7 +326,7 @@ legacy `archive/` segment that maintenance would delete, a shard line in the wro
326
326
  repeated with an equal body, or a stray shard file. Nothing is broken, and `sidegraph-verify`
327
327
  does not report these states. A segment that stays because one of its lines is not safe to
328
328
  delete does not count. Run `sidegraph-compact` on the default branch. Doctor lists one finding
329
- at the store path, and `--check` exits `2` on it. A legacy segment that maintenance would delete counts, whether its records are already in shard
329
+ at the store path; `--check` reports it but does not exit `2` on it. A legacy segment that maintenance would delete counts, whether its records are already in shard
330
330
  lines or maintenance would pack them. The check does not consult git, so a record file that
331
331
  still has to settle (or is untracked) is not predicted. It reads the shard files once; a store
332
332
  with more than 200 per-record files is decided from the directory listing.
@@ -411,7 +411,7 @@ not reported: nothing was switched off.
411
411
  `~/.claude/settings.json`.
412
412
  - **Where it runs.** The session surface and doctor. Not run outside a git repository, with no
413
413
  `git`, or when `git ls-files` takes longer than five seconds. Doctor lists the finding with the
414
- code `plugin-off-in-subdirectories`, and `--check` exits `2` on it like any finding.
414
+ code `plugin-off-in-subdirectories`, and `--check` exits `2` on it.
415
415
  - **Why only a root launch tells you.** A session started in a directory where the plugin is off
416
416
  runs no SessionStart hook, so nothing speaks there. The line (and the notice, with case (b))
417
417
  comes from a session at the root, and the finding from doctor and the setup skill.
@@ -1363,11 +1363,11 @@ plain-text line):
1363
1363
  | `snapshot-without-requirement` | snapshot | a `domain-snapshot.json` exists but the `format` marker does not require Sidegraph 0.14.0 or later |
1364
1364
  | `bad-validity-window` | snapshot | `valid_to < valid_from` on a decision or fact |
1365
1365
  | `superseded-without-successor` | snapshot | a `status=superseded` record has no other record's `supersedes` pointing back at it (a successor held by a file skipped for its unsafe name still counts) |
1366
- | `dangling-supersedes` | snapshot | a `supersedes` id doesn't resolve to any record, hot or archived (a file skipped for its unsafe name still counts as the record it holds, so renaming it back is the only heal) |
1367
- | `dangling-binding-entity` | snapshot | a binding's `entity_id` doesn't resolve to any `entities/<id>.json` (an entity held by a file skipped for its unsafe name still counts) |
1368
- | `dangling-fact-support` | snapshot | a fact's `supports` id doesn't resolve to any decision (a file skipped for its unsafe name still counts, as for `dangling-supersedes`) |
1369
- | `dangling-drift-check` | snapshot | an auxiliary verification references no hot or archived decision; terminal targets remain valid history |
1370
- | `dangling-parent` | snapshot | a domain's `parent_id` doesn't resolve to any domain, hot or archived (a superseded, dropped or archived parent still counts, as the write path only checks that it exists; a file skipped for its unsafe name counts too, as for `dangling-supersedes`) |
1366
+ | `dangling-supersedes` | snapshot | a `supersedes` id doesn't resolve to any record, hot or archived (a file skipped for its unsafe name still counts as the record it holds, so renaming it back is the only heal; a regular file with a safe name that does not decode counts as the record its name names, so it gives one `parse-error` and no finding here; a directory or other entry named like a record file does not) |
1367
+ | `dangling-binding-entity` | snapshot | a binding's `entity_id` doesn't resolve to any `entities/<id>.json` (an entity held by a file skipped for its unsafe name still counts, and so does an entity file that does not decode) |
1368
+ | `dangling-fact-support` | snapshot | a fact's `supports` id doesn't resolve to any decision (a file skipped for its unsafe name, or one that does not decode, still counts, as for `dangling-supersedes`) |
1369
+ | `dangling-drift-check` | snapshot | an auxiliary verification references no hot or archived decision; terminal targets remain valid history (a decision file with a safe name that does not decode counts, as for `dangling-supersedes`) |
1370
+ | `dangling-parent` | snapshot | a domain's `parent_id` doesn't resolve to any domain, hot or archived (a superseded, dropped or archived parent still counts, as the write path only checks that it exists; a file skipped for its unsafe name, or one that does not decode, counts too, as for `dangling-supersedes`) |
1371
1371
  | `parent-cycle` | snapshot | the `parent_id` chain of some domains loops back on itself (a domain that is its own parent included); reported once per cycle, at the domain with the smallest id on it, and not for a domain that merely hangs off the cycle |
1372
1372
  | `duplicate-ulid` | snapshot | the same internal id appears in more than one canonical location — two hot files, a hot file plus any archive copy, or two archive segments whose payloads for that id actually differ. **Exempt:** two or more archive segments carrying byte-*identical* payloads for the same id — a sanctioned cross-branch `sidegraph-compact` merge (independent compaction on two branches, later merged) — see [`reference/store-format.md#archive-segments-sidegraph-compact`](store-format.md#archive-segments-sidegraph-compact). **On a packed (format 2) store** a hot file beside an archive line is not a duplicate when the file holds the line's state or a legal successor of it, and a shard line beside an archive line is not when it does or when the archive line is a legal successor of the shard line; a per-record file beside a shard line is the normal state before maintenance and is judged by `shadow-divergence` |
1373
1373
  | `bad-archive-segment` | snapshot | an `archive/*.jsonl` entry is not a regular file (`unreadable: not a regular file`), or a line isn't valid UTF-8 or JSON, isn't a JSON object, or holds a decision or domain that fails its model, can't be serialised, or has a nonterminal status. Schema/decode failures match the lines the reload leaves out; the verifier additionally rejects nonterminal archive records (one violation per line, naming the segment and the line number) |
@@ -1385,7 +1385,7 @@ plain-text line):
1385
1385
  | `illegal-status-jump` | transition | `status` changed to something that isn't a real write-path transition for that record kind |
1386
1386
  | `valid-to-unset` | transition | `valid_to` reverted from a value back to `null` |
1387
1387
  | `valid-to-changed` | transition | `valid_to` changed from one value to a *different* value (only `null → value`, once, is legal) |
1388
- | `illegal-deletion` | transition | a record file — or an already-published archive segment — was deleted with no sanctioned reason. The one exception: a decision/domain preserved by same-kind, same-ID archive copies in the new tree, every copy schema-valid, compactable and a legal raw-payload transition from the baseline (a legitimate `sidegraph-compact`). An ID match alone is insufficient |
1388
+ | `illegal-deletion` | transition | a record file — or an already-published archive segment — was deleted with no sanctioned reason. The one exception: a decision/domain preserved by same-kind, same-ID archive copies in the new tree, every copy schema-valid, compactable and a legal raw-payload transition from the baseline (a legitimate `sidegraph-compact`). An ID match alone is insufficient. A file the store never loaded (an unsafe file name, or an unsafe id in the baseline) is not a record: deleting or editing it adds no transition finding, and the snapshot's `unsafe-record-id` covers it while it exists |
1389
1389
  | `shard-body-without-source` | transition | on a packed (format 2) store, a shard line added or changed since `GIT_REF` whose body is not the body of any occurrence of the same record in `GIT_REF` (a per-record file, a shard line or an archive line). `sidegraph-compact` only ever writes bodies it read, so a hand-forged line, or an edit folded in the same pull request that made it, is reported: land the edit on the target branch first, then fold |
1390
1390
  | `format-downgrade` | transition | the `format` marker went from major 2 in `GIT_REF` to a lower major. The one legal shape is the full rollback: no `shards/*.shard` file is left and every record is back in its per-record file with all its keys |
1391
1391
 
@@ -1459,8 +1459,9 @@ file — whether its default is `null` (`Provenance.commit` today) or an empty l
1459
1459
  and fills the field back in with that default. That alone is never a change: an absent field
1460
1460
  counts as the same value as an explicit `null` or an empty list/object, inside nested objects
1461
1461
  and inside the items of a list, everywhere this table calls a field immutable. A field whose
1462
- default is a *non-empty* value (`Decision.scope`, `"repo"`) is **not** covered by this — an
1463
- absent key there still reads as changed — but no file in this store lacks `scope` today.
1462
+ default is a *non-empty* value (`Decision.scope`, `"repo"`; `Entity.kind`, `"concrete"`) has
1463
+ its own narrower rule: an absent key equals exactly that default value on the other side, in
1464
+ either direction, and nothing else. A move to or from any other value is still a change.
1464
1465
 
1465
1466
  **Known limit:** `verify_against` compares only the net change across the whole diffed range
1466
1467
  (see "diffs the CURRENT WORKING TREE" below), not each intermediate commit. So a ratifier
@@ -1521,7 +1522,7 @@ sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--j
1521
1522
  |---|---|---|
1522
1523
  | `--db` | `$SIDEGRAPH_DIR` → existing `.sidegraph/` → `.sidegraph` | store directory; `$SIDEGRAPH_DB` honored for back-compat (deprecated) — same never-auto-create rule as `sidegraph-verify` (see above) |
1523
1524
  | `--against GIT_REF` | none | also run `sidegraph-verify`'s transition layer vs `GIT_REF` (identical semantics — same operational-error rules) |
1524
- | `--check` | off | advisory findings also exit `2` (default: report only; a *skipped* check never fails, even with `--check`) |
1525
+ | `--check` | off | advisory findings also exit `2`, except `maintenance-due` (default: report only; a *skipped* check never fails, even with `--check`) |
1525
1526
  | `--stale-days N` | `30` | flag a proposed decision/domain whose id timestamp is strictly older than `N` days; must be `>= 0` |
1526
1527
  | `--json` | off | print `{"clean", "violations", "findings", "skipped"}` as one JSON object to stdout (nothing else) |
1527
1528
  | `--graph` | `$SIDEGRAPH_GRAPH` or `graphify-out/graph.json`, in the store's project | read-only input used for the `graph-root-mismatch` and `graph-stale` checks below; missing or unreadable skips both and says so (see *Skipped checks* below) |
@@ -1538,14 +1539,16 @@ never constructs a `Store`.
1538
1539
  exit `1` operational error only when `--against` requests the git-backed transition layer;
1539
1540
  the snapshot layer works without git.
1540
1541
  - **Advisory section** — `doctor.curate`: curation findings that never gate the exit code
1541
- by default; `--check` escalates them to exit `2`, mirroring `sidegraph-sync --check`.
1542
+ by default; `--check` escalates them to exit `2`, mirroring `sidegraph-sync --check`. The
1543
+ one exception is `maintenance-due`, routine upkeep on a healthy packed store: it is still
1544
+ printed and still in `--json`, but never changes the exit code.
1542
1545
 
1543
1546
  **Finding codes** (the `code` field in `--json`'s `findings`, or the first column of a
1544
1547
  plain-text line):
1545
1548
 
1546
1549
  | Code | Meaning |
1547
1550
  |---|---|
1548
- | `dangling-record` | an open decision (`proposed`/`accepted`) has no committed anchor set; an open fact (`valid_to` unset) has no anchor AND no `supports` id resolving to a LIVE (`proposed`/`accepted`) decision — an anchor alone, or a supports id resolving to a live decision, is reachability for a fact |
1551
+ | `dangling-record` | an open decision (`proposed`/`accepted`) has no committed anchor set; an open fact (`valid_to` unset) has no anchor AND no `supports` id resolving to a LIVE (`proposed`/`accepted`) decision — an anchor alone, or a supports id resolving to a live decision, is reachability for a fact. A fact that supports a decision whose file does not decode is not reported: that file is `sidegraph-verify`'s one `parse-error` |
1549
1552
  | `degraded-binding` | a binding's last recorded status (from `index.db`) is `degraded` |
1550
1553
  | `orphaned-binding` | a binding's last recorded status (from `index.db`) is `orphaned` |
1551
1554
  | `stale-proposal` | a proposed decision/domain whose ULID timestamp is strictly older than `--stale-days` |
@@ -1561,11 +1564,11 @@ plain-text line):
1561
1564
  | `graph-stale` | the graph was built at a commit HEAD has moved past (graph.json's `built_at_commit`), and a file the graph should reflect changed since: one it holds was edited after the graph was last built (the later of `graph.json`'s and its sibling `manifest.json`'s modification times) or deleted, or a new file of a type it holds now exists (not under a dot-directory, which Graphify skips). Memory cannot see or anchor to code added after the build. The detail gives the build commit, how many commits behind HEAD (or "a commit outside HEAD's history" after a checkout of an older commit), how many files changed, and up to five example paths; the fix is to rebuild from the repository root by running `graphify update .` with the environment variable `GRAPHIFY_NO_AUTO_REFRESH=1` set, then `sidegraph-sync`. Silent when the build commit is HEAD, when only file types the graph does not hold changed (a `.yml` against a `.py`-only graph), and when a graph built from a dirty tree was committed afterwards, or a `graphify update .` found nothing to change and rewrote only `manifest.json` (the file is no newer than the build); also silent when the comparison cannot be made (no `built_at_commit`, one that is not a full commit id, a graph outside a git repository, a build commit the repository lacks, git unavailable or slower than 3 seconds). **`--check` exits `2` on it**, so a CI job that runs doctor should rebuild the graph first; one that does is unaffected. Needs `--graph` to resolve |
1562
1565
  | `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
1566
  | `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
- | `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 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
- | `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
- | `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
- | `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 |
1567
+ | `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**; enabling the plugin at user scope or in the root's `.claude/settings.local.json` clears it |
1568
+ | `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**. `maintenance-due` is the one finding it does not escalate. 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 |
1569
+ | `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**. `maintenance-due` is the one finding it does not escalate. 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 |
1570
+ | `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**. `maintenance-due` is the one finding it does not escalate. Silent on an empty store and on a store that is already format 2 |
1571
+ | `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, and the one finding **`--check` does not escalate**: it is printed and listed in `--json`, but the exit code stays `0`. Run `sidegraph-compact` on the default branch. Silent on a store that is not format 2 |
1569
1572
 
1570
1573
  `degraded-binding`/`orphaned-binding` come from `index.db`, opened strictly read-only — it
1571
1574
  is the only source for binding status (canonical `bindings/*.json` files carry identity,
@@ -1651,13 +1654,15 @@ of the lines above. A store whose format marker refuses this version also skips
1651
1654
  checks: `remaining checks skipped (<the reason>)`, for example
1652
1655
  `remaining checks skipped (This store requires Sidegraph >= 0.15.0; this is 0.14.0.)`.
1653
1656
  A missing graph is deliberately not a finding: `--check` escalates
1654
- every finding, so a CI job that runs doctor without building a graph would start exiting `2`.
1657
+ every finding except `maintenance-due`, so a CI job that runs doctor without building a graph
1658
+ would start exiting `2`.
1655
1659
 
1656
1660
  **Exit code:** `0` healthy — advisory findings alone stay `0` without `--check`. `1`
1657
1661
  operational error — same paths as `sidegraph-verify` (unreadable store; or, when `--against`
1658
1662
  is used, a bad ref or store outside any git repo), plus a negative `--stale-days`, rejected before the
1659
1663
  store is touched (same hard-usage treatment as `sidegraph-import --limit`). `2` strict
1660
- violations, or — with `--check` — advisory findings too.
1664
+ violations, or — with `--check` — advisory findings too, except `maintenance-due`, which never
1665
+ changes the exit code.
1661
1666
 
1662
1667
  **Examples:**
1663
1668
 
@@ -1760,8 +1765,10 @@ What lands in the bundle:
1760
1765
  before, abandoned because…" is the product; the export doesn't hide it. The one thing it
1761
1766
  does hide is unratified `proposed` drafts — those have not entered the shared memory yet,
1762
1767
  so they are never published (proposed domains are dropped the same way).
1763
- - `domains/` — one concept per slug (the latest revision row wins), with parent links
1764
- and an `# Anchored records` backlink section.
1768
+ - `domains/` — one concept per slug, with parent links and an `# Anchored records`
1769
+ backlink section. The page shows the slug's current row: a row loses to every row of its
1770
+ slug that has no later revision under that slug, following supersession through any slug,
1771
+ and among the rest the newest id wins.
1765
1772
  - `entities/` — only entities actually referenced by an exported anchor; each page lists
1766
1773
  every decision/fact anchored to it. Bindings to `domain:*` entities link to the domain
1767
1774
  page instead; volatile `community:*` bindings are not exported at all.
@@ -788,7 +788,9 @@ degrades to un-synced retrieval, never an error), resolves `files`/`entities` in
788
788
  and returns a rendered Markdown string with up to six sections — accepted mistakes (with
789
789
  accepted inline evidence facts), accepted decisions (with accepted inline evidence), accepted
790
790
  known facts (standalone), structural map, related accepted memory, and unratified proposals —
791
- under the given character budgets. See
791
+ under the given character budgets. Related memory reached by expansion shows at most 5 short
792
+ lines with ids, plus a count of the rest; see
793
+ [retrieval: two-tier rendering](../concepts/retrieval.md). See
792
794
  [retrieval: facts](../concepts/retrieval.md#facts-inline-evidence-and-the-known-facts-bucket)
793
795
  for the inline-vs-standalone split and the guarantee that facts never displace a mistake. The
794
796
  structural map omits
@@ -46,11 +46,12 @@ characters long. Every ULID qualifies. The store refuses to write a record whose
46
46
  different from its filename is not a record at all: see
47
47
  [Freshness](#freshness-absorbing-a-git-pull) for how a reload treats it.
48
48
 
49
- **Symlinks inside the store are refused.** A `Store` will not open a directory any of whose
49
+ **Symlinks and Windows junctions inside the store are refused.** A `Store` will not open a directory any of whose
50
50
  subdirectories (`decisions/`, `facts/`, `domains/`, `entities/`, `bindings/`, `initiatives/`,
51
51
  `archive/`, `verifications/`, `shards/`), store files (`format`, `stamping_live_since`,
52
52
  `domain-snapshot.json`, `.gitignore`, `.gitattributes`, `index.db`, and
53
- SQLite's `index.db-journal`, `-wal` and `-shm`) or shard files (`shards/*.shard`) is a symlink, live or dangling: a linked
53
+ SQLite's `index.db-journal`, `-wal` and `-shm`) or shard entries (`shards/*.shard`) is a symlink
54
+ (live or dangling) or Windows directory junction: a linked
54
55
  `decisions/` would send every record write to the link's target, and a linked `index.db` would
55
56
  make SQLite write there. The error names the entry (`… inside the store is a symlink`);
56
57
  replace it with a real directory or file. `sidegraph-verify` reports each such entry as
@@ -58,10 +59,29 @@ replace it with a real directory or file. `sidegraph-verify` reports each such e
58
59
  `--against` comparison until the links are removed, and its text output says so in one line.
59
60
  An `--against` ref that does not resolve, or a store outside git, is checked before the stop and
60
61
  exits `1` without reporting the links.
61
- `sidegraph-doctor` does the same and skips its advisory checks. A symlinked store **root**
62
+ `sidegraph-doctor` does the same and skips its advisory checks. Junctions use the same
63
+ `symlinked-store-entry` code and existing symlink error wording. A deliberately linked store **root**
62
64
  (`.sidegraph -> ../shared/store`) is fine: a deliberately shared store is a real use. Record
63
65
  files inside a real subdirectory are still read as they are.
64
66
 
67
+ On Windows, format-2 maintenance writes shard bytes in binary mode, avoiding Python's
68
+ newline conversion. The store's `*.shard -text` Git attribute preserves those LF bytes
69
+ across checkout under either `core.autocrlf` setting. If another application holds a shard open
70
+ without delete sharing, replacement can fail with `PermissionError`. The error propagates;
71
+ maintenance does not delete the source files it has not finished publishing. Close the other
72
+ application and rerun the operation. Filesystem path/component limits likewise remain
73
+ operational errors; use a shorter store path if the host or Git cannot handle long paths
74
+ (`core.longpaths=true` enables Git for Windows' long-path support).
75
+ That option does not guarantee every Git operation can start from a directory longer than
76
+ 260 characters. If Git refuses the store directory during migration's entry checks, the
77
+ marker and records remain unchanged; use a shorter checkout/store path and retry.
78
+
79
+ Verify each committed operation against its input commit: migration against the format-1
80
+ commit, a record edit against the migrated commit, and compaction against the commit containing
81
+ the edited hot file. A compaction comparison checks that each published body existed in its
82
+ baseline; comparing an edited, compacted body directly to a ref before the edit does not meet
83
+ that requirement.
84
+
65
85
  **A symlinked store belongs to the project that holds the link.** The code a record is anchored
66
86
  to lives in that project, so the repository Sidegraph asks about the store is the project's, not
67
87
  the one the link points into: the `provenance.commit` stamped at capture is the project's `HEAD`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sidegraph",
3
- "version": "0.17.3",
3
+ "version": "0.19.0",
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.3",
4
+ "version": "0.19.0",
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.3",
3
+ "version": "0.19.0",
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.3",
4
+ "version": "0.19.0",
5
5
  "description": "Durable decisions, facts and lessons over your code graph.",
6
6
  "compat": {
7
7
  "source": "native",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sidegraph"
3
- version = "0.17.3"
3
+ version = "0.19.0"
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.3"
33
+ __version__ = "0.19.0"
34
34
 
35
35
  # name -> the submodule that defines it
36
36
  _LAZY = {