sidegraph 0.10.0__tar.gz → 0.11.1__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 (481) hide show
  1. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/ci.yml +22 -0
  2. {sidegraph-0.10.0 → sidegraph-0.11.1}/.pre-commit-config.yaml +10 -0
  3. {sidegraph-0.10.0 → sidegraph-0.11.1}/AGENTS.md +3 -2
  4. {sidegraph-0.10.0 → sidegraph-0.11.1}/CHANGELOG.md +258 -0
  5. {sidegraph-0.10.0 → sidegraph-0.11.1}/CLAUDE.md +4 -3
  6. {sidegraph-0.10.0 → sidegraph-0.11.1}/CONTRIBUTING.md +25 -2
  7. {sidegraph-0.10.0 → sidegraph-0.11.1}/PKG-INFO +8 -7
  8. {sidegraph-0.10.0 → sidegraph-0.11.1}/README.md +7 -6
  9. sidegraph-0.11.1/SECURITY.md +197 -0
  10. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/bootstrap.md +55 -11
  11. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/capturing-decisions.md +39 -3
  12. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/ci-cd-maintenance.md +4 -2
  13. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/semantic-docs.md +9 -0
  14. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/troubleshooting.md +4 -1
  15. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/README.md +12 -4
  16. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/cli.md +125 -31
  17. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/git-bindings.md +12 -2
  18. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/hooks.md +7 -2
  19. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/mcp-tools.md +107 -20
  20. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/releasing.md +8 -3
  21. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/stability.md +1 -1
  22. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/store-format.md +38 -8
  23. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/whitepaper/index.md +69 -51
  24. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  25. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  26. {sidegraph-0.10.0 → sidegraph-0.11.1}/pyproject.toml +4 -1
  27. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/__init__.py +1 -1
  28. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/apply.py +52 -10
  29. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/catalog.py +17 -0
  30. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/cli.py +278 -42
  31. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/model.py +14 -0
  32. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/planner.py +2 -0
  33. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/scan.py +72 -8
  34. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/capture.py +307 -90
  35. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/cli.py +115 -61
  36. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/doc_import.py +18 -4
  37. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/doctor.py +75 -7
  38. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/hooks.py +42 -0
  39. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/subagent.py +6 -1
  40. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/hot_index.py +8 -0
  41. sidegraph-0.11.1/src/sidegraph/input_limits.py +215 -0
  42. sidegraph-0.11.1/src/sidegraph/redaction_scan.py +326 -0
  43. sidegraph-0.11.1/src/sidegraph/redaction_tokens.py +117 -0
  44. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/server.py +225 -74
  45. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/stats/model.py +2 -1
  46. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/store.py +91 -36
  47. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/store_layout.py +124 -0
  48. sidegraph-0.11.1/src/sidegraph/validation_errors.py +164 -0
  49. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/verify.py +411 -122
  50. sidegraph-0.11.1/src/sidegraph/write_boundary.py +138 -0
  51. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/conftest.py +42 -0
  52. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/githooks_support.py +7 -0
  53. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_apply.py +44 -4
  54. sidegraph-0.11.1/tests/test_bootstrap_scan_regular.py +565 -0
  55. sidegraph-0.11.1/tests/test_bootstrap_unanchored.py +618 -0
  56. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_propose.py +164 -6
  57. sidegraph-0.11.1/tests/test_capture_redact.py +469 -0
  58. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_import.py +40 -0
  59. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_stats.py +47 -0
  60. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_unreadable_paths.py +2 -1
  61. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_digest_integrity.py +14 -5
  62. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doc_import.py +69 -0
  63. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor.py +4 -4
  64. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_auto_share.py +137 -0
  65. sidegraph-0.11.1/tests/test_doctor_unhashable_payload.py +165 -0
  66. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_domains.py +1 -1
  67. sidegraph-0.11.1/tests/test_entry_point_arguments.py +256 -0
  68. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_flow_profile.py +13 -0
  69. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_bindings_hook.py +117 -0
  70. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_githooks.py +55 -0
  71. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_integrity.py +30 -6
  72. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hot_index.py +8 -1
  73. sidegraph-0.11.1/tests/test_index_journal_mode.py +268 -0
  74. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_openspec_profile.py +4 -0
  75. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_pilot_kit_corpus_fit.py +50 -12
  76. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_public_hook_launch.py +8 -0
  77. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_ratify_policy.py +92 -29
  78. sidegraph-0.11.1/tests/test_redaction_scan.py +225 -0
  79. sidegraph-0.11.1/tests/test_redaction_tokens.py +223 -0
  80. sidegraph-0.11.1/tests/test_secret_scan_gate.py +223 -0
  81. sidegraph-0.11.1/tests/test_security_binary_limits.py +53 -0
  82. sidegraph-0.11.1/tests/test_security_capture_diagnostics.py +225 -0
  83. sidegraph-0.11.1/tests/test_security_capture_limits.py +132 -0
  84. sidegraph-0.11.1/tests/test_security_cli_diagnostics.py +69 -0
  85. sidegraph-0.11.1/tests/test_security_doc_limits.py +134 -0
  86. sidegraph-0.11.1/tests/test_security_input_limits.py +291 -0
  87. sidegraph-0.11.1/tests/test_security_mcp_write_diagnostics.py +240 -0
  88. sidegraph-0.11.1/tests/test_security_numeric_enums.py +154 -0
  89. sidegraph-0.11.1/tests/test_security_python_shapes.py +234 -0
  90. sidegraph-0.11.1/tests/test_security_redaction_cursor.py +37 -0
  91. sidegraph-0.11.1/tests/test_security_redaction_scaling.py +79 -0
  92. sidegraph-0.11.1/tests/test_security_validation_errors.py +106 -0
  93. sidegraph-0.11.1/tests/test_security_write_boundary.py +291 -0
  94. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_add_anchors.py +1 -1
  95. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_argument_names.py +1 -1
  96. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_capture.py +2 -1
  97. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_commit_hint.py +1 -3
  98. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_decision_listing.py +4 -1
  99. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_redaction.py +37 -0
  100. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_model.py +18 -0
  101. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_compact.py +256 -0
  102. sidegraph-0.11.1/tests/test_store_non_file_entries.py +514 -0
  103. sidegraph-0.11.1/tests/test_verify_git_framing.py +349 -0
  104. sidegraph-0.11.1/tests/test_verify_git_revisions.py +327 -0
  105. sidegraph-0.11.1/tests/test_verify_snapshot.py +1692 -0
  106. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_verify_transitions.py +456 -0
  107. {sidegraph-0.10.0 → sidegraph-0.11.1}/uv.lock +1 -1
  108. sidegraph-0.10.0/SECURITY.md +0 -59
  109. sidegraph-0.10.0/tests/test_capture_redact.py +0 -184
  110. sidegraph-0.10.0/tests/test_verify_snapshot.py +0 -771
  111. {sidegraph-0.10.0 → sidegraph-0.11.1}/.agents/plugins/marketplace.json +0 -0
  112. {sidegraph-0.10.0 → sidegraph-0.11.1}/.claude-plugin/marketplace.json +0 -0
  113. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/CODEOWNERS +0 -0
  114. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  115. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  116. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  117. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  118. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/secret_scanning.yml +0 -0
  119. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/publish.yml +0 -0
  120. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/scorecard.yml +0 -0
  121. {sidegraph-0.10.0 → sidegraph-0.11.1}/.github/workflows/session-link-gate.yml +0 -0
  122. {sidegraph-0.10.0 → sidegraph-0.11.1}/.gitignore +0 -0
  123. {sidegraph-0.10.0 → sidegraph-0.11.1}/.gitleaks.toml +0 -0
  124. {sidegraph-0.10.0 → sidegraph-0.11.1}/.python-version +0 -0
  125. {sidegraph-0.10.0 → sidegraph-0.11.1}/CODE_OF_CONDUCT.md +0 -0
  126. {sidegraph-0.10.0 → sidegraph-0.11.1}/LICENSE +0 -0
  127. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/README.md +0 -0
  128. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/anchoring.md +0 -0
  129. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/data-model.md +0 -0
  130. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/decision-memory.md +0 -0
  131. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/mind-model.md +0 -0
  132. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/concepts/retrieval.md +0 -0
  133. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/claude-code-setup.md +0 -0
  134. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/codex-setup.md +0 -0
  135. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/installation.md +0 -0
  136. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/getting-started/quickstart.md +0 -0
  137. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/naming-your-domains.md +0 -0
  138. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/retrieval-in-sessions.md +0 -0
  139. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/surviving-refactors.md +0 -0
  140. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/team-workflow.md +0 -0
  141. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/guides/verifying-your-setup.md +0 -0
  142. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/integrations/claude-code.md +0 -0
  143. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/integrations/codex.md +0 -0
  144. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/integrations/graphify.md +0 -0
  145. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/llms.txt +0 -0
  146. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/corpus_fit.py +0 -0
  147. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/judge-prompt.md +0 -0
  148. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/questions-prompt.md +0 -0
  149. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/pilot-kit/rubric-template.md +0 -0
  150. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/configuration.md +0 -0
  151. {sidegraph-0.10.0 → sidegraph-0.11.1}/docs/reference/operations.md +0 -0
  152. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/.mcp.json +0 -0
  153. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/codex/hooks.json +0 -0
  154. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/codex/mcp.json +0 -0
  155. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/hooks/hooks.json +0 -0
  156. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  157. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  158. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  159. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  160. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  161. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  162. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  163. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  164. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  165. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  166. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  167. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  168. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  169. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  170. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
  171. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  172. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
  173. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  174. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  175. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  176. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
  177. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
  178. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
  179. {sidegraph-0.10.0 → sidegraph-0.11.1}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  180. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/anchoring.py +0 -0
  181. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bash_paths.py +0 -0
  182. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/__init__.py +0 -0
  183. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/integrations.py +0 -0
  184. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/proof.py +0 -0
  185. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/bootstrap/review.py +0 -0
  186. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/config.py +0 -0
  187. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/domains.py +0 -0
  188. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/engine/__init__.py +0 -0
  189. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/engine/reader.py +0 -0
  190. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/freshness.py +0 -0
  191. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/gitenv.py +0 -0
  192. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/githooks.py +0 -0
  193. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/gitio.py +0 -0
  194. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/__init__.py +0 -0
  195. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/claude_settings.py +0 -0
  196. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/host/launch.py +0 -0
  197. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/importer.py +0 -0
  198. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/integrity.py +0 -0
  199. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/nearest_anchored.py +0 -0
  200. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/okf.py +0 -0
  201. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/profiles.py +0 -0
  202. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/retrieval.py +0 -0
  203. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/schema.py +0 -0
  204. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/seed_ladder.py +0 -0
  205. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/stats/__init__.py +0 -0
  206. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/stats/render.py +0 -0
  207. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/sync.py +0 -0
  208. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/text_paths.py +0 -0
  209. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/__init__.py +0 -0
  210. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  211. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/model.py +0 -0
  212. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/render.py +0 -0
  213. {sidegraph-0.10.0 → sidegraph-0.11.1}/src/sidegraph/viz/template.html +0 -0
  214. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/__init__.py +0 -0
  215. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  216. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bitfinex_slice.json +0 -0
  217. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  218. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  219. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  220. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  221. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  222. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/graph.json +0 -0
  223. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  224. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  225. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  226. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  227. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  228. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  229. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  230. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/openspec/graph.json +0 -0
  231. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  232. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  233. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  234. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  235. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  236. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  237. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  238. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  239. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  240. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/sad.md +0 -0
  241. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  242. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  243. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  244. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  245. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  246. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  247. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/design.md +0 -0
  248. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  249. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/proposal.md +0 -0
  250. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  251. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  252. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  253. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  254. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  255. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  256. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  257. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  258. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  259. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  260. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  261. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  262. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  263. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/member_names_python_graph.json +0 -0
  264. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/member_names_swift_graph.json +0 -0
  265. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/fixtures/mini_graph.json +0 -0
  266. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_agent_brief_manifests.py +0 -0
  267. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_anchoring.py +0 -0
  268. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_anchoring_mapping_refresh.py +0 -0
  269. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bash_paths.py +0 -0
  270. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_catalog.py +0 -0
  271. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_cli.py +0 -0
  272. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_integrations.py +0 -0
  273. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_model.py +0 -0
  274. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_planner.py +0 -0
  275. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_proof.py +0 -0
  276. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_review.py +0 -0
  277. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_bootstrap_scan.py +0 -0
  278. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_auto_accept.py +0 -0
  279. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_facts.py +0 -0
  280. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_initiative.py +0 -0
  281. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_integration.py +0 -0
  282. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_capture_neighbors.py +0 -0
  283. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_compact.py +0 -0
  284. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_doctor.py +0 -0
  285. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_domains.py +0 -0
  286. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_graph_paths.py +0 -0
  287. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_init.py +0 -0
  288. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_init_hooks.py +0 -0
  289. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_okf.py +0 -0
  290. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_ratify.py +0 -0
  291. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_ratify_facts.py +0 -0
  292. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_sync.py +0 -0
  293. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_sync_check.py +0 -0
  294. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_cli_viz.py +0 -0
  295. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_codex_plugin.py +0 -0
  296. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_community_baseline.py +0 -0
  297. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_config.py +0 -0
  298. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_config_ancestor_lookup.py +0 -0
  299. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_config_borrowed_graph.py +0 -0
  300. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_corpus_expected_renders.py +0 -0
  301. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_corpus_self_corpus.py +0 -0
  302. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_coverage_telemetry_e2e.py +0 -0
  303. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doc_corpus_integration.py +0 -0
  304. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_docs_claims.py +0 -0
  305. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_code_drift.py +0 -0
  306. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_dangling_supports.py +0 -0
  307. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_duplicate_entity.py +0 -0
  308. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_graph_root_mismatch.py +0 -0
  309. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_graph_stale.py +0 -0
  310. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_integrity.py +0 -0
  311. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_never_surfaced.py +0 -0
  312. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_scan.py +0 -0
  313. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_stale_instructions.py +0 -0
  314. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_doctor_unratified_accept.py +0 -0
  315. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_entity_duplicate_resolution.py +0 -0
  316. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_entity_get_or_create_race.py +0 -0
  317. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_env_isolation.py +0 -0
  318. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_fact_reachability_gate.py +0 -0
  319. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_bindings_blame.py +0 -0
  320. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_bindings_provenance.py +0 -0
  321. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_config_isolation.py +0 -0
  322. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_git_env.py +0 -0
  323. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_graph_freshness.py +0 -0
  324. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hook_spawn_guard.py +0 -0
  325. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_agent_brief.py +0 -0
  326. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_agent_state.py +0 -0
  327. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_borrowed_graph.py +0 -0
  328. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_claude_settings.py +0 -0
  329. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_drift_nudge.py +0 -0
  330. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_launch.py +0 -0
  331. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_pretool.py +0 -0
  332. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_pretool_records.py +0 -0
  333. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_session_key.py +0 -0
  334. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_session_start.py +0 -0
  335. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_session_start_concurrent.py +0 -0
  336. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_stop.py +0 -0
  337. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_subagent_start.py +0 -0
  338. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_subdirectory_launch.py +0 -0
  339. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_touch_events.py +0 -0
  340. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_host_wiring_checks.py +0 -0
  341. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hot_index_hook.py +0 -0
  342. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_hot_path_imports.py +0 -0
  343. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_import_dry_run_preview.py +0 -0
  344. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_importer.py +0 -0
  345. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity.py +0 -0
  346. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity_refresh_hook.py +0 -0
  347. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity_replay.py +0 -0
  348. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_integrity_stranded.py +0 -0
  349. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_lazy_root.py +0 -0
  350. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_member_anchor_wiring.py +0 -0
  351. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_mind_model_additive_fields.py +0 -0
  352. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_nearest_anchored.py +0 -0
  353. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_okf.py +0 -0
  354. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_pathless_descriptor_adoption.py +0 -0
  355. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_proposal_lifecycle.py +0 -0
  356. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_ratify_listing_gone_dark.py +0 -0
  357. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_community_labels.py +0 -0
  358. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_doc_nodes.py +0 -0
  359. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_graph.py +0 -0
  360. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_integration.py +0 -0
  361. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_member_name_lookup.py +0 -0
  362. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_member_names.py +0 -0
  363. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_nodes_in_file.py +0 -0
  364. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_perf.py +0 -0
  365. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_rationale.py +0 -0
  366. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_read.py +0 -0
  367. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_resolve.py +0 -0
  368. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_subdir_mismatch.py +0 -0
  369. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_reader_version.py +0 -0
  370. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_redaction_seeded.py +0 -0
  371. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_repoint_integration.py +0 -0
  372. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_budget_counters.py +0 -0
  373. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_context.py +0 -0
  374. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_drift_marker.py +0 -0
  375. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_drilldown.py +0 -0
  376. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_facts.py +0 -0
  377. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_guessed.py +0 -0
  378. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_ids.py +0 -0
  379. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_integration.py +0 -0
  380. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_rank.py +0 -0
  381. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_seeds.py +0 -0
  382. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_shown_ids.py +0 -0
  383. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_terminal_evidence.py +0 -0
  384. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_thin_tools.py +0 -0
  385. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_toc.py +0 -0
  386. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_toptier.py +0 -0
  387. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_retrieval_unratified.py +0 -0
  388. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sandbox_hygiene.py +0 -0
  389. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_schema_descriptor.py +0 -0
  390. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_schema_domain.py +0 -0
  391. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_schema_fact.py +0 -0
  392. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_seed_ladder.py +0 -0
  393. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_anchoring.py +0 -0
  394. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_annotations.py +0 -0
  395. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_borrowed_graph.py +0 -0
  396. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_coverage_events.py +0 -0
  397. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_domains.py +0 -0
  398. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_drilldown.py +0 -0
  399. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_facts.py +0 -0
  400. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_find_entity.py +0 -0
  401. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_get_store.py +0 -0
  402. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_get_task_context.py +0 -0
  403. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_graph_freshness.py +0 -0
  404. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_graph_path.py +0 -0
  405. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_import.py +0 -0
  406. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_mcp_smoke.py +0 -0
  407. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_nearest_anchored.py +0 -0
  408. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_prewrite_anchor_validation.py +0 -0
  409. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_ratify_facts.py +0 -0
  410. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_record_types.py +0 -0
  411. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_refresh.py +0 -0
  412. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_render_events.py +0 -0
  413. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_supersede.py +0 -0
  414. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_sync_anchors.py +0 -0
  415. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_telemetry.py +0 -0
  416. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_thin_tools.py +0 -0
  417. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_tolerant_seeds.py +0 -0
  418. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_server_verify.py +0 -0
  419. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_graph.py +0 -0
  420. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_health.py +0 -0
  421. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_render.py +0 -0
  422. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_skill.py +0 -0
  423. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stats_snapshot.py +0 -0
  424. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stop_hot_path.py +0 -0
  425. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_stop_rearm.py +0 -0
  426. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store.py +0 -0
  427. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_agent_state.py +0 -0
  428. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_atomic_write_tmp_names.py +0 -0
  429. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_bad_file.py +0 -0
  430. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_binding_index.py +0 -0
  431. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_canonical_stat.py +0 -0
  432. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_compact_review.py +0 -0
  433. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_concurrent_open.py +0 -0
  434. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_coverage_telemetry.py +0 -0
  435. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_derived_community.py +0 -0
  436. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_domains.py +0 -0
  437. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_entities.py +0 -0
  438. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_fact_cascade.py +0 -0
  439. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_facts.py +0 -0
  440. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_git_root_symlink.py +0 -0
  441. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_meta.py +0 -0
  442. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_migration.py +0 -0
  443. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_mutation_guard.py +0 -0
  444. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_mutation_immediate.py +0 -0
  445. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  446. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_persistence.py +0 -0
  447. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_ratification.py +0 -0
  448. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_rebuild_atomicity.py +0 -0
  449. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_record_identity.py +0 -0
  450. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_record_types.py +0 -0
  451. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_render_events.py +0 -0
  452. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_retrieval.py +0 -0
  453. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_slug_conflicts.py +0 -0
  454. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_stamping_marker.py +0 -0
  455. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_symlinks.py +0 -0
  456. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_telemetry.py +0 -0
  457. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_threading.py +0 -0
  458. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_tmp_sweep_age.py +0 -0
  459. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_store_update_meta_if.py +0 -0
  460. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_subagent_start_manifests.py +0 -0
  461. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_canonical_writes.py +0 -0
  462. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_clean.py +0 -0
  463. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_domains.py +0 -0
  464. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_drift_cache.py +0 -0
  465. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_fresh_clone.py +0 -0
  466. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_integration.py +0 -0
  467. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_moved_adoption.py +0 -0
  468. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_rebind.py +0 -0
  469. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_repoint.py +0 -0
  470. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_report_has_findings.py +0 -0
  471. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_run.py +0 -0
  472. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_toc_cache.py +0 -0
  473. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_volatile_heal.py +0 -0
  474. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_sync_wiring.py +0 -0
  475. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_telemetry_retention.py +0 -0
  476. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_text_paths.py +0 -0
  477. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_asset_packaged.py +0 -0
  478. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_model.py +0 -0
  479. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_render_html.py +0 -0
  480. {sidegraph-0.10.0 → sidegraph-0.11.1}/tests/test_viz_render_json.py +0 -0
  481. {sidegraph-0.10.0 → sidegraph-0.11.1}/tools/check_no_session_links.py +0 -0
@@ -28,6 +28,7 @@ jobs:
28
28
  # leak them.
29
29
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
30
30
  with:
31
+ fetch-depth: 0 # committed-history secret scan needs every reachable commit
31
32
  persist-credentials: false
32
33
 
33
34
  - name: Install uv
@@ -49,6 +50,27 @@ jobs:
49
50
  - name: Run pre-commit checks
50
51
  run: uv run pre-commit run --all-files
51
52
 
53
+ - name: Scan committed history for secrets
54
+ run: |
55
+ test "$(git rev-parse --is-shallow-repository)" = false
56
+ uv run pre-commit run gitleaks-history --hook-stage manual --all-files
57
+
58
+ - name: Exercise secret scanner integration
59
+ env:
60
+ SIDEGRAPH_SECRET_SCAN_INTEGRATION: "1"
61
+ run: |
62
+ uv run pytest tests/test_secret_scan_gate.py -q --junitxml="$RUNNER_TEMP/secret-scan.xml"
63
+ python3 - <<'PY'
64
+ import os
65
+ from pathlib import Path
66
+ from xml.etree import ElementTree
67
+
68
+ report = Path(os.environ["RUNNER_TEMP"]) / "secret-scan.xml"
69
+ suites = list(ElementTree.parse(report).getroot().iter("testsuite"))
70
+ assert sum(int(s.attrib["tests"]) for s in suites) > 0, "no scanner tests ran"
71
+ assert sum(int(s.attrib["skipped"]) for s in suites) == 0, "scanner tests skipped"
72
+ PY
73
+
52
74
  test:
53
75
  runs-on: ubuntu-latest
54
76
  timeout-minutes: 30
@@ -71,6 +71,16 @@ repos:
71
71
  rev: v8.30.1
72
72
  hooks:
73
73
  - id: gitleaks
74
+ # Filename exclusions protect immutable files from formatters, not this scanner:
75
+ # its upstream entry reads the staged Git index without filtered filenames.
76
+ always_run: true
77
+ stages: [pre-commit]
78
+ - id: gitleaks
79
+ alias: gitleaks-history
80
+ name: Detect hardcoded secrets in committed history
81
+ entry: gitleaks git --redact "--log-opts=--diff-merges=first-parent HEAD" --verbose
82
+ always_run: true
83
+ stages: [manual]
74
84
 
75
85
  # Finds GitHub Actions supply-chain/security issues (unpinned actions, script injection via
76
86
  # untrusted `${{ }}` template interpolation, excessive `permissions:`) in the workflows that
@@ -31,8 +31,9 @@ Tests/fixtures: `tests/`; plugin skills/configuration in `plugin/sidegraph/`.
31
31
  Python 3.13+; `uv`:
32
32
 
33
33
  - `uv sync --locked`: install dependencies.
34
- - `uv run pytest tests/test_store.py -q`: focused tests.
35
- - `uv run pytest -q`: full suite; CI covers 3.13/3.14.
34
+ - `uv run pytest tests/test_store.py -q`: the touched test file while editing (`-x`, `--lf`).
35
+ - `uv run pytest -m "not slow"`: the broader pre-push check; skips the subprocess-heavy tests, but still takes minutes.
36
+ - `uv run pytest -q`: full suite; run it once before a commit or PR, not while editing. CI runs it again (3.13/3.14).
36
37
  - `uv run pre-commit run --all-files`: shared lint/format/type/secret-scanning gate (also
37
38
  runs `gitleaks`, `detect-private-key`, `zizmor`, `actionlint`, `check-toml`, and a
38
39
  `uv.lock`-in-sync check).
@@ -7,6 +7,264 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.11.1] — 2026-10-10
11
+
12
+ ### Fixed
13
+
14
+ - **Bootstrap excludes special files and validates one bounded regular descriptor.** FIFO,
15
+ sockets and devices cannot become selected text sources, including through `--include`.
16
+ Available nonblocking/no-follow flags guard final-component replacement; the opened
17
+ descriptor is rechecked before strict incremental UTF-8 validation. Directory aliases
18
+ are rechecked against exclusions. Include retains its size override but observed growth
19
+ past opened size is excluded. Later planner/apply reads and ancestor races retain their
20
+ existing scope.
21
+
22
+ - **Git verification preserves unusual filenames through binary NUL framing.** Verify and
23
+ doctor detect immutable edits and archive deletions at paths containing Unicode, TAB,
24
+ LF, CR, quotes, backslashes or surrounding whitespace. Malformed or unsupported diff
25
+ output is an operational error (exit `1`), never a partial clean report. Shared Git
26
+ callers keep their decoded-text behavior; only diff reads raw pathname bytes.
27
+
28
+ - **Git verification resolves `--against` to one protected, frozen commit ID.** Verify and
29
+ doctor reject option-shaped, empty, NUL-containing, unavailable and non-commit baselines
30
+ operationally (exit `1`). Diff and every baseline record read use the same full SHA-1 or
31
+ SHA-256 ID, so a branch moving between those operations cannot hide an immutable edit.
32
+ There is no raw-ref fallback. Current working-tree reads retain
33
+ their existing concurrency limits.
34
+
35
+ - **Malformed write diagnostics omit raw input and arbitrary failure causes.** Capture
36
+ errors use bounded schema fields/codes; logical MCP writes apply raw admission before
37
+ signature coercion and intercept exceptions before framework warning/error logging.
38
+ Unknown write arguments keep valid parameter help without echoing their names.
39
+ Unsupported registrations fail closed. Partial-write warnings and recovery guidance
40
+ remain truthful; domain/ratify causes are controlled. Read diagnostics and upstream
41
+ FastMCP DEBUG argument tracing retain their existing scope.
42
+
43
+ - **Capture and direct writes reject oversized input before redaction or canonical writes.**
44
+ Limits are 256 KiB UTF-8 per string, 4 MiB admitted strings and 65,536 admitted nodes per
45
+ request, depth 32 and 4,096 nodes per draft, and 100 agent drafts including attached facts.
46
+ Combined decisions/facts share one budget; item violations reject the containing draft,
47
+ while request-wide violations fail before any write. Documents have an independent 8 MiB
48
+ per-file limit with whole-file skips, matching real/dry reports and no total-import cap.
49
+ Import tags and free-text options are bounded separately; input is never silently truncated.
50
+ Raw Python batches use lists/tuples; supported scalar, mapping and model fields are
51
+ inspected. Other opaque Python values (including sets, deques, generators and non-string
52
+ Enum objects) are rejected before Pydantic coercion, without consuming iterators. Numeric
53
+ enums can become strings rather than behave as numbers in Pydantic string fields; only
54
+ string-derived enums keep their measured base-string behavior.
55
+ - **Redaction avoids repeated suffix searches in four known attack families.** Linear
56
+ assignment-key, URL-credential, JWT and private-key-block recognizers preserve matching
57
+ order/counts and the existing conservative quoted-value behavior. This does not claim
58
+ universal regex linearity or complete secret detection. See [security policy](SECURITY.md).
59
+
60
+ - **Secret-bearing tags are redacted before document import stores their slugs.** Capture,
61
+ direct MCP writes and document import share tag normalization. Import reports tag
62
+ substitutions once per batch in real and dry runs, including duplicate raw tags.
63
+ Comma-separated MCP strings are cleaned before splitting; a secret-bearing string with
64
+ commas drops all its tags conservatively. List input keeps explicit boundaries.
65
+
66
+ - **Quoted assignment redaction consumes multiline, triple-quoted and unterminated values.**
67
+ Escaped closers and glued tails stay covered. An unterminated value removes the
68
+ remaining input conservatively if no legal closer is found. An assignment span,
69
+ including URL/card expansion, that would swallow another assignment's key also consumes
70
+ the remaining input and following prose. A multiline quoted span splitting a URL
71
+ credential or checksum-valid grouped card number does so too. Bare values and
72
+ single-line glued tails extend through crossing URL/card matches while otherwise
73
+ preserving later prose. Prior tag entities and Git history remain: review old tags and
74
+ rotate exposed credentials. Unicode letters/digits after a single quote keep it inside
75
+ the value as an apostrophe; an unclosed value removes the remainder.
76
+
77
+ - **Secret scanning covers store-only commits and committed CI history.** The pinned
78
+ Gitleaks hook runs even when changed files are excluded from formatting. A separate manual
79
+ `gitleaks-history` hook scans committed HEAD history, also run by CI with a full checkout.
80
+ Scanner integration tests exercise staged, committed, and removed synthetic secrets.
81
+
82
+ - **Store verification checks the content of newly archived history.** A matching archive ID
83
+ alone no longer permits deletion of a committed hot decision or domain: every archive copy
84
+ must be compactable and a legal transition from the baseline, preserving raw immutable keys.
85
+ The snapshot check also reports nonterminal archive records. Legal supersede/drop followed
86
+ by compaction, older absent `null`/empty defaults, identical merge copies, and crash cleanup
87
+ still pass.
88
+
89
+ ### Changed
90
+
91
+ - **Security documentation states the limits explicitly.** The privacy overview describes
92
+ best-effort redaction and writes outside the store. CLI documentation distinguishes
93
+ argument syntax errors from rejected Git baselines and recommends JSON output when
94
+ a terminal cannot encode a reported pathname.
95
+
96
+ ## [0.11.0] — 2026-10-09
97
+
98
+ ### Changed
99
+
100
+ - **`index.db` no longer creates and deletes its journal in every write transaction.** SQLite's
101
+ default rollback mode (`DELETE`) created `index.db-journal` at the start of each write and
102
+ removed it at the end, and the hooks write on every tool call, so one store produced
103
+ hundreds of thousands of file-system events an hour. Every connection that writes now runs
104
+ `journal_mode=TRUNCATE`: the same rollback journal, locking and crash safety, but the journal
105
+ is emptied rather than deleted, so a 0-byte `index.db-journal` stays beside `index.db`
106
+ (gitignored by `index.db*`, as before). Each transaction still writes, truncates and syncs
107
+ that file, so the events do not vanish: they fall most for back-to-back writes (tests, bulk
108
+ imports: about nine times fewer on the journal) and by about a third for hook traffic.
109
+ Read-only connections still write nothing, and there is normally no `-wal`/`-shm`; an index
110
+ that another connection has pinned in WAL stays in WAL, which Sidegraph tolerates. A crash
111
+ mid-transaction still leaves a non-empty journal that the next writer rolls back.
112
+
113
+ ### Fixed
114
+
115
+ - **The `UNANCHORED` line of `sidegraph-bootstrap` now names the graph in use.** It always said
116
+ to run `graphify update .`, which rebuilds only the default graph, so with `--graph` or
117
+ `$SIDEGRAPH_GRAPH` elsewhere the advice could not make the next run write the document. It now
118
+ uses the same step as the `ANCHORS` line: `rebuild the graph at <path> and rerun` for a custom
119
+ graph, `run `graphify update .` and rerun` for the default one.
120
+ - **A fresh `sidegraph-bootstrap` run now lists the store's creation marker as changed.** The
121
+ `CHANGED` lines and `--report` named `format` and `.gitignore` but not the committed
122
+ `stamping_live_since` file the same run created.
123
+ - **`sidegraph-bootstrap` now says what is wrong when a ratified or revived record is out of the
124
+ graph's reach.** For an accepted candidate with no anchor in the current graph whose content
125
+ is already stored (ratified in place, or revived from a rejected record), every rerun used to
126
+ print `ANCHORS incomplete: accepted candidate has unresolved or ambiguous anchors`,
127
+ `PROOF incomplete: selected decision did not surface` and a `RESUME` line that could never
128
+ succeed, and exit 2. The anchors are now judged by whether the
129
+ record still surfaces through production retrieval, the same test as `PROOF`: when it does
130
+ not, the run still exits 2 but prints ``ANCHORS incomplete: stored record <id> for
131
+ <source> has no anchor in the current graph; run `graphify update .` and rerun``, a matching
132
+ `PROOF` reason and a `NEXT` line with that command instead of `RESUME`; once the graph has the
133
+ node, the rerun exits 0. The exact `RESUME` stays when something a resume can fix (a failed
134
+ write, missing host wiring) is also wrong, and with `--graph` the line names the graph to
135
+ rebuild instead. The `--report` file carries the same remedy. A written record with an
136
+ unresolved backticked mention keeps its old message.
137
+ - **A directory named like a record no longer makes the whole store unopenable.** A directory
138
+ (or a dangling or looping symlink) called `.x.json`, or `01ABC.json`, in `decisions/`,
139
+ `facts/`, `domains/`, `entities/` or `initiatives/` (or in `bindings/` under a safe name, or
140
+ `archive/` as `*.jsonl`) crashed every open of the store, so every hook and MCP call failed
141
+ (`IsADirectoryError` for a directory, `Too many levels of symbolic links` for a looping
142
+ link), and a FIFO there blocked the open for ever. The reload now skips any entry that is not
143
+ a regular file before reading it, lists it in the skipped files with the reason `not a
144
+ regular file`, and the startup warning names it; the other records load and the next open
145
+ takes the fast path. `sidegraph-verify` reports such an entry once, as `unsafe-record-id`
146
+ for an unsafe record name and as `parse-error` (`bad-archive-segment` in `archive/`,
147
+ whatever the segment's name) otherwise, and no longer blocks on a FIFO, including
148
+ `--against` when a tracked file was replaced by one. A stale directory or looping symlink
149
+ named `*.tmp` no longer fails the open either. `sidegraph-stats` no longer ends in a
150
+ traceback on a looping link, and no longer reports the index as behind for ever because of a
151
+ dangling symlink. The skip reason for a file with an unsafe name now says `unsafe filename`
152
+ instead of "id 'A' does not match the filename".
153
+ - **`sidegraph-prepare-commit-msg` no longer leaves its candidate block in `git commit -m`
154
+ messages under the `pre-commit` framework.** The framework passes the hook only the message
155
+ file and hands git's source in `PRE_COMMIT_COMMIT_MSG_SOURCE`, so the hook always saw "source
156
+ absent" and wrote its `# Sidegraph: uncomment the trailers…` and `# Sidegraph-Decision: …`
157
+ lines, which `-m` commits keep. With exactly one argument the hook now reads the source from
158
+ that variable (unset or empty means a plain commit); with two or three arguments, as raw git
159
+ passes them, the arguments still win.
160
+ - **The hook entry points answer `--help` instead of running.** `sidegraph-session-start --help`
161
+ ran the SessionStart hook in the current directory and wrote into its `index.db`, and the other
162
+ three hook scripts (`sidegraph-stop`, `sidegraph-pre-tool-use`, `sidegraph-subagent-start`)
163
+ ignored their arguments the same way, while `sidegraph-prepare-commit-msg --help` printed
164
+ nothing and `sidegraph-mcp --help` started the server. Each now prints a short usage text for
165
+ `-h` or `--help` and exits 0 before it reads stdin, opens the store or writes anything. Any
166
+ other argument to a hook script is a usage error on stderr with exit 2. The git hook
167
+ `sidegraph-prepare-commit-msg` stays fail-open: it prints the same error for an unknown option
168
+ or a fourth argument but exits 0 and leaves the message untouched, so `git commit` never fails
169
+ because of a stray `args:` entry; git's one to three positional arguments are unchanged. Hosts call the hook scripts without
170
+ arguments, so nothing a host runs changes.
171
+ - **`sidegraph-bootstrap` now converges when an accepted candidate has no anchor.** A document
172
+ with no backticked symbol and no node in the graph (typically one newer than the last graph
173
+ build) was never written, yet stayed pending: every run, `--resume` included, ended
174
+ `partial-recoverable` or `incomplete` with exit 2 and a `FAILED REF <none>` the operator
175
+ could not act on. Review now flags it with a `no-anchor` warning, and apply skips it by name
176
+ on an `UNANCHORED` line with its source path (`skipped_unanchorable_keys` in the report object)
177
+ and counts it as neither durable nor pending, so it no longer keeps the run partial. A run
178
+ where every approved candidate is skipped this way writes no record and ends as a diagnostic
179
+ that exits 0. It keeps the checks a run with records has, except the anchor and proof ones:
180
+ the store reopens and verifies clean, the host integration is verified, and `--report` is
181
+ written. A missing host integration or a store violation exits 2 instead (`STORE
182
+ incomplete`, with `RESUME`, or `sidegraph-verify` for a violation), as does an anchored
183
+ candidate kept proposed. Run `graphify update .` (or rebuild the `--graph` file) and the next
184
+ run writes it.
185
+ `sidegraph-import` is unchanged.
186
+ - **`sidegraph-verify` now reports a domain whose `parent_id` is not a domain, or whose parent
187
+ chain loops.** The store refuses to write either, but a hand-edited domain with
188
+ `parent_id: "not-a-domain"` passed `sidegraph-verify` and `sidegraph-doctor` with exit 0. A
189
+ `parent_id` that names no domain, hot or archived, is now a `dangling-parent`, and a parent
190
+ chain that comes back to itself (a domain that is its own parent included) is one
191
+ `parent-cycle` per cycle, at the domain with the smallest id on it. A superseded, dropped or
192
+ compacted parent still counts as existing, so a history written through the tools stays
193
+ clean, and a parent held by a file skipped for its name is not reported twice. A non-string
194
+ `parent_id` stays a `parse-error` (a `bad-archive-segment` in an archive segment).
195
+ - **A record directory the process cannot list or search is reported as unreadable, not as
196
+ missing records.** With `decisions/` at mode 000, `sidegraph-verify` printed a
197
+ `dangling-fact-support` for every fact and `--against` an `illegal-deletion` for every
198
+ record, as if the store had been tampered with. `sidegraph-verify` and `sidegraph-doctor` now
199
+ stop with one `store not readable` line naming the directory and exit 1, before any
200
+ cross-reference or deletion check runs. `sidegraph-stats` likewise says `cannot read the
201
+ store index` instead of `no store index` when the store directory cannot be searched, and no
202
+ longer ends in a traceback when a record directory cannot be listed. An empty record
203
+ directory without the search bit is reported the same way.
204
+ - **`sidegraph-verify` reports only `unsafe-record-id` for a record file the store skips for
205
+ its name or id.** A copy such as `decisions/.x.json` was also reported as
206
+ `filename-id-mismatch` and `duplicate-ulid`, and a file with a safe name but an unsafe id as
207
+ `filename-id-mismatch` too, though the store never indexes either. A file with an unsafe
208
+ name that was not valid JSON, not UTF-8 or not an object showed only `parse-error`, and the
209
+ same went for a `bindings/` file that was not a JSON list, so the real problem, the name,
210
+ went unreported. The name is now checked before the content, in every record directory. A
211
+ file skipped for its name no longer counts as a second copy of a record, but a record that
212
+ points at its id is not reported either: renaming the file back is the only fix.
213
+ - **`sidegraph-compact` no longer warns "DIFFERENT content" for a hot file that only lacks
214
+ newer keys.** A decision or domain written before `ratified_at`, `ratified_by` or
215
+ `provenance.commit` existed has no such keys, while its archive line, dumped from the model,
216
+ carries them as `null`. The raw comparison read that as a difference, kept the hot file and
217
+ repeated the warning on every index rebuild and every later compact. The visible damage was
218
+ that `sidegraph-verify` then exited 2 with a `duplicate-ulid` for each kept hot file, so the
219
+ store-lint gate failed after a compact. A key the hot file lacks now matches an explicit
220
+ `null` or an empty list or object in the archive, recursively, as `sidegraph-verify
221
+ --against` already treats it. The match is one-directional: a key only the hot file holds, at
222
+ any depth and whatever its value, still warns and keeps the file, so a field written by a
223
+ newer version is never lost to a compact by an older one.
224
+ - **`sidegraph-doctor` keeps its `auto share` and `auto supersede rate` lines on a hand-edited
225
+ archived record.** An archived decision, a fact or a domain whose `status` was a list or a
226
+ dict made the auto-share tally raise, and doctor swallowed the error and dropped both lines
227
+ without a word. The bad value now counts as not retired and the lines print. Any other error
228
+ in the ratification lines is no longer swallowed.
229
+ - **`sidegraph-verify` no longer crashes on a non-string `supersedes`.** A hand-edited record
230
+ whose `supersedes` was a list or a dict ended the run with a `TypeError` and lost every
231
+ other violation. The bad value is now reported as the violation it is and the run goes on.
232
+ - **`sidegraph-verify` no longer crashes on an unhashable `supports` item, a status in
233
+ `--against`, or the malformed id of a deleted record.** Each used a raw hand-edited value as a
234
+ set member or lookup key; the run died with exit 1 where it should find the violation and exit
235
+ 2. A malformed old status in `--against` is now reported as an illegal status jump.
236
+ - **A symlinked store directory now stops `sidegraph-verify` and `sidegraph-doctor` at the
237
+ link.** Verify reported the link but still read through it: `facts -> decisions` linted every
238
+ decision as a fact, a link out of the store linted foreign files, and a linked-out `entities`,
239
+ `decisions` or `archive` made references into it look dangling. Both commands now report the
240
+ `symlinked-store-entry` findings, skip every other check (doctor's advisory checks and
241
+ `--against` included) and print one line saying so in text output; the exit code stays 2. An
242
+ `--against` ref that does not resolve, or a store outside git, is still checked first and exits
243
+ 1 without reporting the links. A
244
+ symlinked `format` marker is no longer read, so its target's text cannot reach a CI log. A bindings file with
245
+ an unsafe name no longer also reports its entities as dangling, since the store skips that
246
+ file whole.
247
+ - **`sidegraph-verify` and `sidegraph-doctor` report a store directory they cannot search as
248
+ `store not readable` on every Python.** With the store directory (or a parent) lacking the
249
+ search bit, for example `chmod 000` or `chmod 600 .sidegraph`, Python 3.14 reported
250
+ `unknown-schema-version … format marker missing` or `store directory not found` with exit 2
251
+ or 1, which read as a bad schema version or a missing store; Python 3.13 already printed
252
+ `store not readable (…)` with exit 1. Both commands now look the directory and its `format`
253
+ marker up with `os.stat`/`os.lstat`, which raise on every Python, and take the exit-1 path.
254
+ A directory that is searchable but not listable (`chmod 300`) is still checked normally.
255
+ The MCP `verify_store` tool now raises on 3.14 as it did on 3.13 instead of reporting
256
+ `unknown-schema-version`, and a store path that is a symlink loop reports the OS error
257
+ (`Too many levels of symbolic links`) instead of `store directory not found`, still with
258
+ exit 1.
259
+ - **`sidegraph-doctor` no longer crashes on a list or dict `status` or `entity_id`.** A
260
+ hand-edited decision whose `status` was a list or a dict, or an anchor-set entry whose
261
+ `entity_id` was one, made the dangling-record, unreferenced-entity, expired-open-validity,
262
+ never-surfaced and code-drift checks raise a `TypeError`. The run exited 1 and lost the whole
263
+ report, including the `parse-error` that `sidegraph-verify` found for the same file, and the
264
+ hooks that swallow the error silently switched the code-drift line off for every record. The
265
+ bad value is now skipped by those checks and reported once, by the model check, so the run
266
+ exits 2 with the rest of its findings.
267
+
10
268
  ## [0.10.0] — 2026-10-04
11
269
 
12
270
  ### Added
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
13
13
  continuing participant in the project. A core feature must preserve, organize, or deliver
14
14
  accumulated project understanding. Document search by itself is not the product.
15
15
 
16
- Sidegraph is pre-1.0 (v0.10.0) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.11.1) — the full loop (capture, ratification, mistakes-first
17
17
  retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
18
18
  facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
19
19
  a stable release. See
@@ -98,8 +98,9 @@ See [`docs/concepts/data-model.md`](docs/concepts/data-model.md) for the record
98
98
  ```bash
99
99
  uv sync # install deps into .venv
100
100
  uv run pre-commit install # once per clone — the lint gate runs before each commit
101
- uv run pytest # run tests
102
- uv run pytest tests/test_store.py -q
101
+ uv run pytest tests/test_store.py -q # while editing: the touched file (-x, --lf)
102
+ uv run pytest -m "not slow" # broader pre-push check: skips subprocess-heavy tests, still minutes
103
+ uv run pytest # full suite: once before a commit or PR (CI runs it again)
103
104
  uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
104
105
  uv run sidegraph-mcp # run the decision MCP server (stdio)
105
106
  ```
@@ -20,10 +20,33 @@ consequence for you:
20
20
  git clone https://github.com/SantyagoSeaman/sidegraph.git && cd sidegraph
21
21
  uv sync # runtime + dev dependencies (Python 3.13+)
22
22
  uv run pre-commit install # once per clone — the lint gate runs before each commit
23
- uv run pytest -q # full suite must be green
24
- uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
23
+ uv run pytest tests/test_store.py -q -x --lf # while editing: the touched file
24
+ uv run pytest -m "not slow" # broader pre-push check: skips subprocess-heavy tests, still takes minutes
25
+ uv run pytest -q # full suite: run before a commit or PR, must be green; CI runs it again
26
+ uv run pre-commit run --all-files # lint + format + types + staged secrets
25
27
  ```
26
28
 
29
+
30
+ The Gitleaks commit hook scans staged content even when all changed paths are excluded from
31
+ formatting, including `.sidegraph/`. `--all-files` does not turn it into a committed scan.
32
+ CI additionally scans all history reachable from HEAD with the same pinned scanner:
33
+
34
+ ```bash
35
+ uv run pre-commit run gitleaks-history --hook-stage manual --all-files
36
+ SIDEGRAPH_SECRET_SCAN_INTEGRATION=1 uv run pytest tests/test_secret_scan_gate.py -q
37
+ ```
38
+
39
+ The history scanner includes merge changes and traverses every commit reachable from HEAD.
40
+ Use a full checkout; CI rejects shallow history before scanning.
41
+
42
+ The second command runs real scanner integration tests; they are skipped in ordinary Python
43
+ test runs to avoid implicit scanner installation. The opt-in is read at collection time.
44
+ Findings are redacted. The history command needs a full Git checkout to cover earlier commits.
45
+
46
+ A passing test's `tmp_path` tree is removed; a failing test's is kept for inspection
47
+ (`tmp_path_retention_policy = "failed"` in `pyproject.toml`). Run with
48
+ `-o tmp_path_retention_policy=all` to keep every test's tree.
49
+
27
50
  The suite is hermetic to `SIDEGRAPH_*` environment variables: `tests/conftest.py` strips every
28
51
  one of them before each test runs, so a variable already set in your shell can never change what
29
52
  the suite asserts. A test that needs one set must set it explicitly with `monkeypatch` rather
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sidegraph
3
- Version: 0.10.0
3
+ Version: 0.11.1
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
@@ -253,17 +253,18 @@ retrieval a richer graph to anchor against. Walkthrough:
253
253
 
254
254
  - **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
255
255
  (strictly read-only) and writes small human-readable JSON records inside your repo,
256
- plus a local, gitignored index it can always rebuild. Two things sit outside the store:
257
- the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
258
- three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
259
- `${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
256
+ plus a local, gitignored index it can always rebuild. Commands can also write graph-refresh
257
+ hooks and their helper files, repository configuration, reports and visualization output;
258
+ the plugin launch hook can write a cache file under `${XDG_CACHE_HOME:-~/.cache}`.
259
+ [SECURITY.md](SECURITY.md) lists every write.
260
260
  **Nothing leaves your machine** —
261
261
  no network calls, no remote telemetry, no account. Sidegraph does keep local usage
262
262
  diagnostics in that gitignored index (which stored memory was shown, and which files a
263
263
  session touched afterwards) so you can see which memory was shown and which files
264
264
  those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
265
- - **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
266
- are stored. A ratification gate controls which of the agent's drafts become trusted
265
+ - **Captured text is redacted before storage.** Redaction is best-effort pattern matching;
266
+ review drafts and scan the committed store for secrets. Proposed decisions and facts pass
267
+ this redaction step before they are stored. A ratification gate controls which of the agent's drafts become trusted
267
268
  memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
268
269
  and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
269
270
  question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
@@ -223,17 +223,18 @@ retrieval a richer graph to anchor against. Walkthrough:
223
223
 
224
224
  - **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
225
225
  (strictly read-only) and writes small human-readable JSON records inside your repo,
226
- plus a local, gitignored index it can always rebuild. Two things sit outside the store:
227
- the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
228
- three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
229
- `${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
226
+ plus a local, gitignored index it can always rebuild. Commands can also write graph-refresh
227
+ hooks and their helper files, repository configuration, reports and visualization output;
228
+ the plugin launch hook can write a cache file under `${XDG_CACHE_HOME:-~/.cache}`.
229
+ [SECURITY.md](SECURITY.md) lists every write.
230
230
  **Nothing leaves your machine** —
231
231
  no network calls, no remote telemetry, no account. Sidegraph does keep local usage
232
232
  diagnostics in that gitignored index (which stored memory was shown, and which files a
233
233
  session touched afterwards) so you can see which memory was shown and which files
234
234
  those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
235
- - **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
236
- are stored. A ratification gate controls which of the agent's drafts become trusted
235
+ - **Captured text is redacted before storage.** Redaction is best-effort pattern matching;
236
+ review drafts and scan the committed store for secrets. Proposed decisions and facts pass
237
+ this redaction step before they are stored. A ratification gate controls which of the agent's drafts become trusted
237
238
  memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
238
239
  and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
239
240
  question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves