sidegraph 0.18.0__tar.gz → 0.20.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.
- {sidegraph-0.18.0 → sidegraph-0.20.0}/CHANGELOG.md +71 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/CLAUDE.md +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/PKG-INFO +2 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/concepts/anchoring.md +3 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/concepts/data-model.md +24 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/getting-started/installation.md +2 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/adr-export.md +8 -3
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/capturing-decisions.md +3 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/ci-cd-maintenance.md +2 -2
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/migrating-to-0.17.md +9 -9
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/retrieval-in-sessions.md +5 -2
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/team-workflow.md +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/troubleshooting.md +4 -3
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/cli.md +33 -24
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/configuration.md +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/hooks.md +9 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/mcp-tools.md +51 -3
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/stability.md +3 -3
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/store-format.md +21 -2
- {sidegraph-0.18.0 → sidegraph-0.20.0}/package.json +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/.muse-plugin/plugin.json +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/record-decision/SKILL.md +2 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/record-fact/SKILL.md +2 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +59 -6
- {sidegraph-0.18.0 → sidegraph-0.20.0}/pyproject.toml +4 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/adr.py +37 -34
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/cli.py +54 -27
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/doctor.py +301 -22
- sidegraph-0.20.0/src/sidegraph/drift_checks.py +490 -0
- sidegraph-0.20.0/src/sidegraph/drift_groups.py +773 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/hooks.py +5 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/integrity.py +13 -5
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/maintenance.py +6 -2
- sidegraph-0.20.0/src/sidegraph/md_sections.py +218 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/okf.py +31 -4
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/retrieval.py +43 -3
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/schema.py +62 -3
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/server.py +205 -9
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/store.py +66 -15
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/store_layout.py +153 -9
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/store_rules.py +62 -10
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/sync.py +113 -41
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/validation_errors.py +51 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/verify.py +106 -25
- sidegraph-0.20.0/tests/drift_groups_support.py +153 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_adr.py +32 -5
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_adr.py +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_doctor.py +52 -1
- sidegraph-0.20.0/tests/test_declared_sections_docs.py +54 -0
- sidegraph-0.20.0/tests/test_declared_sections_schema.py +136 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_code_drift.py +214 -0
- sidegraph-0.20.0/tests/test_doctor_declared_sections.py +499 -0
- sidegraph-0.20.0/tests/test_doctor_grouped_drift.py +515 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_integrity.py +2 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_record_identity.py +6 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_drift_checks.py +303 -0
- sidegraph-0.20.0/tests/test_drift_checks_blobs.py +150 -0
- sidegraph-0.20.0/tests/test_drift_groups.py +1040 -0
- sidegraph-0.20.0/tests/test_drift_recency.py +127 -0
- sidegraph-0.20.0/tests/test_drift_stamp_cache.py +205 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_format2_notices.py +27 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_drift_nudge.py +79 -4
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_integrity.py +1 -1
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hot_index.py +7 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_integrity.py +29 -0
- sidegraph-0.20.0/tests/test_markdown_it_dependency.py +13 -0
- sidegraph-0.20.0/tests/test_md_sections.py +560 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_okf.py +100 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_readers_format2.py +4 -11
- sidegraph-0.20.0/tests/test_record_drift_check_sections.py +464 -0
- sidegraph-0.20.0/tests/test_record_drift_check_sections_input.py +82 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_validation_errors.py +1 -0
- sidegraph-0.20.0/tests/test_store_rules_legacy_defaults.py +293 -0
- sidegraph-0.20.0/tests/test_sync_drift_stamps.py +709 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_format2_against.py +106 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_snapshot.py +208 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_transitions.py +7 -6
- {sidegraph-0.18.0 → sidegraph-0.20.0}/uv.lock +3 -1
- sidegraph-0.18.0/src/sidegraph/drift_checks.py +0 -209
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.gitignore +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.gitleaks.toml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.opencode/INSTALL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/.python-version +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/AGENTS.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/LICENSE +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/README.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/SECURITY.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/README.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/concepts/retrieval.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/getting-started/bootstrap.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/getting-started/claude-code-setup.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/getting-started/codex-setup.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/getting-started/quickstart.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/health-check.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/migrating-to-0.14.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/semantic-docs.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/using-0.15.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/using-0.16.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/integrations/claude-code.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/integrations/codex.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/integrations/graphify.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/integrations/grok.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/integrations/muse.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/integrations/opencode.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/llms.txt +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/git-bindings.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/operations.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/reference/releasing.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/index.js +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/compact/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/compact/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/health-check/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/health-check/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/health-check/scripts/collect.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/adr_cli.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/adr_files.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/adr_identity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bash_paths.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/capture.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/config.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/delivery.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/domain_snapshot.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/engine/rationale.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/diagnostics.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/mcp_entry.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/session_identity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/host/subagent.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/hot_index.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/input_limits.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/maintenance_clock.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/migrate.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/redaction_scan.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/redaction_tokens.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/stats/model.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/store_format.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/store_view.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/text_paths.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/tool_rate_limit.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/worktree_seeds.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/src/sidegraph/write_boundary.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/__init__.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/bounded_listings_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/conftest.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/drift_checks_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/githooks_legacy_helper.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/githooks_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/graph_fixtures.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/graph_repo_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/membership_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/moved_adoption_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/opencode_plugin_runner.mjs +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/snapshot_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/store_format2_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/store_non_file_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/store_record_support.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_adr_files.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_adr_identity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_anchor_descriptor.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_anchor_paths.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_anchoring_membership.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_batch_panel_fixes.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_scan_regular.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bootstrap_unanchored.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_bounded_listings.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_compact_format2.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_domains_snapshot.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_store_precedence.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_command_windows.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_compact_skill.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_config.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_delivery_evidence.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_delivery_stats.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_delivery_surfaces.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doc_import.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_unhashable_payload.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_domain_seed_names.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_domain_snapshot_format.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_domain_snapshot_notices.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_domains.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_engine_build.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_entity_twins.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_entry_point_arguments.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_file_bound_retrieval.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_format2_windows.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_git_output_utf8.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_githooks.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_githooks_atomic_lock.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_graphify_pin.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_health_check_skill.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hook_body_compaction.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hook_contention.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hook_failure_diagnostics.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hook_payload_encoding.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hook_showings.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_launch.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_pretool_records.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_stop.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_host_wiring_checks.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hot_index_facts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hot_index_hook.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_import_dry_run_preview.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_importer.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_index_journal_mode.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_integrity_engine_version.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_maintenance_clock.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_maintenance_dry_run_parity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_maintenance_plan.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_maintenance_publish.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_mcp_entry_ratify_policy.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_mcp_entry_repo_root.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_merge_matrix_format2.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_migrate.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_muse_plugin.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_opencode_plugin.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_portable_json.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_private_tests_isolation.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_public_hook_launch.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_ratify_policy.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_rationale_compatibility.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_engine_version.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_file_labels.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_label_conventions.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_stub_collapse.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_type_split.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_rebuild_instruction.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_redaction_scan.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_redaction_tokens.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_repo_relative_paths_portable.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_membership_generations.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_membership_index.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_related_cap.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_capture_diagnostics.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_capture_limits.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_cli_diagnostics.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_doc_limits.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_input_limits.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_numeric_enums.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_python_shapes.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_redaction_cursor.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_security_write_boundary.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_seed_paths_portable.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_annotations.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_argument_names.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_decision_listing.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_invocation_policy.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_record_types.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_result_contract.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_session_attribution.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_skill_frontmatter.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stats_render.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_stop_rearm.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_cross_process_mutations.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_domain_members.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_file_anchor_names.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_format.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_format2_load.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_format2_marker.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_format2_writes.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_inventory.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_junctions.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_non_file_entries.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_record_types.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_requirement.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_rules.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_snapshot_wiring.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_subagent_start_manifests.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_subprocess_text_encoding.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_membership.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_snapshot_membership.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_text_paths.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_domain_snapshot.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_format2_snapshot.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_git_framing.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_git_revisions.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_verify_git_stdin.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/test_worktree_seeds.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/wheel_server_trace.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tests/wheel_smoke.py +0 -0
- {sidegraph-0.18.0 → sidegraph-0.20.0}/tools/check_no_session_links.py +0 -0
|
@@ -7,6 +7,77 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.20.0] — 2026-10-28
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Contract change:** `record_drift_check` takes an optional `sections` argument for
|
|
15
|
+
markdown files: the sections you read, plus sections to also watch. The record then
|
|
16
|
+
re-arms on that file only when one of them, or the file's link reference definitions,
|
|
17
|
+
changes. The result echoes `declared_sections` (`first_line`, `lines`) and eleven new
|
|
18
|
+
fixed error codes name each refusal. The capsule gains an optional `declared_sections`
|
|
19
|
+
field inside `schema_version` 1 (hashes only, no heading text); plain capsules write an
|
|
20
|
+
empty list. An older release ignores the field, compares whole blobs and warns more,
|
|
21
|
+
never less. An unknown scheme or role, or a file whose structure cannot be bounded, still
|
|
22
|
+
compares by whole blob, and so does a partial clone on Git older than 2.45, where reading
|
|
23
|
+
section text could fetch objects.
|
|
24
|
+
- `sidegraph-doctor` groups per-record `code-drift` by the drifted file. Each record names the
|
|
25
|
+
blob it was compared against (a capture, check or scope baseline, with its mode) and shares
|
|
26
|
+
one `git diff <old blob> <new blob>` per distinct change; a mode-only or type change says so.
|
|
27
|
+
A record whose anchored Python function or Markdown section is identical at both ends carries
|
|
28
|
+
`anchored region unchanged; sibling sections of the file may still matter`, a reading aid
|
|
29
|
+
that never clears or reorders anything. `--json` gains a `drift_groups` key; `findings` is
|
|
30
|
+
unchanged. `--flat` restores one line per record and skips the grouping.
|
|
31
|
+
- `markdown-it-py>=4,<5` is a direct dependency (Markdown heading spans for the hint and for
|
|
32
|
+
declared sections).
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- The SessionStart drift line says how many of the records needing review are recent:
|
|
37
|
+
`Sidegraph: 190 record(s) need content review (12 new in the last 7 days): …`, or
|
|
38
|
+
`(none new in the last 7 days)`. A record without a recorded first-seen time counts as
|
|
39
|
+
unknown age, never as new. An index built before this version prints the line without the
|
|
40
|
+
clause on its first day, `(none new since <date>)` while its stamping is younger than
|
|
41
|
+
7 days, and `(none new in the last 7 days)` from then on, until a record newly drifts.
|
|
42
|
+
`SIDEGRAPH_DRIFT_NUDGE=off` silences it with the rest of the line.
|
|
43
|
+
- `sidegraph-doctor --json` findings carry `first_seen`: the ISO time a `code-drift`
|
|
44
|
+
record was first seen drifted, otherwise `null`.
|
|
45
|
+
- The default `sidegraph-doctor` text for per-record `code-drift` is the grouped block above
|
|
46
|
+
instead of one line per record. The summary count, `--check` and the exit codes are unchanged.
|
|
47
|
+
|
|
48
|
+
## [0.19.0] — 2026-10-27
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- `sidegraph-doctor --check` no longer exits `2` on `maintenance-due` alone. The finding is
|
|
53
|
+
still printed, listed in `--json` and shown as a session notice; `store-not-migrated` and
|
|
54
|
+
every other finding still fail `--check`.
|
|
55
|
+
- `sidegraph-export-adr` names store records (the ADR's own record, supporting facts,
|
|
56
|
+
domains, successors without a document) by id instead of linking into `.sidegraph/`.
|
|
57
|
+
Migrating or maintaining the store no longer rewrites every exported ADR. The first export
|
|
58
|
+
with this version rewrites each generated document once. The `$record_link` template
|
|
59
|
+
placeholder is now a code span with the id, not a link target.
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
|
|
63
|
+
- One record file that cannot be read or decoded no longer fans out into findings at every
|
|
64
|
+
record that refers to it. `sidegraph-verify` reports the one `parse-error`; a fact that
|
|
65
|
+
supports it, a successor that supersedes it and a binding to such an entity raise nothing
|
|
66
|
+
more, and `sidegraph-doctor` adds no `dangling-record` for the supporting fact.
|
|
67
|
+
- `sidegraph-verify --against` no longer reports `illegal-deletion` or `illegal-field-change`
|
|
68
|
+
for a committed file the store never loads: a stray copy under an unsafe name, or a file
|
|
69
|
+
whose baseline id is unsafe. Deleting such a file is the fix; the snapshot still reports it
|
|
70
|
+
as `unsafe-record-id` while it exists.
|
|
71
|
+
- Ratifying, dropping or closing a decision written before the `scope` field existed no longer
|
|
72
|
+
reads as an illegal `scope` change. `sidegraph-verify`, `sidegraph-compact` and maintenance
|
|
73
|
+
accept the default `repo` that the writer or the archive line adds, so such a record can be
|
|
74
|
+
compacted and packed again. A real `scope` edit is still refused. Entities without `kind`
|
|
75
|
+
get the same treatment for its default, `concrete`.
|
|
76
|
+
- `sidegraph-export-okf` no longer exports a domain's superseded row when its successor's id
|
|
77
|
+
happens to sort lower, which can happen for two ids minted in the same millisecond, or
|
|
78
|
+
after a domain is renamed away and back. A row with a later revision under the same slug
|
|
79
|
+
never becomes that slug's page.
|
|
80
|
+
|
|
10
81
|
## [0.18.0] — 2026-10-26
|
|
11
82
|
|
|
12
83
|
### Changed
|
|
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
|
|
|
13
13
|
continuing participant in the project. A core feature must preserve, organize, or deliver
|
|
14
14
|
accumulated project understanding. Document search by itself is not the product.
|
|
15
15
|
|
|
16
|
-
Sidegraph is pre-1.0 (v0.
|
|
16
|
+
Sidegraph is pre-1.0 (v0.20.0) — the full loop (capture, ratification, mistakes-first
|
|
17
17
|
retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
|
|
18
18
|
facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
|
|
19
19
|
a stable release. See
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.20.0
|
|
4
4
|
Summary: Own the memory, rent the graph — a durable decision/lessons layer as a sidecar over a code-graph engine.
|
|
5
5
|
Project-URL: Homepage, https://github.com/SantyagoSeaman/sidegraph
|
|
6
6
|
Project-URL: Repository, https://github.com/SantyagoSeaman/sidegraph
|
|
@@ -24,6 +24,7 @@ Requires-Python: >=3.13
|
|
|
24
24
|
Requires-Dist: anyio>=4
|
|
25
25
|
Requires-Dist: certifi>=2026.10.19
|
|
26
26
|
Requires-Dist: fastmcp<4,>=3.4.10
|
|
27
|
+
Requires-Dist: markdown-it-py<5,>=4
|
|
27
28
|
Requires-Dist: mcp<2,>=1.30
|
|
28
29
|
Requires-Dist: opentelemetry-api>=1.45.1
|
|
29
30
|
Requires-Dist: pydantic>=2.9
|
|
@@ -133,6 +133,9 @@ Anchoring and sync collapse the stubs; what agents read keeps the ambiguous answ
|
|
|
133
133
|
|
|
134
134
|
## Why multi-anchor matters for doc corpora
|
|
135
135
|
|
|
136
|
+
Anchoring decides where a record surfaces. Which sections of a long document a later
|
|
137
|
+
`record_drift_check` must watch is declared when the record is checked, not anchored.
|
|
138
|
+
|
|
136
139
|
On a docs corpus (ADRs/SAD), both a heading and its containing file are anchorable nodes
|
|
137
140
|
(`file_type` in `{code, document, concept, rationale}` — an allowlist that also keeps
|
|
138
141
|
unanchorable types like `image` out, per the same never-guess principle; `concept` and
|
|
@@ -314,8 +314,9 @@ the shared canonical digest/index record tables. See
|
|
|
314
314
|
| `required_files` | list[str] | Exact current required anchor-file set, separate from optional inspected dependencies. |
|
|
315
315
|
| `checked_files` | list[`CheckedCodeFile`] | Explicit inspected regular-file snapshots, covering every required file; 1–256 unique safe paths. |
|
|
316
316
|
| `subject_digest` | str | SHA-256 of fixed immutable decision/provenance fields and durable leaf descriptors; excludes lifecycle and volatile mapping/status fields. |
|
|
317
|
+
| `declared_sections` | list[`DeclaredSectionFile`] | Optional per-file section scope for markdown files, `[]` for a plain whole-file check; at most 64 entries, each path one of `checked_files`. |
|
|
317
318
|
|
|
318
|
-
Changed inspected files/modes or required scope re-arm review. A matching snapshot after
|
|
319
|
+
Changed inspected files/modes or required scope re-arm review; for a file with declared sections, a change to a declared or also-watched section, or to the file's link definitions, re-arms instead of any change to the file. A matching snapshot after
|
|
319
320
|
an unrelated commit remains covered. A mistaken semantic assertion cannot be detected
|
|
320
321
|
from these hashes; a genuine successor corrects the decision and preserves the check as
|
|
321
322
|
history. Optional comparison failure has the bounded behavior described in store-format.
|
|
@@ -330,3 +331,25 @@ mappings. The total checked-path budget is 16384 UTF-8 bytes.
|
|
|
330
331
|
| `path` | str | Safe repository-relative forward-slash path, at most 1024 UTF-8 bytes. |
|
|
331
332
|
| `blob_id` | str | Full Git content address of the inspected file. |
|
|
332
333
|
| `mode` | `100644` \| `100755` | Regular-file Git mode; mode changes participate in applicability. |
|
|
334
|
+
|
|
335
|
+
## `DeclaredSectionFile` — declared sections of one checked file
|
|
336
|
+
|
|
337
|
+
Nested in `DriftCheck`; this stores locators and digests, never heading text or source
|
|
338
|
+
bodies. A scheme or role this release does not know is accepted and compared by whole blob.
|
|
339
|
+
|
|
340
|
+
| Field | Type | Meaning |
|
|
341
|
+
|---|---|---|
|
|
342
|
+
| `path` | str | One of the check's `checked_files`; unique across entries. |
|
|
343
|
+
| `scheme` | token | How sections are located; `md1` (markdown block structure) is the one scheme this release resolves. |
|
|
344
|
+
| `refs_hash` | hex \| `null` | `md1`: digest of the file's link reference definitions. |
|
|
345
|
+
| `sections` | list[`DeclaredSection`] | 1–256 sections; at most 1024 across the check. |
|
|
346
|
+
|
|
347
|
+
## `DeclaredSection` — one declared or also-watched section
|
|
348
|
+
|
|
349
|
+
Nested in `DeclaredSectionFile`.
|
|
350
|
+
|
|
351
|
+
| Field | Type | Meaning |
|
|
352
|
+
|---|---|---|
|
|
353
|
+
| `heading_hash` | hex | `md1`: digest of the heading chain that locates the section. |
|
|
354
|
+
| `role` | token | `declared` (the checker read it) or `watch` (a sibling the claim depends on). |
|
|
355
|
+
| `text_hash` | hex | `md1`: digest of the section's text, subsections included. |
|
|
@@ -45,7 +45,8 @@ with Git for Windows installed; they do not establish support for Windows hosts
|
|
|
45
45
|
remains outside these checks.
|
|
46
46
|
See [Windows](#windows) before installing a host plugin.
|
|
47
47
|
|
|
48
|
-
Package dependencies support `fastmcp>=3.4.10,<4
|
|
48
|
+
Package dependencies support `fastmcp>=3.4.10,<4`, `mcp>=1.30,<2` and `markdown-it-py>=4,<5`
|
|
49
|
+
(markdown section scope for drift checks). Runtime security
|
|
49
50
|
floors also require `certifi>=2026.10.19` and
|
|
50
51
|
`opentelemetry-api>=1.45.1`, including standalone wheel installations. Major SDK upgrades
|
|
51
52
|
require a separate compatibility review; an unlocked package install may resolve newer
|
|
@@ -24,8 +24,10 @@ consequences come from the record. Missing optional reasoning says `Not recorded
|
|
|
24
24
|
|
|
25
25
|
A fixed footer retains status, validity, history, source pointers, durable code descriptors
|
|
26
26
|
and complete accepted, unclosed supporting facts. Even a future `valid_to` closes a fact;
|
|
27
|
-
the exporter never infers a sample size or runtime qualifier.
|
|
28
|
-
|
|
27
|
+
the exporter never infers a sample size or runtime qualifier. Store records (the ADR's own
|
|
28
|
+
record, supporting facts, domains, a successor of another kind) are named by id, never by a
|
|
29
|
+
path into `.sidegraph/`, so migrating or maintaining the store changes no generated
|
|
30
|
+
document. `index.md` groups documents by
|
|
29
31
|
explicit accepted domain bindings, otherwise under Unassigned. These are membership
|
|
30
32
|
intent and durable descriptors, not claims of current graph resolution.
|
|
31
33
|
|
|
@@ -68,7 +70,10 @@ A custom template is a regular UTF-8 file up to 64 KiB, using literal text and
|
|
|
68
70
|
`string.Template` placeholders. It must include `$title`, `$context`, `$choice`, `$rejected`
|
|
69
71
|
and `$consequences`; `$$` prints a dollar sign. Optional fields are `$kind`, `$status`,
|
|
70
72
|
`$valid_from`, `$valid_to`, `$evidence`, `$anchors`, `$domains`, `$supersedes`, `$successors`,
|
|
71
|
-
`$record_link` and `$source`.
|
|
73
|
+
`$record_link` and `$source`. `$record_link` is the record's id as a code span, not a link
|
|
74
|
+
target (store records are never linked by path, so migrating the store changes no document);
|
|
75
|
+
a template that used it as the target of a markdown link must drop the link syntax. The fixed
|
|
76
|
+
footer remains even if the template omits these.
|
|
72
77
|
Default templates avoid duplicating it. Unknown placeholders or reserved marker lines are
|
|
73
78
|
errors. The generated ownership marker precedes the template, so template YAML frontmatter
|
|
74
79
|
is not at the first byte of the generated file.
|
|
@@ -42,6 +42,9 @@ named, is a separate decision-level Tier-0 binding made by the write path, not p
|
|
|
42
42
|
`name` is a **heading text** or the **file name itself**; for code, a **function/class name**
|
|
43
43
|
or the file — all valid entity names in a Graphify graph.
|
|
44
44
|
|
|
45
|
+
For a long document, section scope is declared when the record is checked (see
|
|
46
|
+
[`record_drift_check`](../reference/mcp-tools.md#record_drift_check)), not when it is anchored.
|
|
47
|
+
|
|
45
48
|
**Always add the containing file as a second anchor — for code symbols and doc headings
|
|
46
49
|
alike.** A heading rename or symbol move orphans the precise anchor on the next sync; the
|
|
47
50
|
file anchor survives and keeps the decision retrievable (and its community fallback intact).
|
|
@@ -228,8 +228,8 @@ the branch. (That holds on that checkout; on your own machine the merge base is
|
|
|
228
228
|
target's tip only after you merged the target into your branch.) Run `sidegraph-verify` against that value: a local run against the fork point can
|
|
229
229
|
differ, and CI's answer is the one that gates the merge. Findings and their remedies:
|
|
230
230
|
[migrating to 0.17](migrating-to-0.17.md). A job that runs `sidegraph-doctor --check` exits `2`
|
|
231
|
-
on the `store-not-migrated`
|
|
232
|
-
|
|
231
|
+
on the `store-not-migrated` notice until the store is migrated. The `maintenance-due` notice is
|
|
232
|
+
reported but never fails `--check`.
|
|
233
233
|
|
|
234
234
|
## Recipe 3: scheduled triage
|
|
235
235
|
|
|
@@ -154,12 +154,12 @@ needs no other change. Three things to know:
|
|
|
154
154
|
the target branch's tip, as CI computes it: `git merge-base origin/<target> HEAD` on GitHub's
|
|
155
155
|
pull-request checkout gives that tip. A local `sidegraph-verify --against` run against the
|
|
156
156
|
fork point can differ; CI's answer is the one that gates the merge.
|
|
157
|
-
- **`sidegraph-doctor --check` exits 2 on
|
|
158
|
-
doctor reports `store-not-migrated`, and
|
|
159
|
-
`
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
157
|
+
- **`sidegraph-doctor --check` exits 2 on an unmigrated store.** While a store is
|
|
158
|
+
unmigrated, doctor reports `store-not-migrated`, and `--check` fails on it. A CI job that
|
|
159
|
+
runs `doctor --check` turns red until you migrate. Migrate in the same window you upgrade the
|
|
160
|
+
job, or, since doctor has no flag to exclude a finding, run it with `--json` and filter that
|
|
161
|
+
finding name out (for example with `jq`) before deciding. On a packed store with work
|
|
162
|
+
pending doctor reports `maintenance-due`; since 0.19.0 `--check` does not fail on it.
|
|
163
163
|
- **`sidegraph-verify` has new findings**, all errors: `bad-shard-line`, `shard-conflict`,
|
|
164
164
|
`duplicate-packed-record`, `shadow-divergence`, `binding-entry-dropped`, `shard-name-case`
|
|
165
165
|
and `shards-without-format2` (these on the tree itself), and `shard-body-without-source` and
|
|
@@ -168,9 +168,9 @@ needs no other change. Three things to know:
|
|
|
168
168
|
|
|
169
169
|
A tool that reads the store files directly, not through Sidegraph, now has to read shard lines
|
|
170
170
|
too: [store format](../reference/store-format.md#format-2-packed-shards) says how. ADR export
|
|
171
|
-
works as before,
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
works as before. Before 0.19.0, each ADR's `Record:` link pointed at the record's file or
|
|
172
|
+
shard, so an export after migration or maintenance rewrote every ADR document; since 0.19.0
|
|
173
|
+
generated documents name store records by id and stay byte-identical.
|
|
174
174
|
|
|
175
175
|
## Open branches
|
|
176
176
|
|
|
@@ -297,5 +297,8 @@ Use `sidegraph:triage-drift` to read the claim and current code. If the claim st
|
|
|
297
297
|
`record_drift_check` can append a justified inspection of the current clean committed
|
|
298
298
|
files without changing the decision. If it no longer holds, propose a real successor.
|
|
299
299
|
The [tool reference](../reference/mcp-tools.md#record_drift_check) describes refusal cases
|
|
300
|
-
and coverage. Changed inspected files or scope re-arm the warning
|
|
301
|
-
|
|
300
|
+
and coverage. Changed inspected files or scope re-arm the warning, and for a markdown file
|
|
301
|
+
checked with declared sections only a change to a declared or also-watched section or to the
|
|
302
|
+
file's link definitions does; unrelated commits do not. The check is an attributed assertion and can be wrong. `sidegraph-doctor` groups the
|
|
303
|
+
records by drifted file and may note `anchored region unchanged; sibling sections of the file
|
|
304
|
+
may still matter`: that shortens the reading, it does not replace it.
|
|
@@ -54,7 +54,7 @@ local branches, with a notice when such a branch is more than a week old
|
|
|
54
54
|
`.sidegraph/` in the same pull request as the work that produced the records, and merge the
|
|
55
55
|
branch that holds the rest. Fully staged store files do not count toward `store-uncommitted`,
|
|
56
56
|
so that one check never blocks the commit that fixes it. A pre-commit hook that runs
|
|
57
|
-
`sidegraph-doctor --check` still fails often. `--check` makes every advisory finding exit `2`,
|
|
57
|
+
`sidegraph-doctor --check` still fails often. `--check` makes every advisory finding except `maintenance-due` exit `2`,
|
|
58
58
|
and `code-drift` is one of them: it fires after any commit that touches a file an accepted
|
|
59
59
|
record is anchored to. For a gate on the store itself, use `sidegraph-verify`. It exits `2`
|
|
60
60
|
only for a violation of the store's own write rules, and `0` for a clean store whatever the
|
|
@@ -134,7 +134,8 @@ notice.
|
|
|
134
134
|
Records needing content review after code changed or a prior scoped check stopped applying.
|
|
135
135
|
The line says how many. Inspect current code: record an explicit `record_drift_check` if the
|
|
136
136
|
claim still holds, or propose a real successor if it does not. There is no user notice.
|
|
137
|
-
`sidegraph-doctor` lists them as `code-drift` findings,
|
|
137
|
+
`sidegraph-doctor` lists them as `code-drift` findings, grouped by the drifted file with one `git diff` per distinct
|
|
138
|
+
change (`sidegraph-doctor --flat` prints one line per record instead), and the `sidegraph:triage-drift` skill walks them.
|
|
138
139
|
`SIDEGRAPH_DRIFT_NUDGE=off` silences the line.
|
|
139
140
|
|
|
140
141
|
### graph-borrowed
|
|
@@ -326,7 +327,7 @@ legacy `archive/` segment that maintenance would delete, a shard line in the wro
|
|
|
326
327
|
repeated with an equal body, or a stray shard file. Nothing is broken, and `sidegraph-verify`
|
|
327
328
|
does not report these states. A segment that stays because one of its lines is not safe to
|
|
328
329
|
delete does not count. Run `sidegraph-compact` on the default branch. Doctor lists one finding
|
|
329
|
-
at the store path
|
|
330
|
+
at the store path; `--check` reports it but does not exit `2` on it. A legacy segment that maintenance would delete counts, whether its records are already in shard
|
|
330
331
|
lines or maintenance would pack them. The check does not consult git, so a record file that
|
|
331
332
|
still has to settle (or is untracked) is not predicted. It reads the shard files once; a store
|
|
332
333
|
with more than 200 per-record files is decided from the directory listing.
|
|
@@ -411,7 +412,7 @@ not reported: nothing was switched off.
|
|
|
411
412
|
`~/.claude/settings.json`.
|
|
412
413
|
- **Where it runs.** The session surface and doctor. Not run outside a git repository, with no
|
|
413
414
|
`git`, or when `git ls-files` takes longer than five seconds. Doctor lists the finding with the
|
|
414
|
-
code `plugin-off-in-subdirectories`, and `--check` exits `2` on it
|
|
415
|
+
code `plugin-off-in-subdirectories`, and `--check` exits `2` on it.
|
|
415
416
|
- **Why only a root launch tells you.** A session started in a directory where the plugin is off
|
|
416
417
|
runs no SessionStart hook, so nothing speaks there. The line (and the notice, with case (b))
|
|
417
418
|
comes from a session at the root, and the finding from doctor and the setup skill.
|
|
@@ -1363,11 +1363,11 @@ plain-text line):
|
|
|
1363
1363
|
| `snapshot-without-requirement` | snapshot | a `domain-snapshot.json` exists but the `format` marker does not require Sidegraph 0.14.0 or later |
|
|
1364
1364
|
| `bad-validity-window` | snapshot | `valid_to < valid_from` on a decision or fact |
|
|
1365
1365
|
| `superseded-without-successor` | snapshot | a `status=superseded` record has no other record's `supersedes` pointing back at it (a successor held by a file skipped for its unsafe name still counts) |
|
|
1366
|
-
| `dangling-supersedes` | snapshot | a `supersedes` id doesn't resolve to any record, hot or archived (a file skipped for its unsafe name still counts as the record it holds, so renaming it back is the only heal) |
|
|
1367
|
-
| `dangling-binding-entity` | snapshot | a binding's `entity_id` doesn't resolve to any `entities/<id>.json` (an entity held by a file skipped for its unsafe name still counts) |
|
|
1368
|
-
| `dangling-fact-support` | snapshot | a fact's `supports` id doesn't resolve to any decision (a file skipped for its unsafe name still counts, as for `dangling-supersedes`) |
|
|
1369
|
-
| `dangling-drift-check` | snapshot | an auxiliary verification references no hot or archived decision; terminal targets remain valid history |
|
|
1370
|
-
| `dangling-parent` | snapshot | a domain's `parent_id` doesn't resolve to any domain, hot or archived (a superseded, dropped or archived parent still counts, as the write path only checks that it exists; a file skipped for its unsafe name counts too, as for `dangling-supersedes`) |
|
|
1366
|
+
| `dangling-supersedes` | snapshot | a `supersedes` id doesn't resolve to any record, hot or archived (a file skipped for its unsafe name still counts as the record it holds, so renaming it back is the only heal; a regular file with a safe name that does not decode counts as the record its name names, so it gives one `parse-error` and no finding here; a directory or other entry named like a record file does not) |
|
|
1367
|
+
| `dangling-binding-entity` | snapshot | a binding's `entity_id` doesn't resolve to any `entities/<id>.json` (an entity held by a file skipped for its unsafe name still counts, and so does an entity file that does not decode) |
|
|
1368
|
+
| `dangling-fact-support` | snapshot | a fact's `supports` id doesn't resolve to any decision (a file skipped for its unsafe name, or one that does not decode, still counts, as for `dangling-supersedes`) |
|
|
1369
|
+
| `dangling-drift-check` | snapshot | an auxiliary verification references no hot or archived decision; terminal targets remain valid history (a decision file with a safe name that does not decode counts, as for `dangling-supersedes`) |
|
|
1370
|
+
| `dangling-parent` | snapshot | a domain's `parent_id` doesn't resolve to any domain, hot or archived (a superseded, dropped or archived parent still counts, as the write path only checks that it exists; a file skipped for its unsafe name, or one that does not decode, counts too, as for `dangling-supersedes`) |
|
|
1371
1371
|
| `parent-cycle` | snapshot | the `parent_id` chain of some domains loops back on itself (a domain that is its own parent included); reported once per cycle, at the domain with the smallest id on it, and not for a domain that merely hangs off the cycle |
|
|
1372
1372
|
| `duplicate-ulid` | snapshot | the same internal id appears in more than one canonical location — two hot files, a hot file plus any archive copy, or two archive segments whose payloads for that id actually differ. **Exempt:** two or more archive segments carrying byte-*identical* payloads for the same id — a sanctioned cross-branch `sidegraph-compact` merge (independent compaction on two branches, later merged) — see [`reference/store-format.md#archive-segments-sidegraph-compact`](store-format.md#archive-segments-sidegraph-compact). **On a packed (format 2) store** a hot file beside an archive line is not a duplicate when the file holds the line's state or a legal successor of it, and a shard line beside an archive line is not when it does or when the archive line is a legal successor of the shard line; a per-record file beside a shard line is the normal state before maintenance and is judged by `shadow-divergence` |
|
|
1373
1373
|
| `bad-archive-segment` | snapshot | an `archive/*.jsonl` entry is not a regular file (`unreadable: not a regular file`), or a line isn't valid UTF-8 or JSON, isn't a JSON object, or holds a decision or domain that fails its model, can't be serialised, or has a nonterminal status. Schema/decode failures match the lines the reload leaves out; the verifier additionally rejects nonterminal archive records (one violation per line, naming the segment and the line number) |
|
|
@@ -1385,7 +1385,7 @@ plain-text line):
|
|
|
1385
1385
|
| `illegal-status-jump` | transition | `status` changed to something that isn't a real write-path transition for that record kind |
|
|
1386
1386
|
| `valid-to-unset` | transition | `valid_to` reverted from a value back to `null` |
|
|
1387
1387
|
| `valid-to-changed` | transition | `valid_to` changed from one value to a *different* value (only `null → value`, once, is legal) |
|
|
1388
|
-
| `illegal-deletion` | transition | a record file — or an already-published archive segment — was deleted with no sanctioned reason. The one exception: a decision/domain preserved by same-kind, same-ID archive copies in the new tree, every copy schema-valid, compactable and a legal raw-payload transition from the baseline (a legitimate `sidegraph-compact`). An ID match alone is insufficient |
|
|
1388
|
+
| `illegal-deletion` | transition | a record file — or an already-published archive segment — was deleted with no sanctioned reason. The one exception: a decision/domain preserved by same-kind, same-ID archive copies in the new tree, every copy schema-valid, compactable and a legal raw-payload transition from the baseline (a legitimate `sidegraph-compact`). An ID match alone is insufficient. A file the store never loaded (an unsafe file name, or an unsafe id in the baseline) is not a record: deleting or editing it adds no transition finding, and the snapshot's `unsafe-record-id` covers it while it exists |
|
|
1389
1389
|
| `shard-body-without-source` | transition | on a packed (format 2) store, a shard line added or changed since `GIT_REF` whose body is not the body of any occurrence of the same record in `GIT_REF` (a per-record file, a shard line or an archive line). `sidegraph-compact` only ever writes bodies it read, so a hand-forged line, or an edit folded in the same pull request that made it, is reported: land the edit on the target branch first, then fold |
|
|
1390
1390
|
| `format-downgrade` | transition | the `format` marker went from major 2 in `GIT_REF` to a lower major. The one legal shape is the full rollback: no `shards/*.shard` file is left and every record is back in its per-record file with all its keys |
|
|
1391
1391
|
|
|
@@ -1459,8 +1459,9 @@ file — whether its default is `null` (`Provenance.commit` today) or an empty l
|
|
|
1459
1459
|
and fills the field back in with that default. That alone is never a change: an absent field
|
|
1460
1460
|
counts as the same value as an explicit `null` or an empty list/object, inside nested objects
|
|
1461
1461
|
and inside the items of a list, everywhere this table calls a field immutable. A field whose
|
|
1462
|
-
default is a *non-empty* value (`Decision.scope`, `"repo"`)
|
|
1463
|
-
|
|
1462
|
+
default is a *non-empty* value (`Decision.scope`, `"repo"`; `Entity.kind`, `"concrete"`) has
|
|
1463
|
+
its own narrower rule: an absent key equals exactly that default value on the other side, in
|
|
1464
|
+
either direction, and nothing else. A move to or from any other value is still a change.
|
|
1464
1465
|
|
|
1465
1466
|
**Known limit:** `verify_against` compares only the net change across the whole diffed range
|
|
1466
1467
|
(see "diffs the CURRENT WORKING TREE" below), not each intermediate commit. So a ratifier
|
|
@@ -1514,16 +1515,17 @@ Once any record, hot or archived, carries an `auto:` stamp, two more information
|
|
|
1514
1515
|
When an entity is named by a path, full or partial, of its file (`src/sidegraph/store.py`, `sidegraph/store.py`) beside one named by that file's basename (`store.py`), a `spelling twins: N …` line follows, then one line per such entity: `<id> '<path name>' (K binding(s)) → <id> '<basename>' (M binding(s))`. Lookups and new anchors use the basename entity, and retrieval reaches both, so there is nothing to fix. Like the lines above, these are never findings, never change the exit code, and never appear in `--json`.
|
|
1515
1516
|
|
|
1516
1517
|
```
|
|
1517
|
-
sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--json] [--graph PATH]
|
|
1518
|
+
sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--json] [--flat] [--graph PATH]
|
|
1518
1519
|
```
|
|
1519
1520
|
|
|
1520
1521
|
| Flag | Default | Meaning |
|
|
1521
1522
|
|---|---|---|
|
|
1522
1523
|
| `--db` | `$SIDEGRAPH_DIR` → existing `.sidegraph/` → `.sidegraph` | store directory; `$SIDEGRAPH_DB` honored for back-compat (deprecated) — same never-auto-create rule as `sidegraph-verify` (see above) |
|
|
1523
1524
|
| `--against GIT_REF` | none | also run `sidegraph-verify`'s transition layer vs `GIT_REF` (identical semantics — same operational-error rules) |
|
|
1524
|
-
| `--check` | off | advisory findings also exit `2` (default: report only; a *skipped* check never fails, even with `--check`) |
|
|
1525
|
+
| `--check` | off | advisory findings also exit `2`, except `maintenance-due` (default: report only; a *skipped* check never fails, even with `--check`) |
|
|
1525
1526
|
| `--stale-days N` | `30` | flag a proposed decision/domain whose id timestamp is strictly older than `N` days; must be `>= 0` |
|
|
1526
|
-
| `--json` | off | print `{"clean", "violations", "findings", "skipped"}` as one JSON object to stdout (nothing else) |
|
|
1527
|
+
| `--json` | off | print `{"clean", "violations", "findings", "skipped"}`, plus `drift_groups` when per-record `code-drift` is grouped, as one JSON object to stdout (nothing else) |
|
|
1528
|
+
| `--flat` | off | one `code-drift` line per record, as before: restores the flat listing and skips the grouping by file |
|
|
1527
1529
|
| `--graph` | `$SIDEGRAPH_GRAPH` or `graphify-out/graph.json`, in the store's project | read-only input used for the `graph-root-mismatch` and `graph-stale` checks below; missing or unreadable skips both and says so (see *Skipped checks* below) |
|
|
1528
1530
|
|
|
1529
1531
|
One-stop store health: composes `sidegraph-verify`'s strict snapshot (+ optional
|
|
@@ -1538,20 +1540,22 @@ never constructs a `Store`.
|
|
|
1538
1540
|
exit `1` operational error only when `--against` requests the git-backed transition layer;
|
|
1539
1541
|
the snapshot layer works without git.
|
|
1540
1542
|
- **Advisory section** — `doctor.curate`: curation findings that never gate the exit code
|
|
1541
|
-
by default; `--check` escalates them to exit `2`, mirroring `sidegraph-sync --check`.
|
|
1543
|
+
by default; `--check` escalates them to exit `2`, mirroring `sidegraph-sync --check`. The
|
|
1544
|
+
one exception is `maintenance-due`, routine upkeep on a healthy packed store: it is still
|
|
1545
|
+
printed and still in `--json`, but never changes the exit code.
|
|
1542
1546
|
|
|
1543
1547
|
**Finding codes** (the `code` field in `--json`'s `findings`, or the first column of a
|
|
1544
1548
|
plain-text line):
|
|
1545
1549
|
|
|
1546
1550
|
| Code | Meaning |
|
|
1547
1551
|
|---|---|
|
|
1548
|
-
| `dangling-record` | an open decision (`proposed`/`accepted`) has no committed anchor set; an open fact (`valid_to` unset) has no anchor AND no `supports` id resolving to a LIVE (`proposed`/`accepted`) decision — an anchor alone, or a supports id resolving to a live decision, is reachability for a fact |
|
|
1552
|
+
| `dangling-record` | an open decision (`proposed`/`accepted`) has no committed anchor set; an open fact (`valid_to` unset) has no anchor AND no `supports` id resolving to a LIVE (`proposed`/`accepted`) decision — an anchor alone, or a supports id resolving to a live decision, is reachability for a fact. A fact that supports a decision whose file does not decode is not reported: that file is `sidegraph-verify`'s one `parse-error` |
|
|
1549
1553
|
| `degraded-binding` | a binding's last recorded status (from `index.db`) is `degraded` |
|
|
1550
1554
|
| `orphaned-binding` | a binding's last recorded status (from `index.db`) is `orphaned` |
|
|
1551
1555
|
| `stale-proposal` | a proposed decision/domain whose ULID timestamp is strictly older than `--stale-days` |
|
|
1552
1556
|
| `unreferenced-entity` | a hot entity no committed anchor set references (structural `domain:*`/`community:*` entities are exempt) |
|
|
1553
1557
|
| `expired-open-validity` | a decision's `valid_to` is strictly past but its status is still open (`proposed`/`accepted`) |
|
|
1554
|
-
| `code-drift` | an open (`proposed`/`accepted`) decision's anchored file(s) changed since capture, or an earlier scoped check no longer applies; `record_drift_check` can record an explicit current inspection without rewriting the decision (MCP only); when binding statuses are uncomputed or unavailable, excludes committed deletions and says "binding status unknown"; also carries the "N record(s) predate commit stamping — not checkable" and git-unavailable notes, in place, when either applies |
|
|
1558
|
+
| `code-drift` | an open (`proposed`/`accepted`) decision's anchored file(s) changed since capture, or an earlier scoped check (including its declared sections) no longer applies; `record_drift_check` can record an explicit current inspection without rewriting the decision (MCP only); when binding statuses are uncomputed or unavailable, excludes committed deletions and says "binding status unknown"; also carries the "N record(s) predate commit stamping — not checkable" and git-unavailable notes, in place, when either applies. The default text groups the per-record lines by drifted file (`code-drift: N record(s) in M file group(s)`), numbers each distinct `git diff <old blob> <new blob>` once, and may add `anchored region unchanged; sibling sections of the file may still matter` to a record whose anchored Python function or Markdown section is textually identical at both ends; `--flat` restores one line per record. The hint is a reading aid, never a verdict: it changes no count and no exit code. `--json` adds a sibling `drift_groups` key (`partial`, `notes`, `groups[].records[]` with `basis`, `reason`, `diff` and `hint`); `findings` is unchanged |
|
|
1555
1559
|
| `never-surfaced` | an accepted decision has `0` shows against `N > 0` queries on its anchored file(s) — anchored where people repeatedly work, never once rendered or injected by a hook |
|
|
1556
1560
|
| `stale-instructions` | an auto-injected agent-instructions file beside the store (`CLAUDE.md`, `AGENTS.md`, `GEMINI.md`, `.cursorrules`) still carries the distinctive wording of a **superseded** decision — that file reaches the agent at turn zero, before retrieval, so an abandoned rule surviving there outranks the store's correction by default. Verbatim-ish match on normalized text with length/word floors; superseded records only; no git call. Advisory: it reports a quotation, not a proven contradiction — the file may be narrating history |
|
|
1557
1561
|
| `unratified-accept` | an **accepted** record whose provenance says `agent` and which carries no ratifier stamp — the signature `SIDEGRAPH_AUTO_ACCEPT=on` leaves in a shared store (one environment's setting bypassing the ratification gate for everyone). Scoped to records created at/after the EARLIER of the store's earliest ratifier stamp and its creation marker (`.sidegraph/stamping_live_since`, written once when a store is genuinely new — never backfilled onto an existing one), so a store predating both reports nothing rather than everything; a store that has never ratified anything but was created by a marker-writing version is still in scope from its own creation, closing the blind window an unratified store would otherwise sit in forever. A stamped record — including one stamped `auto:<policy>` by an auto-ratification policy — and a human-sourced one are never flagged. A **supersession successor** (`supersedes` set — `supersede_decision`/`supersede_fact`) is never flagged either: reversal has no ratification queue to bypass and lands accepted immediately by design, so it reproduces the signature with no relation to the env var this check hunts. Narrowed exception: a `supersedes`-bearing record IS still flagged if it carries a `layer`, a `provenance.ref`, or a tier-0 `tag:`/`initiative:` binding absent from its predecessor — neither `supersede_decision` nor `supersede_fact` can produce any of the three, so one present proves the `propose_decisions`/auto-accept path wrote it. (The fact half is defensive only: `supersede_fact` always stamps `source="human"`, so a fact successor never reaches this agent-sourced check, and no draft shape carries `supersedes` on a fact.) Only a MINIMAL superseding draft (none of the three) is indistinguishable from a legitimate successor by the record's own fields, and stays excluded — a known, accepted, narrower trade-off than treating every supersession alike. Advisory: the signature is not proof — verify before concluding |
|
|
@@ -1561,11 +1565,11 @@ plain-text line):
|
|
|
1561
1565
|
| `graph-stale` | the graph was built at a commit HEAD has moved past (graph.json's `built_at_commit`), and a file the graph should reflect changed since: one it holds was edited after the graph was last built (the later of `graph.json`'s and its sibling `manifest.json`'s modification times) or deleted, or a new file of a type it holds now exists (not under a dot-directory, which Graphify skips). Memory cannot see or anchor to code added after the build. The detail gives the build commit, how many commits behind HEAD (or "a commit outside HEAD's history" after a checkout of an older commit), how many files changed, and up to five example paths; the fix is to rebuild from the repository root by running `graphify update .` with the environment variable `GRAPHIFY_NO_AUTO_REFRESH=1` set, then `sidegraph-sync`. Silent when the build commit is HEAD, when only file types the graph does not hold changed (a `.yml` against a `.py`-only graph), and when a graph built from a dirty tree was committed afterwards, or a `graphify update .` found nothing to change and rewrote only `manifest.json` (the file is no newer than the build); also silent when the comparison cannot be made (no `built_at_commit`, one that is not a full commit id, a graph outside a git repository, a build commit the repository lacks, git unavailable or slower than 3 seconds). **`--check` exits `2` on it**, so a CI job that runs doctor should rebuild the graph first; one that does is unaffected. Needs `--graph` to resolve |
|
|
1562
1566
|
| `orphaned-record` | an open (`proposed`/`accepted`) decision or fact whose every Tier-2 (leaf) anchor is `orphaned`, so retrieval reaches it only through its file or domain; one finding per record, at its canonical file, naming how many leaf anchors it has. Statuses come from `index.db` and read "as of last sync", so the check is skipped while the statuses are not computed for the current graph (see *Skipped checks* below; run `sidegraph-sync`). It is the record-level view of `orphaned-binding` (any record it flags has orphaned bindings, which that code already reports), so it adds no new reason for `--check` to exit `2`. The fix is to rebuild a stale graph, then `sidegraph-sync`; otherwise re-anchor the record with `add_anchors` or the `heal-anchors` skill, or supersede it if the code is gone. Needs a usable `index.db` |
|
|
1563
1567
|
| `store-uncommitted` | store files nobody committed for at least 24 hours: records, bindings, entities, an archive segment or the root files (`format`, `.gitignore`, `stamping_live_since`) that `git status` shows as new, modified or deleted. One finding, at the store path, naming how many files there are, how old the oldest is and what kinds they are (a new `archive/` segment beside deleted records reads as "a compaction"). A new record or entity file is aged by its ULID name, which a `git stash` cannot rewrite; a modified file, or anything under `bindings/`, by its modification time; a deleted file by its subdirectory's, a lower bound. Entries fully staged in the index are not counted, so a `--check` run in a pre-commit hook does not block the commit that fixes the problem. **`--check` exits `2` on it.** The fix is to commit the store in a pull request. Silent, and not run, outside a git repository, with no `git`, or when git is slower than 2 seconds |
|
|
1564
|
-
| `plugin-off-in-subdirectories` | Claude Code sessions started below the repository root run without the Sidegraph plugin. Claude Code reads the project settings (`.claude/settings.json`) of the launch directory only, and the repository root's `.claude/settings.local.json` for every launch inside the repository; `enabledPlugins` merges key by key (user settings, then project, then local). Two problems, reported as up to two findings: (a) the plugin is enabled only in the root's `.claude/settings.json`, so every directory below the root without its own enabling settings runs without it (reported at that file); (b) nested directories with a `.claude/settings.json` or `.claude/settings.local.json` of their own that sets `enabledPlugins` and whose merge leaves the plugin off (reported at the first such directory, naming how many there are; a nested settings file without `enabledPlugins` cannot change the merge, so it is not counted). The walk covers every directory that holds a tracked file (one `git ls-files` over the index, a few tens of milliseconds on a large repository) and looks for the two settings files in each directly, so a repository that ignores `.claude/` is covered. User settings are read from `$CLAUDE_CONFIG_DIR/settings.json` when that variable is set and non-empty, else from `~/.claude/settings.json`. Silent when the plugin is not enabled for a launch at the root at all, and not run outside a git repository, with no `git`, or when `git ls-files` takes longer than 5 seconds. **`--check` exits `2` on it
|
|
1565
|
-
| `refresh-helper-outdated` | a git hook runs an older graph refresh helper that uses directory-based locking (unsafe with uutils `mkdir`), or whose Graphify line lacks `GRAPHIFY_NO_AUTO_REFRESH=1` (Graphify 0.9.87 and later can rewrite installed agent skills after an upgrade). Advisory, per clone (the helper lives in `.git/hooks`); **`--check` exits `2` on it
|
|
1566
|
-
| `engine-version` | the graph was built by a Graphify release this Sidegraph was not tested with (its `graph.graphify_version` stamp is neither absent nor in the tested set), so anchors and domains may read differently. Advisory; **`--check` exits `2` on it
|
|
1567
|
-
| `store-not-migrated` | the store uses the pre-0.17 layout (a format marker below major 2) and holds at least one record of any kind (initiatives included). One finding, at the store path, naming `sidegraph-migrate` (run on the default branch, after the team checklist in the [0.17 migration guide](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/guides/migrating-to-0.17.md)) and the `sidegraph:compact` skill. Degraded; **`--check` exits `2` on it
|
|
1568
|
-
| `maintenance-due` | a format-2 store that `sidegraph-compact` would tidy: more than 200 per-record files, or a legacy `archive/` segment it would delete, or a misplaced or duplicated shard line, or a stray shard file. `sidegraph-verify` does not report these; maintenance heals them. A segment kept because one of its lines is not safe to delete does not count. Advisory
|
|
1568
|
+
| `plugin-off-in-subdirectories` | Claude Code sessions started below the repository root run without the Sidegraph plugin. Claude Code reads the project settings (`.claude/settings.json`) of the launch directory only, and the repository root's `.claude/settings.local.json` for every launch inside the repository; `enabledPlugins` merges key by key (user settings, then project, then local). Two problems, reported as up to two findings: (a) the plugin is enabled only in the root's `.claude/settings.json`, so every directory below the root without its own enabling settings runs without it (reported at that file); (b) nested directories with a `.claude/settings.json` or `.claude/settings.local.json` of their own that sets `enabledPlugins` and whose merge leaves the plugin off (reported at the first such directory, naming how many there are; a nested settings file without `enabledPlugins` cannot change the merge, so it is not counted). The walk covers every directory that holds a tracked file (one `git ls-files` over the index, a few tens of milliseconds on a large repository) and looks for the two settings files in each directly, so a repository that ignores `.claude/` is covered. User settings are read from `$CLAUDE_CONFIG_DIR/settings.json` when that variable is set and non-empty, else from `~/.claude/settings.json`. Silent when the plugin is not enabled for a launch at the root at all, and not run outside a git repository, with no `git`, or when `git ls-files` takes longer than 5 seconds. **`--check` exits `2` on it**; enabling the plugin at user scope or in the root's `.claude/settings.local.json` clears it |
|
|
1569
|
+
| `refresh-helper-outdated` | a git hook runs an older graph refresh helper that uses directory-based locking (unsafe with uutils `mkdir`), or whose Graphify line lacks `GRAPHIFY_NO_AUTO_REFRESH=1` (Graphify 0.9.87 and later can rewrite installed agent skills after an upgrade). Advisory, per clone (the helper lives in `.git/hooks`); **`--check` exits `2` on it**. `maintenance-due` is the one finding it does not escalate. One hook that runs the helper is enough, and a recorded decline does not silence it. The fix is `sidegraph-init` (no flag), which refreshes the helper and keeps a recorded hook choice. Silent outside a git repository, with no helper, or when no hook runs it |
|
|
1570
|
+
| `engine-version` | the graph was built by a Graphify release this Sidegraph was not tested with (its `graph.graphify_version` stamp is neither absent nor in the tested set), so anchors and domains may read differently. Advisory; **`--check` exits `2` on it**. `maintenance-due` is the one finding it does not escalate. Pin Graphify to a tested release listed under [Engine version pinning](../integrations/graphify.md#engine-version-pinning), then rebuild the graph. It also fires for a mention-edge graph (Graphify 0.9.62 or later) over a store without a minimum Sidegraph version; follow the [0.14 migration guide](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/guides/migrating-to-0.14.md). A malformed marker leaves this second case silent. Silent without a readable graph |
|
|
1571
|
+
| `store-not-migrated` | the store uses the pre-0.17 layout (a format marker below major 2) and holds at least one record of any kind (initiatives included). One finding, at the store path, naming `sidegraph-migrate` (run on the default branch, after the team checklist in the [0.17 migration guide](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/guides/migrating-to-0.17.md)) and the `sidegraph:compact` skill. Degraded; **`--check` exits `2` on it**. `maintenance-due` is the one finding it does not escalate. Silent on an empty store and on a store that is already format 2 |
|
|
1572
|
+
| `maintenance-due` | a format-2 store that `sidegraph-compact` would tidy: more than 200 per-record files, or a legacy `archive/` segment it would delete, or a misplaced or duplicated shard line, or a stray shard file. `sidegraph-verify` does not report these; maintenance heals them. A segment kept because one of its lines is not safe to delete does not count. Advisory, and the one finding **`--check` does not escalate**: it is printed and listed in `--json`, but the exit code stays `0`. Run `sidegraph-compact` on the default branch. Silent on a store that is not format 2 |
|
|
1569
1573
|
|
|
1570
1574
|
`degraded-binding`/`orphaned-binding` come from `index.db`, opened strictly read-only — it
|
|
1571
1575
|
is the only source for binding status (canonical `bindings/*.json` files carry identity,
|
|
@@ -1617,7 +1621,8 @@ neither flagged nor cleared. `drill_down` does record a `domain:<slug>` seed, bu
|
|
|
1617
1621
|
consumes it yet; its *shows* count normally, so surfacing only through a domain drill-down
|
|
1618
1622
|
still protects a decision from a false flag.
|
|
1619
1623
|
|
|
1620
|
-
Each JSON finding has `code`, `path`, `detail`, `record_id` and `
|
|
1624
|
+
Each JSON finding has `code`, `path`, `detail`, `record_id`, `record_type` and `first_seen`
|
|
1625
|
+
(the ISO time Sidegraph first saw a `code-drift` finding's record drifted, otherwise `null`).
|
|
1621
1626
|
Per-record findings carry their logical identity (`decision`, `fact`, `entity`, `domain`,
|
|
1622
1627
|
or `bindings`); global notes have null record fields. A malformed raw record whose id
|
|
1623
1628
|
cannot be read also has a null subject; use its violation and physical path for repair. `path` retains the physical source,
|
|
@@ -1651,13 +1656,15 @@ of the lines above. A store whose format marker refuses this version also skips
|
|
|
1651
1656
|
checks: `remaining checks skipped (<the reason>)`, for example
|
|
1652
1657
|
`remaining checks skipped (This store requires Sidegraph >= 0.15.0; this is 0.14.0.)`.
|
|
1653
1658
|
A missing graph is deliberately not a finding: `--check` escalates
|
|
1654
|
-
every finding
|
|
1659
|
+
every finding except `maintenance-due`, so a CI job that runs doctor without building a graph
|
|
1660
|
+
would start exiting `2`.
|
|
1655
1661
|
|
|
1656
1662
|
**Exit code:** `0` healthy — advisory findings alone stay `0` without `--check`. `1`
|
|
1657
1663
|
operational error — same paths as `sidegraph-verify` (unreadable store; or, when `--against`
|
|
1658
1664
|
is used, a bad ref or store outside any git repo), plus a negative `--stale-days`, rejected before the
|
|
1659
1665
|
store is touched (same hard-usage treatment as `sidegraph-import --limit`). `2` strict
|
|
1660
|
-
violations, or — with `--check` — advisory findings too
|
|
1666
|
+
violations, or — with `--check` — advisory findings too, except `maintenance-due`, which never
|
|
1667
|
+
changes the exit code.
|
|
1661
1668
|
|
|
1662
1669
|
**Examples:**
|
|
1663
1670
|
|
|
@@ -1760,8 +1767,10 @@ What lands in the bundle:
|
|
|
1760
1767
|
before, abandoned because…" is the product; the export doesn't hide it. The one thing it
|
|
1761
1768
|
does hide is unratified `proposed` drafts — those have not entered the shared memory yet,
|
|
1762
1769
|
so they are never published (proposed domains are dropped the same way).
|
|
1763
|
-
- `domains/` — one concept per slug
|
|
1764
|
-
|
|
1770
|
+
- `domains/` — one concept per slug, with parent links and an `# Anchored records`
|
|
1771
|
+
backlink section. The page shows the slug's current row: a row loses to every row of its
|
|
1772
|
+
slug that has no later revision under that slug, following supersession through any slug,
|
|
1773
|
+
and among the rest the newest id wins.
|
|
1765
1774
|
- `entities/` — only entities actually referenced by an exported anchor; each page lists
|
|
1766
1775
|
every decision/fact anchored to it. Bindings to `domain:*` entities link to the domain
|
|
1767
1776
|
page instead; volatile `community:*` bindings are not exported at all.
|
|
@@ -15,7 +15,7 @@ a per-call parameter, not an environment/config setting.
|
|
|
15
15
|
| `SIDEGRAPH_CAPTURE_NUDGE` | unset | `host/hooks.py` (`stop` only). Set to `off` to disable the `Stop` block-to-distill nudge entirely — no other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-stop). |
|
|
16
16
|
| `SIDEGRAPH_RATIFY_NUDGE` | unset | `host/hooks.py` (`session_start` only). Set to `off` to disable the pending-ratification line entirely — no other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-session-start). |
|
|
17
17
|
| `SIDEGRAPH_SUBAGENT_BRIEF` | unset | `host/subagent.py` (`subagent_start` only). Set to `off` to stop the `SubagentStart` hook from giving each subagent the memory brief — no other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-subagent-start). |
|
|
18
|
-
| `SIDEGRAPH_DRIFT_NUDGE` | unset | `host/hooks.py` (`session_start` and `stop`). Set to `off` to suppress the two drift PROSE surfaces — the SessionStart "N record(s) need content review" line and the Stop-nudge drift clause. **The code-drift cache refresh still runs either way** (it is what keeps the `[drifted]` retrieval markers fresh — gating it would freeze markers at their last pre-`off` state), and the `[drifted]` tags in `get_task_context`/`query_decisions`/`drill_down` output are retrieval content, not gated by this switch. No other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-session-start). |
|
|
18
|
+
| `SIDEGRAPH_DRIFT_NUDGE` | unset | `host/hooks.py` (`session_start` and `stop`). Set to `off` to suppress the two drift PROSE surfaces — the SessionStart "N record(s) need content review" line (its recency clause included) and the Stop-nudge drift clause. **The code-drift cache refresh still runs either way** (it is what keeps the `[drifted]` retrieval markers fresh — gating it would freeze markers at their last pre-`off` state), and the `[drifted]` tags in `get_task_context`/`query_decisions`/`drill_down` output are retrieval content, not gated by this switch. No other value has any effect. See [`reference/hooks.md`](hooks.md#sidegraph-session-start). |
|
|
19
19
|
| `SIDEGRAPH_AUTO_ACCEPT` | unset | `server.py` (`propose_decisions`'s tool shell, read at point of use via `_auto_accept()`). Set to `on` to land agent-proposed decisions and facts as `status="accepted"` directly, bypassing the ratification queue — no other value has any effect, and `propose_domains` is never affected by this flag (domains always land `proposed` under it; only `SIDEGRAPH_RATIFY_POLICY=auto-all` can ratify an eligible domain, with a stamp). Detectable after the fact: `sidegraph-doctor`'s `unratified-accept` finding reports accepted agent-sourced records carrying no ratifier stamp, so a shared store can assert the gate in CI rather than trust it. See [`guides/capturing-decisions.md#4-auto-accept-opt-in`](../guides/capturing-decisions.md#4-auto-accept-opt-in). |
|
|
20
20
|
| `SIDEGRAPH_RATIFY_POLICY` | unset (`"manual"`) | `server.py` (`_ratify_policy()`, read at point of use inside the `propose_decisions` and `propose_domains` tool shells) and `cli.py` (each of the doc-import, rationale-import, and domain-bootstrap commands, read once immediately before its batch call). Parsed by the pure `capture.parse_ratify_policy`, which never reads the environment itself — every reader above resolves the raw value and threads the parsed policy down as a keyword, so one batch samples a single value throughout. `manual` (default) introduces no new transition and leaves every existing write path's semantics exactly as they are — it does not mean every write lands `proposed`; some paths already land `accepted` under their own pre-existing flags (e.g. `importer.py`'s `propose=False`), unaffected by this knob. `auto-low-risk` lets eligible `lesson`/`gotcha` decisions and standalone facts self-ratify at write time (never `adr`/`constraint` decisions or domains). `auto-all` additionally admits `adr`/`constraint` decisions and domains. Eligibility is deterministic and conjunctive: the policy admits the shape (under `auto-low-risk` a draft that `supersedes` another is never eligible); the record has at least one live Tier-1/Tier-2 anchor binding (a domain instead needs a graph reader, a clean `path_prefixes` lint, and a resolving seed anchor or non-empty prefixes); the write was clean and not a dry run; provenance is present. An attached fact never ratifies itself — it rides its decision's cascade, and one ineligible attached fact keeps the decision proposed. Scope: `propose_decisions` (decisions and standalone facts), `propose_domains` (`auto-all` only), `sidegraph-import` rationale mode only with `--propose`, `sidegraph-import --docs` only for `--propose` writes that land as a new `proposed` record (status-derived drafts, `superseded` re-imports and `status: rejected` documents never auto-ratify), and `sidegraph-domains bootstrap` (`auto-all` only; a candidate whose derived `path_prefixes` is empty stays proposed); `--dry-run` never transitions, and `add_domain`, `sidegraph-domains add`, `supersede_domain` successors and `sidegraph-bootstrap` are never affected. Under either auto policy a superseding proposal's predecessor stays open until the successor is ratified — automatically, or later by a human. Outcomes are always reported: `ratified_by`/`auto_ratify_error` on each propose result; under a non-`manual` policy the three CLI batch summaries append `, auto-ratified N` and print each failure on stderr as `auto-ratify failure: <id>: <reason>`; `sidegraph-doctor` adds two informational lines (see [`cli.md`](cli.md#sidegraph-doctor)). Matching is exact after trimming surrounding whitespace — `AUTO-ALL` falls back to `manual`. `sidegraph-init` never writes this value silently: in an interactive terminal it asks one question, defaulting to `auto-low-risk` on a bare Enter, and writes whichever answer the person gave (`auto-low-risk` or `manual`) into the project's `.claude/settings.json` `env` block explicitly; outside a terminal (CI, a script, an agent-driven session) it asks nothing and writes nothing, printing the line to add by hand instead; either way it never overwrites an existing value there. `--ratify-policy VALUE` sets it with no prompt, and `--no-settings` skips the whole step (see [`cli.md`](cli.md#sidegraph-init)). `manual` remains the library's own default when the variable is unset with no committed override, and is also what a freshly initialized project gets unless a person answers yes to the prompt (or passes `--ratify-policy auto-low-risk`/`auto-all`); `adr`/`constraint` decisions and domains still wait for a human under both `manual` and `auto-low-risk`. For a committed, CI-checkable setting, pin it in the repository's `.claude/settings.json` `env` block. Claude Code applies that block to the MCP server; under any other host the `sidegraph-mcp` entry point reads the committed value from the selected store's project when its environment sets none (an explicit environment value wins), so the policy also applies under Codex. Any unknown or empty value falls back to `manual` — fail-safe, never fail-open, the `SIDEGRAPH_PROPOSAL_WINDOW_DAYS` precedent. Auto-ratified records are stamped `ratified_by="auto:<policy>"`, distinguishing them from human review. When both knobs are set, legacy `SIDEGRAPH_AUTO_ACCEPT=on` wins over this policy — its direct-`ACCEPTED`, stamp-less write lands before any auto-ratify block runs, and `sidegraph-doctor`'s `unratified-accept` finding keeps flagging it regardless. |
|
|
21
21
|
| `SIDEGRAPH_UNRATIFIED` | unset (`"on"`) | `store_layout.py` (`proposal_surfaces`, read at point of use — the single proposal-surfacing policy every render surface funnels through: `retrieval.py` delegates to it, and so does the PreToolUse hook's index reader). Set to `off` for **regulated mode**: `proposed` records never surface as content — not in `get_task_context`, drill-down, the SessionStart TOC's unratified block, the PreToolUse records block, or the records appended to a subagent's brief on an `Agent` call — regardless of age. The `SubagentStart` brief's counts then include accepted decisions only. The SessionStart pending-ratification **counter stays** (it is queue metadata, not record content). No other value has any effect. For a committed, CI-checkable setting, pin it in the repository's `.claude/settings.json` `env` block. See [`hooks.md`](hooks.md#sidegraph-session-start). |
|
|
@@ -256,10 +256,18 @@ raises costs only its own line.
|
|
|
256
256
|
`$SIDEGRAPH_DRIFT_NUDGE != "off"`, one more line is appended (own `try/except`, same
|
|
257
257
|
never-cost-the-map guard as step 6). Verbatim, with `N` substituted:
|
|
258
258
|
|
|
259
|
-
> Sidegraph: N record(s) need content review: code changed or a prior check no longer applies —
|
|
259
|
+
> Sidegraph: N record(s) need content review (M new in the last 7 days): code changed or a prior check no longer applies —
|
|
260
260
|
> task-relevant ones carry a [drifted] tag in retrieval; full list: sidegraph-doctor;
|
|
261
261
|
> record_drift_check if still true, supersede if no longer true.
|
|
262
262
|
|
|
263
|
+
The parenthesised clause counts the records first seen drifted within the last 7 days; it
|
|
264
|
+
reads `(none new in the last 7 days)` when there are none and `(M new since YYYY-MM-DD)`
|
|
265
|
+
while the index is younger than 7 days. A record the store has not stamped counts as unknown
|
|
266
|
+
age, never as new, and the clause is left out whenever it cannot be certified. An index
|
|
267
|
+
built before this version prints no clause on its first day (a zero count that early says
|
|
268
|
+
nothing), `(none new since <date>)` while its stamping is younger than 7 days, and
|
|
269
|
+
`(none new in the last 7 days)` from then on, until a record newly drifts.
|
|
270
|
+
|
|
263
271
|
`N` counts the whole store; the `[drifted]` tags (see
|
|
264
272
|
[`concepts/retrieval.md`](../concepts/retrieval.md)) mark only the records a given
|
|
265
273
|
retrieval call actually surfaces — the line says where each lives. A duplicate
|