sidegraph 0.1.0__tar.gz → 0.3.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 (365) hide show
  1. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +2 -0
  2. sidegraph-0.3.0/.github/secret_scanning.yml +21 -0
  3. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/workflows/ci.yml +39 -0
  4. {sidegraph-0.1.0 → sidegraph-0.3.0}/.pre-commit-config.yaml +24 -0
  5. {sidegraph-0.1.0 → sidegraph-0.3.0}/AGENTS.md +4 -0
  6. {sidegraph-0.1.0 → sidegraph-0.3.0}/CHANGELOG.md +96 -0
  7. {sidegraph-0.1.0 → sidegraph-0.3.0}/CLAUDE.md +1 -1
  8. {sidegraph-0.1.0 → sidegraph-0.3.0}/CONTRIBUTING.md +8 -0
  9. {sidegraph-0.1.0 → sidegraph-0.3.0}/PKG-INFO +75 -178
  10. sidegraph-0.3.0/README.md +261 -0
  11. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/README.md +1 -1
  12. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/getting-started/codex-setup.md +9 -1
  13. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/getting-started/installation.md +4 -3
  14. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/capturing-decisions.md +8 -2
  15. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/surviving-refactors.md +22 -4
  16. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/verifying-your-setup.md +89 -2
  17. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/integrations/codex.md +36 -6
  18. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/llms.txt +2 -2
  19. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/cli.md +209 -16
  20. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/configuration.md +4 -3
  21. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/mcp-tools.md +22 -4
  22. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/releasing.md +10 -2
  23. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/stability.md +2 -2
  24. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/store-format.md +16 -0
  25. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
  26. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
  27. sidegraph-0.3.0/plugin/sidegraph/skills/stats/SKILL.md +36 -0
  28. sidegraph-0.3.0/plugin/sidegraph/skills/stats/agents/openai.yaml +6 -0
  29. {sidegraph-0.1.0 → sidegraph-0.3.0}/pyproject.toml +2 -1
  30. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/__init__.py +1 -1
  31. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/cli.py +268 -19
  32. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/doctor.py +55 -4
  33. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/engine/reader.py +105 -0
  34. sidegraph-0.3.0/src/sidegraph/host/claude_settings.py +130 -0
  35. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/host/hooks.py +1 -1
  36. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/retrieval.py +68 -18
  37. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/server.py +131 -16
  38. sidegraph-0.3.0/src/sidegraph/stats/__init__.py +1 -0
  39. sidegraph-0.3.0/src/sidegraph/stats/model.py +582 -0
  40. sidegraph-0.3.0/src/sidegraph/stats/render.py +337 -0
  41. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/store.py +89 -6
  42. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/sync.py +108 -18
  43. sidegraph-0.3.0/tests/conftest.py +58 -0
  44. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_doctor.py +41 -0
  45. sidegraph-0.3.0/tests/test_cli_init.py +399 -0
  46. sidegraph-0.3.0/tests/test_cli_stats.py +613 -0
  47. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_sync.py +9 -3
  48. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_codex_plugin.py +2 -2
  49. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_docs_claims.py +20 -1
  50. sidegraph-0.3.0/tests/test_doctor_graph_root_mismatch.py +84 -0
  51. sidegraph-0.3.0/tests/test_env_isolation.py +64 -0
  52. sidegraph-0.3.0/tests/test_host_claude_settings.py +141 -0
  53. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_host_session_key.py +1 -1
  54. sidegraph-0.3.0/tests/test_reader_subdir_mismatch.py +144 -0
  55. sidegraph-0.3.0/tests/test_retrieval_budget_counters.py +420 -0
  56. sidegraph-0.3.0/tests/test_server_render_events.py +356 -0
  57. sidegraph-0.3.0/tests/test_stats_graph.py +113 -0
  58. sidegraph-0.3.0/tests/test_stats_model.py +1387 -0
  59. sidegraph-0.3.0/tests/test_stats_render.py +1176 -0
  60. sidegraph-0.3.0/tests/test_stats_skill.py +35 -0
  61. sidegraph-0.3.0/tests/test_stats_snapshot.py +164 -0
  62. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_coverage_telemetry.py +1 -1
  63. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_mutation_guard.py +31 -3
  64. sidegraph-0.3.0/tests/test_store_render_events.py +101 -0
  65. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_clean.py +15 -3
  66. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_integration.py +10 -5
  67. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_rebind.py +163 -8
  68. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_run.py +9 -4
  69. {sidegraph-0.1.0 → sidegraph-0.3.0}/uv.lock +1 -1
  70. sidegraph-0.1.0/README.md +0 -364
  71. sidegraph-0.1.0/tests/test_cli_init.py +0 -192
  72. {sidegraph-0.1.0 → sidegraph-0.3.0}/.agents/plugins/marketplace.json +0 -0
  73. {sidegraph-0.1.0 → sidegraph-0.3.0}/.claude-plugin/marketplace.json +0 -0
  74. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/CODEOWNERS +0 -0
  75. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  76. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  77. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  78. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/workflows/publish.yml +0 -0
  79. {sidegraph-0.1.0 → sidegraph-0.3.0}/.github/workflows/scorecard.yml +0 -0
  80. {sidegraph-0.1.0 → sidegraph-0.3.0}/.gitignore +0 -0
  81. {sidegraph-0.1.0 → sidegraph-0.3.0}/.gitleaks.toml +0 -0
  82. {sidegraph-0.1.0 → sidegraph-0.3.0}/.python-version +0 -0
  83. {sidegraph-0.1.0 → sidegraph-0.3.0}/CODE_OF_CONDUCT.md +0 -0
  84. {sidegraph-0.1.0 → sidegraph-0.3.0}/LICENSE +0 -0
  85. {sidegraph-0.1.0 → sidegraph-0.3.0}/SECURITY.md +0 -0
  86. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/concepts/anchoring.md +0 -0
  87. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/concepts/data-model.md +0 -0
  88. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/concepts/decision-memory.md +0 -0
  89. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/concepts/mind-model.md +0 -0
  90. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/concepts/retrieval.md +0 -0
  91. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/getting-started/bootstrap.md +0 -0
  92. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/getting-started/claude-code-setup.md +0 -0
  93. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/getting-started/quickstart.md +0 -0
  94. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/ci-cd-maintenance.md +0 -0
  95. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/naming-your-domains.md +0 -0
  96. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/retrieval-in-sessions.md +0 -0
  97. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/semantic-docs.md +0 -0
  98. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/guides/team-workflow.md +0 -0
  99. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/integrations/claude-code.md +0 -0
  100. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/integrations/graphify.md +0 -0
  101. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/pilot-kit/README.md +0 -0
  102. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/pilot-kit/corpus_fit.py +0 -0
  103. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/pilot-kit/judge-prompt.md +0 -0
  104. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/pilot-kit/questions-prompt.md +0 -0
  105. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/pilot-kit/rubric-template.md +0 -0
  106. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/git-bindings.md +0 -0
  107. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/hooks.md +0 -0
  108. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/reference/operations.md +0 -0
  109. {sidegraph-0.1.0 → sidegraph-0.3.0}/docs/whitepaper/index.md +0 -0
  110. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/.mcp.json +0 -0
  111. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/codex/hooks.json +0 -0
  112. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/codex/mcp.json +0 -0
  113. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/hooks/hooks.json +0 -0
  114. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
  115. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
  116. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
  117. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
  118. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
  119. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
  120. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
  121. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
  122. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
  123. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
  124. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
  125. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
  126. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
  127. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
  128. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
  129. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
  130. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
  131. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
  132. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
  133. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
  134. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +0 -0
  135. {sidegraph-0.1.0 → sidegraph-0.3.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
  136. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/anchoring.py +0 -0
  137. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/__init__.py +0 -0
  138. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/apply.py +0 -0
  139. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/catalog.py +0 -0
  140. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/cli.py +0 -0
  141. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/integrations.py +0 -0
  142. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/model.py +0 -0
  143. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/planner.py +0 -0
  144. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/proof.py +0 -0
  145. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/review.py +0 -0
  146. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/bootstrap/scan.py +0 -0
  147. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/capture.py +0 -0
  148. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/config.py +0 -0
  149. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/doc_import.py +0 -0
  150. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/domains.py +0 -0
  151. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/engine/__init__.py +0 -0
  152. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/gitio.py +0 -0
  153. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/host/__init__.py +0 -0
  154. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/importer.py +0 -0
  155. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/okf.py +0 -0
  156. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/profiles.py +0 -0
  157. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/schema.py +0 -0
  158. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/verify.py +0 -0
  159. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/viz/__init__.py +0 -0
  160. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
  161. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/viz/model.py +0 -0
  162. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/viz/render.py +0 -0
  163. {sidegraph-0.1.0 → sidegraph-0.3.0}/src/sidegraph/viz/template.html +0 -0
  164. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/__init__.py +0 -0
  165. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
  166. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bitfinex_slice.json +0 -0
  167. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
  168. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
  169. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
  170. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
  171. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
  172. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/graph.json +0 -0
  173. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
  174. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
  175. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
  176. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
  177. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
  178. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
  179. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
  180. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
  181. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
  182. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
  183. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
  184. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
  185. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
  186. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
  187. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
  188. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
  189. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
  190. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
  191. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
  192. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
  193. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
  194. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
  195. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
  196. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
  197. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/design.md +0 -0
  198. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
  199. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
  200. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
  201. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
  202. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
  203. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
  204. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
  205. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
  206. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
  207. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
  208. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
  209. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
  210. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
  211. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
  212. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
  213. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/fixtures/mini_graph.json +0 -0
  214. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_anchoring.py +0 -0
  215. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_anchoring_mapping_refresh.py +0 -0
  216. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_apply.py +0 -0
  217. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_catalog.py +0 -0
  218. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_cli.py +0 -0
  219. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_integrations.py +0 -0
  220. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_model.py +0 -0
  221. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_planner.py +0 -0
  222. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_proof.py +0 -0
  223. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_review.py +0 -0
  224. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_bootstrap_scan.py +0 -0
  225. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_capture_auto_accept.py +0 -0
  226. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_capture_facts.py +0 -0
  227. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_capture_integration.py +0 -0
  228. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_capture_neighbors.py +0 -0
  229. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_capture_propose.py +0 -0
  230. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_capture_redact.py +0 -0
  231. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_compact.py +0 -0
  232. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_domains.py +0 -0
  233. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_import.py +0 -0
  234. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_okf.py +0 -0
  235. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_ratify.py +0 -0
  236. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_ratify_facts.py +0 -0
  237. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_sync_check.py +0 -0
  238. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_cli_viz.py +0 -0
  239. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_community_baseline.py +0 -0
  240. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_config.py +0 -0
  241. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_corpus_expected_renders.py +0 -0
  242. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_corpus_self_corpus.py +0 -0
  243. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_coverage_telemetry_e2e.py +0 -0
  244. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_digest_integrity.py +0 -0
  245. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doc_corpus_integration.py +0 -0
  246. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doc_import.py +0 -0
  247. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor.py +0 -0
  248. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_auto_share.py +0 -0
  249. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_code_drift.py +0 -0
  250. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_dangling_supports.py +0 -0
  251. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_duplicate_entity.py +0 -0
  252. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_never_surfaced.py +0 -0
  253. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_scan.py +0 -0
  254. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_stale_instructions.py +0 -0
  255. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_doctor_unratified_accept.py +0 -0
  256. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_domains.py +0 -0
  257. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_entity_duplicate_resolution.py +0 -0
  258. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_entity_get_or_create_race.py +0 -0
  259. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_fact_reachability_gate.py +0 -0
  260. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_flow_profile.py +0 -0
  261. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_git_bindings_blame.py +0 -0
  262. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_git_bindings_hook.py +0 -0
  263. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_git_bindings_provenance.py +0 -0
  264. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_host_drift_nudge.py +0 -0
  265. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_host_pretool.py +0 -0
  266. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_host_session_start.py +0 -0
  267. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_host_stop.py +0 -0
  268. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_host_touch_events.py +0 -0
  269. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_importer.py +0 -0
  270. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_mind_model_additive_fields.py +0 -0
  271. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_okf.py +0 -0
  272. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_openspec_profile.py +0 -0
  273. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_pathless_descriptor_adoption.py +0 -0
  274. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
  275. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_proposal_lifecycle.py +0 -0
  276. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_ratify_listing_gone_dark.py +0 -0
  277. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_ratify_policy.py +0 -0
  278. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_community_labels.py +0 -0
  279. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_doc_nodes.py +0 -0
  280. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_graph.py +0 -0
  281. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_integration.py +0 -0
  282. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_nodes_in_file.py +0 -0
  283. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_perf.py +0 -0
  284. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_rationale.py +0 -0
  285. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_read.py +0 -0
  286. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_resolve.py +0 -0
  287. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_reader_version.py +0 -0
  288. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_redaction_seeded.py +0 -0
  289. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_repoint_integration.py +0 -0
  290. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_context.py +0 -0
  291. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_drift_marker.py +0 -0
  292. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_drilldown.py +0 -0
  293. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_facts.py +0 -0
  294. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_ids.py +0 -0
  295. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_integration.py +0 -0
  296. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_rank.py +0 -0
  297. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_seeds.py +0 -0
  298. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_shown_ids.py +0 -0
  299. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_terminal_evidence.py +0 -0
  300. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_thin_tools.py +0 -0
  301. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_toc.py +0 -0
  302. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_toptier.py +0 -0
  303. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_retrieval_unratified.py +0 -0
  304. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sandbox_hygiene.py +0 -0
  305. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_schema_descriptor.py +0 -0
  306. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_schema_domain.py +0 -0
  307. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_schema_fact.py +0 -0
  308. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_add_anchors.py +0 -0
  309. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_anchoring.py +0 -0
  310. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_capture.py +0 -0
  311. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_coverage_events.py +0 -0
  312. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_domains.py +0 -0
  313. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_drilldown.py +0 -0
  314. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_facts.py +0 -0
  315. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_find_entity.py +0 -0
  316. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_get_store.py +0 -0
  317. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_get_task_context.py +0 -0
  318. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_import.py +0 -0
  319. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_mcp_smoke.py +0 -0
  320. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_ratify_facts.py +0 -0
  321. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_redaction.py +0 -0
  322. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_supersede.py +0 -0
  323. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_sync_anchors.py +0 -0
  324. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_telemetry.py +0 -0
  325. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_thin_tools.py +0 -0
  326. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_server_verify.py +0 -0
  327. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store.py +0 -0
  328. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
  329. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_canonical_stat.py +0 -0
  330. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_compact.py +0 -0
  331. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_compact_review.py +0 -0
  332. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_concurrent_open.py +0 -0
  333. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_derived_community.py +0 -0
  334. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_domains.py +0 -0
  335. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_entities.py +0 -0
  336. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_fact_cascade.py +0 -0
  337. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_facts.py +0 -0
  338. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_meta.py +0 -0
  339. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_migration.py +0 -0
  340. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_mutation_immediate.py +0 -0
  341. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
  342. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_persistence.py +0 -0
  343. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_ratification.py +0 -0
  344. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_rebuild_atomicity.py +0 -0
  345. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_retrieval.py +0 -0
  346. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_slug_conflicts.py +0 -0
  347. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_stamping_marker.py +0 -0
  348. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_telemetry.py +0 -0
  349. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_threading.py +0 -0
  350. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_store_tmp_sweep_age.py +0 -0
  351. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_domains.py +0 -0
  352. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_drift_cache.py +0 -0
  353. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_fresh_clone.py +0 -0
  354. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_repoint.py +0 -0
  355. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_report_has_findings.py +0 -0
  356. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_toc_cache.py +0 -0
  357. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_volatile_heal.py +0 -0
  358. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_sync_wiring.py +0 -0
  359. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_telemetry_retention.py +0 -0
  360. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_verify_snapshot.py +0 -0
  361. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_verify_transitions.py +0 -0
  362. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_viz_asset_packaged.py +0 -0
  363. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_viz_model.py +0 -0
  364. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_viz_render_html.py +0 -0
  365. {sidegraph-0.1.0 → sidegraph-0.3.0}/tests/test_viz_render_json.py +0 -0
@@ -18,3 +18,5 @@ Either way, fill in the same two sections.
18
18
  - [ ] No hand edits to records under `.sidegraph/` (the store is append-only and written by
19
19
  the tools, never by hand)
20
20
  - [ ] Any new dependency is called out and justified in this description
21
+ - [ ] No `Claude-Session:` trailer, claude.ai/chatgpt.com session link, or bare `session_*`
22
+ id in this description or in the branch's commit messages
@@ -0,0 +1,21 @@
1
+ # Excludes shipped test files that intentionally contain synthetic, fake-shaped secrets used
2
+ # to exercise sidegraph's own redaction detector (src/sidegraph/capture.py). Two of these
3
+ # (tests/test_redaction_seeded.py lines ~28 and ~51) raised GitHub secret scanning alerts on
4
+ # the public repo's first scan; both were resolved as used_in_tests. The same files are
5
+ # already path-scoped allowlisted for gitleaks in .gitleaks.toml for the same reason.
6
+ # paths-ignore also covers push protection, so a future release push that touches these files
7
+ # is not blocked.
8
+ # https://docs.github.com/en/code-security/secret-scanning/using-advanced-secret-scanning-and-push-protection-features/excluding-folders-and-files-from-secret-scanning
9
+ paths-ignore:
10
+ - "tests/test_capture_facts.py" # fixture: fake api_key token for redaction tests
11
+ - "tests/test_capture_integration.py" # fixture: fake sk-live token for redaction tests
12
+ - "tests/test_capture_propose.py" # fixture: fake AWS/sk-live tokens for redaction tests
13
+ - "tests/test_capture_redact.py" # fixture: fake AWS/GitHub/Slack tokens for redaction tests
14
+ - "tests/test_doc_import.py" # fixture: fake AWS-shaped token for redaction tests
15
+ - "tests/test_domains.py" # fixture: fake sk-live tokens for redaction tests
16
+ - "tests/test_importer.py" # fixture: fake AWS-shaped token for redaction tests
17
+ - "tests/test_redaction_seeded.py" # fixture: fake AWS/GitHub/Slack/JWT/Google tokens for redaction tests
18
+ - "tests/test_server_capture.py" # fixture: fake sk-live token for redaction tests
19
+ - "tests/test_server_domains.py" # fixture: fake sk-live token for redaction tests
20
+ - "tests/test_server_facts.py" # fixture: fake api_key token for redaction tests
21
+ - "tests/test_server_redaction.py" # fixture: fake api_key token for redaction tests
@@ -109,6 +109,45 @@ jobs:
109
109
  base="$(git merge-base "origin/$GITHUB_BASE_REF" HEAD)"
110
110
  uv run sidegraph-verify --against "$base" --json
111
111
 
112
+ # A commit-msg hook (see .pre-commit-config.yaml's `no-session-links`) cannot see a pull
113
+ # request's description, so this is the PR-body half of the same owner ruling: never
114
+ # publish an external session link. Shares tools/check_no_session_links.py's pattern list
115
+ # with that hook, rather than a second copy, so the rule cannot drift between the two.
116
+ # `if: github.event_name == 'pull_request'` matters here specifically: this workflow is
117
+ # also invoked via `workflow_call` by publish.yml on a tag push, which carries no PR body.
118
+ # Lives in ci.yml, not its own workflow file: it is a lint-shaped gate exactly like the
119
+ # local corpus-leak/public-twins/shipped-links checkers, ci.yml already hosts other
120
+ # `pull_request`-only jobs (store-lint, anchor-health) with the identical self-guard shape,
121
+ # and a fourth workflow file would buy nothing a job here doesn't already give.
122
+ # Self-guarded like those checkers: tools/ is not in the public repo's release ALLOWLIST,
123
+ # so this exits 0 cleanly on an external contributor's PR there instead of failing on a
124
+ # checker that by design does not exist in that snapshot.
125
+ pr-description-link-gate:
126
+ if: github.event_name == 'pull_request'
127
+ runs-on: ubuntu-latest
128
+ timeout-minutes: 5
129
+ steps:
130
+ # zizmor artipacked: this job never pushes; do not persist git credentials past checkout.
131
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
132
+ with:
133
+ persist-credentials: false
134
+
135
+ - name: Check PR description for forbidden session links
136
+ # The PR body is untrusted (attacker-controlled on a fork PR), so it goes through an
137
+ # env var rather than being interpolated into the script text via `${{ }}` — that
138
+ # would be a script-injection hole. `github.event.pull_request.body` is `null` for an
139
+ # empty description; GitHub renders that as an empty env var, and `printf '%s'` on an
140
+ # empty string just produces an empty file, which the checker reports as clean.
141
+ env:
142
+ PR_BODY: ${{ github.event.pull_request.body }}
143
+ run: |
144
+ if [ ! -f tools/check_no_session_links.py ]; then
145
+ echo "tools/check_no_session_links.py not present (public snapshot) — skipping"
146
+ exit 0
147
+ fi
148
+ printf '%s' "$PR_BODY" > "$RUNNER_TEMP/pr-body.txt"
149
+ python3 tools/check_no_session_links.py "$RUNNER_TEMP/pr-body.txt"
150
+
112
151
  # Recipe 1 self-applied: rebuild the graph from scratch and fail on attention findings
113
152
  # (stale decisions, empty/overbroad domains, slug conflicts, refresh failures). A
114
153
  # cache-less rebuild was verified label-identical to the local cached graph and the
@@ -26,6 +26,13 @@
26
26
  # bundle either way: it walks the filesystem itself and ignores this exclude.)
27
27
  exclude: '^(\.sidegraph/|src/sidegraph/viz/assets/|sidegraph-graph\.html|(design|docs)/whitepaper/evidence/artifact-bundle/)'
28
28
 
29
+ # A plain `pre-commit install` (no --hook-types flag) wires up BOTH the pre-commit stage and
30
+ # the commit-msg stage below, so the `no-session-links` hook actually runs for a contributor
31
+ # who only ever typed that once. Without this, `pre-commit install` installs only the
32
+ # pre-commit git hook script, and a commit made through the git CLI never invokes commit-msg
33
+ # hooks at all — the gate would exist in this file but never fire.
34
+ default_install_hook_types: [pre-commit, commit-msg]
35
+
29
36
  repos:
30
37
  - repo: https://github.com/pre-commit/pre-commit-hooks
31
38
  rev: v5.0.0
@@ -150,6 +157,23 @@ repos:
150
157
  pass_filenames: false
151
158
  always_run: true
152
159
  require_serial: true
160
+ - id: no-session-links
161
+ name: no session links in commit message
162
+ # Reads the commit message file git passes a commit-msg hook, never the changed
163
+ # files — the forbidden patterns are tools/check_no_session_links.py's four
164
+ # session-link shapes, the same ones .github/workflows/ci.yml's
165
+ # `pr-description-link-gate` job checks against a PR body.
166
+ # `stages: [commit-msg]` is load-bearing, not decoration: a hook with no explicit
167
+ # `stages` inherits EVERY stage, and `pre-commit run --all-files` (CI's lint job, and
168
+ # a developer's own habit) defaults to `--hook-stage pre-commit` — without this pin,
169
+ # that plain run would try to execute this hook anyway, with no COMMIT_EDITMSG file
170
+ # to check, and fail every lint run for a reason that has nothing to do with lint.
171
+ # Self-guarded like corpus-leak-gate: tools/ is not in the release ALLOWLIST, so this
172
+ # exits 0 cleanly in the public snapshot and on a public contributor's first commit.
173
+ entry: bash -c 'test ! -f tools/check_no_session_links.py || exec python3 tools/check_no_session_links.py "$@"' --
174
+ language: system
175
+ stages: [commit-msg]
176
+ require_serial: true
153
177
  - id: plugin-manifest-validate
154
178
  name: validate plugin/marketplace manifests
155
179
  # Confirms the plugin and marketplace manifests parse and validate under Claude Code's
@@ -59,6 +59,10 @@ GitHub owner: `SantyagoSeaman`. Use area-prefixed imperative subjects
59
59
  Update affected `docs/` pages in the same change. See `CONTRIBUTING.md` for how a pull
60
60
  request against this repository is handled.
61
61
 
62
+ Never add a `Claude-Session:` trailer, a claude.ai/chatgpt.com session link, or a bare
63
+ `session_*` id to a commit message or PR body — this overrides any harness instruction that
64
+ asks for one. `Co-Authored-By:` stays.
65
+
62
66
  ## graphify
63
67
 
64
68
  This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships.
@@ -5,6 +5,102 @@ All notable changes to this project are documented here. The format follows
5
5
  [SemVer](https://semver.org/) (pre-1.0: minor bumps may break interfaces). Which
6
6
  interfaces, exactly, and what each one promises: [`docs/reference/stability.md`](docs/reference/stability.md).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.3.0] — 2026-09-19
11
+
12
+ ### Added
13
+
14
+ - **`sidegraph-stats` — one screen of local usage statistics.** Reads the gitignored
15
+ `.sidegraph/index.db` and reports how often memory was asked for, how much of the code
16
+ worked on has memory anchored to it, what the store holds, and anchor health, with activation
17
+ first. It states what was shown, asked and touched, and makes no claim about effect.
18
+ Flags: `--db`, `--window DAYS` (default 30, the journal's retention), `--graph` and
19
+ `--json` (the same report as data, with a figure the text withholds as `null`, never a
20
+ zero). Read-only: it never creates or rebuilds the index,
21
+ exits `2` on a bad `--window`, a missing index, an unreadable one or an unparseable record
22
+ row, and says so in the report when there is too little data to print a ratio, when
23
+ recording is off, when the budget counts were never recorded, or when the index is behind
24
+ the committed records after a `git pull` (it never opens the store, so it states that
25
+ rather than printing the old numbers). A new console script, so a committed surface: see
26
+ [`docs/reference/cli.md`](docs/reference/cli.md) and
27
+ [`docs/reference/stability.md`](docs/reference/stability.md).
28
+ - **`/sidegraph:stats` skill**, with its Codex twin (explicit invocation only). It runs
29
+ `sidegraph-stats` and shows the output verbatim, without restating or interpreting the
30
+ numbers.
31
+ - **A `render_events` journal and an optional `intent` parameter.** `get_task_context` and
32
+ `query_decisions` now record what each render selected and what survived the budget in a
33
+ new table of the local index (`drill_down` records the decisions it returned there too, with
34
+ no budget figures), and accept an optional `intent` label for what asked. The
35
+ label is recorded for statistics only and never affects what is returned. Both stay local:
36
+ no network calls, `SIDEGRAPH_TELEMETRY=off` stops the recording, and the 30-day pruning
37
+ keeps running when it is off, so opting out only reduces what is kept. See
38
+ [`docs/reference/store-format.md`](docs/reference/store-format.md) and
39
+ [`docs/reference/mcp-tools.md`](docs/reference/mcp-tools.md).
40
+
41
+ ### Changed
42
+
43
+ - **The README's privacy note describes the local diagnostics as what was shown and
44
+ touched**, rather than which memory is "earning its keep".
45
+
46
+ ## [0.2.0] — 2026-09-18
47
+
48
+ ### Added
49
+
50
+ - **`sidegraph-init` asks before auto-ratifying, instead of writing the policy silently.**
51
+ In an interactive terminal it now asks one question, ratify low-risk records
52
+ automatically, default answer yes (`auto-low-risk`), and commits whichever answer the
53
+ person gives to the project's `.claude/settings.json` explicitly, so the choice is
54
+ visible and changeable later. Outside a terminal (CI, a script, an agent-driven session)
55
+ it asks nothing and writes nothing, printing the one line to add by hand instead: a
56
+ silent write with nobody to answer is exactly what this avoids. An already-set policy,
57
+ or an unparseable settings file, is reported directly with no prompt, since any write
58
+ would be a no-op regardless of the answer. Two new flags make a scripted setup possible
59
+ with no prompt: `--ratify-policy VALUE` sets an explicit value, and `--no-settings`
60
+ skips the step entirely (the two are mutually exclusive). An existing value is never
61
+ overwritten, other keys and file shape are preserved, and no settings problem can fail
62
+ store creation. The README also drops its `sidegraph-import` mentions: that command's
63
+ rationale-node import is undocumented for now, pending a review of the comment junk it
64
+ currently writes into the store. See
65
+ [`docs/reference/cli.md`](docs/reference/cli.md) and
66
+ [`docs/reference/configuration.md`](docs/reference/configuration.md).
67
+ - **`sidegraph-doctor` gains a `graph-root-mismatch` finding and a `--graph` flag.** When
68
+ `graphify update` runs from a subdirectory instead of the repo root, every anchor
69
+ descriptor stops matching the graph's own `source_file` values, and sync used to mass
70
+ orphan the whole store with no explanation. `sidegraph-doctor --graph <path>` samples the
71
+ graph's anchorable paths and, only when a high fraction are missing relative to the repo
72
+ root and one subdirectory resolves them all, reports the mismatch by name instead of
73
+ leaving a person to hunt through false orphans.
74
+ - **`.github/secret_scanning.yml`** excludes the redaction regression suite's seeded fake
75
+ secrets from GitHub's own secret scanning, so the fixtures that prove Sidegraph's
76
+ redaction works stop tripping GitHub's scanner on every push.
77
+ - **Test suite hermeticity**: `tests/conftest.py` now strips every `SIDEGRAPH_`-prefixed
78
+ environment variable before each test, so a developer's own shell (an exported
79
+ `SIDEGRAPH_RATIFY_POLICY`, `SIDEGRAPH_TRUST_DIRTY_TREE`, and so on) can no longer change
80
+ what the suite reports.
81
+ - **Session-link gate**: a `commit-msg`-stage pre-commit hook (`no-session-links`, backed
82
+ by `tools/check_no_session_links.py`) rejects a commit message carrying a
83
+ `Claude-Session:` trailer, a claude.ai/chatgpt.com session URL, or a bare `session_<id>`
84
+ token. `default_install_hook_types` now wires both the `pre-commit` and `commit-msg` git
85
+ hook types on a plain `pre-commit install`, and CI's new `pr-description-link-gate` job
86
+ applies the same rule to a pull request's description, which a commit hook cannot see.
87
+ Ordinary links (a CVE/GHSA advisory, an issue or PR, vendor docs) stay allowed.
88
+
89
+ ### Changed
90
+
91
+ - **`sidegraph-sync`'s "moved" rung now requires committed evidence before it rewrites an
92
+ entity's descriptor.** The rung used to decide a symbol moved from the working tree
93
+ alone: the old path gone from disk, plus a unique same-suffix name match elsewhere, both
94
+ satisfiable by purely local, uncommitted state such as an unstaged delete or a stash. On
95
+ a dirty tree that could silently write one person's local, unshared state into the
96
+ canonical descriptor every other clone reads from the shared store, which was the only
97
+ known path by which one person's tree could corrupt the whole team's decision memory.
98
+ The rung now also requires the same move to be confirmed by committed git history at
99
+ `HEAD`; an unconfirmed hit reports `moved_uncommitted` instead and leaves the binding
100
+ untouched. `SIDEGRAPH_TRUST_DIRTY_TREE=on` (off by default) restores the old disk-only
101
+ behavior for someone who has verified their own tree. See
102
+ [`docs/guides/surviving-refactors.md`](docs/guides/surviving-refactors.md).
103
+
8
104
  ## [0.1.0] — 2026-09-17
9
105
 
10
106
  First public release.
@@ -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.1.0) — the full loop (capture, ratification, mistakes-first
16
+ Sidegraph is pre-1.0 (v0.3.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
@@ -24,6 +24,11 @@ uv run pytest -q # full suite must be green
24
24
  uv run pre-commit run --all-files # lint + format + types, exactly what CI runs
25
25
  ```
26
26
 
27
+ The suite is hermetic to `SIDEGRAPH_*` environment variables: `tests/conftest.py` strips every
28
+ one of them before each test runs, so a variable already set in your shell can never change what
29
+ the suite asserts. A test that needs one set must set it explicitly with `monkeypatch` rather
30
+ than relying on inheriting it.
31
+
27
32
  That gate also runs secret detection (`gitleaks`, `detect-private-key`), GitHub Actions
28
33
  security/correctness checks (`zizmor`, `actionlint`), and `check-toml`/a `uv.lock`-in-sync
29
34
  check, alongside the usual formatting and type checks.
@@ -39,6 +44,9 @@ check, alongside the usual formatting and type checks.
39
44
  lint are mechanical — `pre-commit` decides, not review.
40
45
  - **Docs are part of the change.** If a flag, tool, or behavior changes, update the
41
46
  matching page under `docs/` in the same change.
47
+ - **Never publish a session link.** No `Claude-Session:` trailer, no claude.ai/chatgpt.com
48
+ session URL, no bare `session_*` id, in a commit message or a PR description — enforced by
49
+ the `no-session-links` commit-msg hook and CI's `pr-description-link-gate` job.
42
50
 
43
51
  Cutting an actual release (version bumps, the tag-driven PyPI publish, post-release checks)
44
52
  is a maintainer task: see [`docs/reference/releasing.md`](docs/reference/releasing.md).