sidegraph 0.19.0__tar.gz → 0.21.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.19.0 → sidegraph-0.21.0}/.github/workflows/ci.yml +66 -5
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/workflows/session-link-gate.yml +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/CHANGELOG.md +71 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/CLAUDE.md +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/CONTRIBUTING.md +3 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/PKG-INFO +2 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/anchoring.md +3 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/data-model.md +24 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/bootstrap.md +15 -7
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/installation.md +4 -2
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/capturing-decisions.md +3 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/retrieval-in-sessions.md +5 -2
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/troubleshooting.md +11 -3
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/cli.md +17 -12
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/configuration.md +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/hooks.md +9 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/mcp-tools.md +51 -3
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/releasing.md +12 -6
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/stability.md +3 -3
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/store-format.md +33 -3
- {sidegraph-0.19.0 → sidegraph-0.21.0}/package.json +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.muse-plugin/plugin.json +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-decision/SKILL.md +2 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-fact/SKILL.md +2 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +59 -6
- {sidegraph-0.19.0 → sidegraph-0.21.0}/pyproject.toml +4 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/apply.py +1 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/cli.py +26 -6
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/integrations.py +134 -21
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/model.py +1 -0
- sidegraph-0.21.0/src/sidegraph/checkout_window.py +169 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/cli.py +71 -29
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/doctor.py +254 -21
- sidegraph-0.21.0/src/sidegraph/drift_checks.py +490 -0
- sidegraph-0.21.0/src/sidegraph/drift_groups.py +773 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/claude_settings.py +57 -9
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/hooks.py +5 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/integrity.py +33 -5
- sidegraph-0.21.0/src/sidegraph/md_sections.py +218 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/retrieval.py +43 -3
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/schema.py +62 -3
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/server.py +205 -9
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store.py +62 -14
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_layout.py +131 -3
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/sync.py +113 -41
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/validation_errors.py +51 -0
- sidegraph-0.21.0/tests/drift_groups_support.py +153 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_cli.py +202 -7
- sidegraph-0.21.0/tests/test_bootstrap_integrations.py +564 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_unanchored.py +5 -1
- sidegraph-0.21.0/tests/test_checkout_window.py +357 -0
- sidegraph-0.21.0/tests/test_ci_workflow.py +168 -0
- sidegraph-0.21.0/tests/test_claude_plugin_enabled.py +161 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_doctor.py +52 -1
- sidegraph-0.21.0/tests/test_cli_store_open_errors.py +130 -0
- sidegraph-0.21.0/tests/test_declared_sections_docs.py +54 -0
- sidegraph-0.21.0/tests/test_declared_sections_schema.py +136 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_code_drift.py +214 -0
- sidegraph-0.21.0/tests/test_doctor_declared_sections.py +499 -0
- sidegraph-0.21.0/tests/test_doctor_grouped_drift.py +515 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_record_identity.py +6 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_drift_checks.py +303 -0
- sidegraph-0.21.0/tests/test_drift_checks_blobs.py +150 -0
- sidegraph-0.21.0/tests/test_drift_groups.py +1040 -0
- sidegraph-0.21.0/tests/test_drift_recency.py +127 -0
- sidegraph-0.21.0/tests/test_drift_stamp_cache.py +205 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_spawn_guard.py +14 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_drift_nudge.py +79 -4
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_integrity.py +1 -1
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_index.py +7 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity.py +103 -1
- sidegraph-0.21.0/tests/test_markdown_it_dependency.py +13 -0
- sidegraph-0.21.0/tests/test_md_sections.py +560 -0
- sidegraph-0.21.0/tests/test_record_drift_check_sections.py +464 -0
- sidegraph-0.21.0/tests/test_record_drift_check_sections_input.py +82 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_validation_errors.py +1 -0
- sidegraph-0.21.0/tests/test_store_marker_checkout.py +222 -0
- sidegraph-0.21.0/tests/test_store_marker_checkout_race.py +185 -0
- sidegraph-0.21.0/tests/test_sync_drift_stamps.py +709 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/uv.lock +3 -1
- sidegraph-0.19.0/src/sidegraph/drift_checks.py +0 -209
- sidegraph-0.19.0/tests/test_bootstrap_integrations.py +0 -280
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.gitignore +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.gitleaks.toml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.opencode/INSTALL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/.python-version +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/AGENTS.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/LICENSE +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/README.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/SECURITY.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/README.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/concepts/retrieval.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/claude-code-setup.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/codex-setup.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/getting-started/quickstart.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/adr-export.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/health-check.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/migrating-to-0.14.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/migrating-to-0.17.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/semantic-docs.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/team-workflow.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/using-0.15.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/using-0.16.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/claude-code.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/codex.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/graphify.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/grok.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/muse.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/integrations/opencode.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/llms.txt +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/git-bindings.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/reference/operations.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/index.js +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/compact/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/compact/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/explain-why/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/health-check/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/health-check/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/health-check/scripts/collect.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr_cli.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr_files.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/adr_identity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bash_paths.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/capture.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/config.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/delivery.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/domain_snapshot.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/engine/rationale.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/diagnostics.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/mcp_entry.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/session_identity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/host/subagent.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/hot_index.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/input_limits.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/maintenance.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/maintenance_clock.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/migrate.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/redaction_scan.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/redaction_tokens.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/stats/model.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_format.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_rules.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/store_view.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/text_paths.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/tool_rate_limit.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/verify.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/worktree_seeds.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/src/sidegraph/write_boundary.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/__init__.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/bounded_listings_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/conftest.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/drift_checks_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/githooks_legacy_helper.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/githooks_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/graph_fixtures.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/graph_repo_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/membership_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/moved_adoption_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/opencode_plugin_runner.mjs +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/snapshot_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/store_format2_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/store_non_file_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/store_record_support.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_adr.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_adr_files.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_adr_identity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchor_descriptor.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchor_paths.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_anchoring_membership.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_batch_panel_fixes.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bootstrap_scan_regular.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_bounded_listings.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_adr.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_compact_format2.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_domains_snapshot.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_store_precedence.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_command_windows.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_compact_skill.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_config.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_delivery_evidence.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_delivery_stats.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_delivery_surfaces.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doc_import.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_integrity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_unhashable_payload.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domain_seed_names.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domain_snapshot_format.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domain_snapshot_notices.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_domains.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_engine_build.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entity_twins.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_entry_point_arguments.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_file_bound_retrieval.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_format2_notices.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_format2_windows.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_git_output_utf8.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_githooks.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_githooks_atomic_lock.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_graphify_pin.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_health_check_skill.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_body_compaction.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_contention.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_failure_diagnostics.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_payload_encoding.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hook_showings.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_launch.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_pretool_records.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_stop.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_host_wiring_checks.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_index_facts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_index_hook.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_import_dry_run_preview.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_importer.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_index_journal_mode.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_engine_version.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_clock.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_dry_run_parity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_plan.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_maintenance_publish.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_mcp_entry_ratify_policy.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_mcp_entry_repo_root.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_merge_matrix_format2.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_migrate.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_muse_plugin.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_okf.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_opencode_plugin.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_portable_json.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_private_tests_isolation.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_public_hook_launch.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_ratify_policy.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_rationale_compatibility.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_engine_version.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_file_labels.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_label_conventions.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_stub_collapse.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_type_split.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_readers_format2.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_rebuild_instruction.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_redaction_scan.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_redaction_tokens.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_repo_relative_paths_portable.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_membership_generations.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_membership_index.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_related_cap.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_capture_diagnostics.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_capture_limits.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_cli_diagnostics.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_doc_limits.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_input_limits.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_mcp_write_diagnostics.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_numeric_enums.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_python_shapes.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_redaction_cursor.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_security_write_boundary.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_seed_paths_portable.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_annotations.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_argument_names.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_decision_listing.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_invocation_policy.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_record_types.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_result_contract.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_session_attribution.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_skill_frontmatter.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_render.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_stop_rearm.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_cross_process_mutations.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_domain_members.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_file_anchor_names.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format2_load.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format2_marker.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_format2_writes.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_inventory.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_junctions.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_non_file_entries.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_record_types.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_requirement.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_rules.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_rules_legacy_defaults.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_snapshot_wiring.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_subagent_start_manifests.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_subprocess_text_encoding.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_membership.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_snapshot_membership.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_text_paths.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_domain_snapshot.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_format2_against.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_format2_snapshot.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_git_framing.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_git_revisions.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_git_stdin.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_snapshot.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/test_worktree_seeds.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/wheel_server_trace.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tests/wheel_smoke.py +0 -0
- {sidegraph-0.19.0 → sidegraph-0.21.0}/tools/check_no_session_links.py +0 -0
|
@@ -7,20 +7,33 @@
|
|
|
7
7
|
#
|
|
8
8
|
# Actions are pinned to commit SHAs (the tag comment records the version): a mutable tag
|
|
9
9
|
# is a supply-chain hole, and this workflow ships to the public repo by snapshot.
|
|
10
|
+
# Draft PRs run lint, store-lint and anchor-health. Ready PRs, main pushes and
|
|
11
|
+
# workflow_call also run test, sdk-compatibility and windows-core. full-ci is the
|
|
12
|
+
# single required check. Ready pushes validate this revision against the full matrix.
|
|
13
|
+
# Draft runs use another name: a skipped job counts as success.
|
|
14
|
+
# A superseded PR run cannot provide a result for a newer revision.
|
|
15
|
+
# Rollback: disable the ruleset first, then revert this workflow through a PR.
|
|
10
16
|
name: ci
|
|
11
17
|
|
|
12
18
|
on:
|
|
13
19
|
push:
|
|
14
20
|
branches: [main]
|
|
15
21
|
pull_request:
|
|
22
|
+
types: [opened, synchronize, reopened, ready_for_review]
|
|
16
23
|
workflow_call: # reused as the pre-publish gate by publish.yml (tag builds)
|
|
17
24
|
|
|
18
25
|
permissions:
|
|
19
26
|
contents: read
|
|
20
27
|
|
|
28
|
+
# PR runs only: main, tag and workflow_call runs each get a unique group.
|
|
29
|
+
# This does not apply to session-link-gate.yml. Re-run only the head run.
|
|
30
|
+
concurrency:
|
|
31
|
+
group: ci-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || format('run-{0}', github.run_id) }}
|
|
32
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
33
|
+
|
|
21
34
|
jobs:
|
|
22
35
|
lint:
|
|
23
|
-
runs-on: ubuntu-
|
|
36
|
+
runs-on: ubuntu-slim
|
|
24
37
|
timeout-minutes: 15
|
|
25
38
|
steps:
|
|
26
39
|
# zizmor artipacked: this job never pushes, so the checkout's git credentials should not
|
|
@@ -42,7 +55,7 @@ jobs:
|
|
|
42
55
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
|
|
43
56
|
with:
|
|
44
57
|
path: ~/.cache/pre-commit
|
|
45
|
-
key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
|
|
58
|
+
key: pre-commit-ubuntu-slim-${{ hashFiles('.pre-commit-config.yaml') }}
|
|
46
59
|
|
|
47
60
|
- name: Install dependencies
|
|
48
61
|
run: uv sync --locked
|
|
@@ -77,6 +90,7 @@ jobs:
|
|
|
77
90
|
PY
|
|
78
91
|
|
|
79
92
|
test:
|
|
93
|
+
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
|
|
80
94
|
runs-on: ubuntu-latest
|
|
81
95
|
timeout-minutes: 30
|
|
82
96
|
strategy:
|
|
@@ -100,9 +114,10 @@ jobs:
|
|
|
100
114
|
run: uv sync --locked
|
|
101
115
|
|
|
102
116
|
- name: Run tests
|
|
103
|
-
run: uv run pytest -q
|
|
117
|
+
run: uv run pytest -q --durations=30 --durations-min=1
|
|
104
118
|
|
|
105
119
|
sdk-compatibility:
|
|
120
|
+
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
|
|
106
121
|
runs-on: ubuntu-latest
|
|
107
122
|
timeout-minutes: 15
|
|
108
123
|
strategy:
|
|
@@ -149,6 +164,7 @@ jobs:
|
|
|
149
164
|
-k "not t9 and not t14_every and not t14_the_manual and not console_script_is_the_host_entry"
|
|
150
165
|
|
|
151
166
|
windows-core:
|
|
167
|
+
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
|
|
152
168
|
runs-on: windows-2022
|
|
153
169
|
timeout-minutes: 30
|
|
154
170
|
strategy:
|
|
@@ -188,7 +204,7 @@ jobs:
|
|
|
188
204
|
if (Test-Path "tests/private/test_older_reader_native.py") {
|
|
189
205
|
$privateTests += "tests/private/test_older_reader_native.py"
|
|
190
206
|
}
|
|
191
|
-
uv run pytest -q --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
|
|
207
|
+
uv run pytest -q --durations=30 --durations-min=1 --junitxml="$env:RUNNER_TEMP/windows-core.xml" `
|
|
192
208
|
tests/test_store_mutation_guard.py `
|
|
193
209
|
tests/test_store_mutation_immediate.py tests/test_store_cross_process_mutations.py `
|
|
194
210
|
tests/test_hook_contention.py tests/test_retrieval_seeds.py `
|
|
@@ -207,6 +223,7 @@ jobs:
|
|
|
207
223
|
tests/test_git_output_utf8.py `
|
|
208
224
|
tests/test_githooks_atomic_lock.py::test_windows_pid_probe_is_never_a_signal_from_python `
|
|
209
225
|
tests/test_health_check_skill.py `
|
|
226
|
+
tests/test_checkout_window.py tests/test_store_marker_checkout_race.py `
|
|
210
227
|
$privateTests
|
|
211
228
|
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
212
229
|
|
|
@@ -289,7 +306,7 @@ jobs:
|
|
|
289
306
|
# this workflow ships to the public repo.
|
|
290
307
|
store-lint:
|
|
291
308
|
if: github.event_name == 'pull_request'
|
|
292
|
-
runs-on: ubuntu-
|
|
309
|
+
runs-on: ubuntu-slim
|
|
293
310
|
timeout-minutes: 10
|
|
294
311
|
steps:
|
|
295
312
|
# zizmor artipacked: this job never pushes; do not persist git credentials past checkout.
|
|
@@ -352,3 +369,47 @@ jobs:
|
|
|
352
369
|
uvx --from graphifyy==0.9.90 graphify update .
|
|
353
370
|
uv sync --locked
|
|
354
371
|
uv run sidegraph-sync --json --check
|
|
372
|
+
|
|
373
|
+
full-ci:
|
|
374
|
+
name: "${{ (github.event_name != 'pull_request' || !github.event.pull_request.draft) && 'full-ci' || 'full-ci (draft: full matrix not run)' }}"
|
|
375
|
+
if: ${{ always() }}
|
|
376
|
+
needs: [lint, test, sdk-compatibility, windows-core, store-lint, anchor-health]
|
|
377
|
+
runs-on: ubuntu-latest
|
|
378
|
+
timeout-minutes: 5
|
|
379
|
+
steps:
|
|
380
|
+
- name: Every required job passed on this revision
|
|
381
|
+
env:
|
|
382
|
+
FULL: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
|
|
383
|
+
EVENT: ${{ github.event_name }}
|
|
384
|
+
LINT: ${{ needs.lint.result }}
|
|
385
|
+
TEST: ${{ needs.test.result }}
|
|
386
|
+
SDK: ${{ needs.sdk-compatibility.result }}
|
|
387
|
+
WINDOWS: ${{ needs.windows-core.result }}
|
|
388
|
+
STORE_LINT: ${{ needs.store-lint.result }}
|
|
389
|
+
ANCHOR_HEALTH: ${{ needs.anchor-health.result }}
|
|
390
|
+
run: |
|
|
391
|
+
status=0
|
|
392
|
+
need() { # need <job> <result> <allowed...>
|
|
393
|
+
job="$1"; result="$2"; shift 2
|
|
394
|
+
for ok in "$@"; do [ "$result" = "$ok" ] && return 0; done
|
|
395
|
+
echo "::error::$job: '${result:-none}' (needs: $*)"; status=1
|
|
396
|
+
}
|
|
397
|
+
if [ "$FULL" != true ]; then
|
|
398
|
+
echo "::notice::Draft pull request: the full matrix did not run. Mark it Ready; the required check is full-ci."
|
|
399
|
+
need lint "$LINT" success
|
|
400
|
+
need store-lint "$STORE_LINT" success
|
|
401
|
+
need anchor-health "$ANCHOR_HEALTH" success
|
|
402
|
+
exit "$status"
|
|
403
|
+
fi
|
|
404
|
+
need lint "$LINT" success
|
|
405
|
+
need test "$TEST" success
|
|
406
|
+
need sdk-compatibility "$SDK" success
|
|
407
|
+
need windows-core "$WINDOWS" success
|
|
408
|
+
if [ "$EVENT" = pull_request ]; then
|
|
409
|
+
need store-lint "$STORE_LINT" success
|
|
410
|
+
need anchor-health "$ANCHOR_HEALTH" success
|
|
411
|
+
else
|
|
412
|
+
need store-lint "$STORE_LINT" success skipped
|
|
413
|
+
need anchor-health "$ANCHOR_HEALTH" success skipped
|
|
414
|
+
fi
|
|
415
|
+
exit "$status"
|
|
@@ -7,6 +7,77 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.21.0] — 2026-10-28
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Draft pull requests run only the quick CI checks. The full test matrix runs when a pull
|
|
15
|
+
request is marked ready for review, on `main` and before release, behind one aggregate
|
|
16
|
+
`full-ci` gate.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- `sidegraph-bootstrap` recognises a plugin install. When the manual registration files are
|
|
21
|
+
not complete, an enabled Sidegraph plugin satisfies the host check: Claude Code prints
|
|
22
|
+
`INTEGRATION Claude Code plugin sidegraph@sidegraph enabled (MCP + hooks)`, Codex prints
|
|
23
|
+
`INTEGRATION Codex best-effort` with `plugin sidegraph@sidegraph enabled; its hooks run
|
|
24
|
+
once trusted in Codex (/hooks)`, and a run that is otherwise complete exits `0` instead of
|
|
25
|
+
`2`. The `--report` integration section gains `- via: plugin` or `- via: manual`, and
|
|
26
|
+
`--report` refuses the user-level Claude Code settings and Codex config the check now reads.
|
|
27
|
+
|
|
28
|
+
- `sidegraph-viz` (with or without `--json`) and `sidegraph-export-okf` report a store that
|
|
29
|
+
cannot be opened, such as a damaged `index.db`, a format marker from another version or a
|
|
30
|
+
minimum-version requirement this release does not meet, as one
|
|
31
|
+
`store not readable (<path>): <error>` line on stderr and exit `2`, the documented
|
|
32
|
+
operational-error code. Before, they ended with a traceback and exit `1`. With `--json`,
|
|
33
|
+
nothing is printed on stdout in that case.
|
|
34
|
+
|
|
35
|
+
- Opening a store while git checks out a commit that changes `.sidegraph/format` (a pull of
|
|
36
|
+
a raised requirement or a migration, a branch switch, a clone) no longer writes a default
|
|
37
|
+
marker in its place. Git removes the old file before writing the new one. An open in that
|
|
38
|
+
moment could publish `sidegraph-store 0.6.0`, and git could not create its own file,
|
|
39
|
+
leaving the default without its `requires-sidegraph` line. The open now waits up to 2 seconds
|
|
40
|
+
for git's marker and refuses without writing if git stays busy or `HEAD` records a missing
|
|
41
|
+
marker. The message names the recovery step.
|
|
42
|
+
|
|
43
|
+
## [0.20.0] — 2026-10-28
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- **Contract change:** `record_drift_check` takes an optional `sections` argument for
|
|
48
|
+
markdown files: the sections you read, plus sections to also watch. The record then
|
|
49
|
+
re-arms on that file only when one of them, or the file's link reference definitions,
|
|
50
|
+
changes. The result echoes `declared_sections` (`first_line`, `lines`) and eleven new
|
|
51
|
+
fixed error codes name each refusal. The capsule gains an optional `declared_sections`
|
|
52
|
+
field inside `schema_version` 1 (hashes only, no heading text); plain capsules write an
|
|
53
|
+
empty list. An older release ignores the field, compares whole blobs and warns more,
|
|
54
|
+
never less. An unknown scheme or role, or a file whose structure cannot be bounded, still
|
|
55
|
+
compares by whole blob, and so does a partial clone on Git older than 2.45, where reading
|
|
56
|
+
section text could fetch objects.
|
|
57
|
+
- `sidegraph-doctor` groups per-record `code-drift` by the drifted file. Each record names the
|
|
58
|
+
blob it was compared against (a capture, check or scope baseline, with its mode) and shares
|
|
59
|
+
one `git diff <old blob> <new blob>` per distinct change; a mode-only or type change says so.
|
|
60
|
+
A record whose anchored Python function or Markdown section is identical at both ends carries
|
|
61
|
+
`anchored region unchanged; sibling sections of the file may still matter`, a reading aid
|
|
62
|
+
that never clears or reorders anything. `--json` gains a `drift_groups` key; `findings` is
|
|
63
|
+
unchanged. `--flat` restores one line per record and skips the grouping.
|
|
64
|
+
- `markdown-it-py>=4,<5` is a direct dependency (Markdown heading spans for the hint and for
|
|
65
|
+
declared sections).
|
|
66
|
+
|
|
67
|
+
### Changed
|
|
68
|
+
|
|
69
|
+
- The SessionStart drift line says how many of the records needing review are recent:
|
|
70
|
+
`Sidegraph: 190 record(s) need content review (12 new in the last 7 days): …`, or
|
|
71
|
+
`(none new in the last 7 days)`. A record without a recorded first-seen time counts as
|
|
72
|
+
unknown age, never as new. An index built before this version prints the line without the
|
|
73
|
+
clause on its first day, `(none new since <date>)` while its stamping is younger than
|
|
74
|
+
7 days, and `(none new in the last 7 days)` from then on, until a record newly drifts.
|
|
75
|
+
`SIDEGRAPH_DRIFT_NUDGE=off` silences it with the rest of the line.
|
|
76
|
+
- `sidegraph-doctor --json` findings carry `first_seen`: the ISO time a `code-drift`
|
|
77
|
+
record was first seen drifted, otherwise `null`.
|
|
78
|
+
- The default `sidegraph-doctor` text for per-record `code-drift` is the grouped block above
|
|
79
|
+
instead of one line per record. The summary count, `--check` and the exit codes are unchanged.
|
|
80
|
+
|
|
10
81
|
## [0.19.0] — 2026-10-27
|
|
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.21.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
|
|
@@ -59,7 +59,9 @@ issue when there is one, keep the patch focused, and update affected documentati
|
|
|
59
59
|
Use an area-prefixed imperative commit subject, for example `store: preserve history`,
|
|
60
60
|
and sign off each commit as described below.
|
|
61
61
|
|
|
62
|
-
CI runs
|
|
62
|
+
CI runs lint on every PR push. On a pull request that is ready for review (not a draft),
|
|
63
|
+
on `main` and before publishing, it also runs the full suite on Linux/Python 3.13 and 3.14
|
|
64
|
+
and a selected native Windows
|
|
63
65
|
core/MCP suite on both versions; see [platform coverage](docs/getting-started/installation.md#platform-coverage).
|
|
64
66
|
If your change touches paths, permissions,
|
|
65
67
|
subprocesses, or shell commands, describe any additional platform checks you performed.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.21.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. |
|
|
@@ -124,20 +124,28 @@ current-graph anchor proof. Optional domain suggestions do not block that proof.
|
|
|
124
124
|
| Claude Code | verified | verified | verified | verified | complete v1 flow |
|
|
125
125
|
| Codex | verified when configured | verified when configured | verified when configured | unsupported | best-effort only |
|
|
126
126
|
|
|
127
|
-
The host check reads the manual registration files
|
|
127
|
+
The host check reads the manual registration files first: `.mcp.json` and the `hooks` of
|
|
128
128
|
`.claude/settings.json` for Claude Code, `.codex/config.toml` and `.codex/hooks.json` for Codex.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
When they are not complete, an enabled Sidegraph plugin satisfies the check.
|
|
130
|
+
|
|
131
|
+
For Claude Code, the `enabledPlugins` merge must enable `sidegraph@<marketplace>` for a session
|
|
132
|
+
launched at the bootstrap root: user settings, that directory's `.claude/settings.json` and
|
|
133
|
+
`.claude/settings.local.json`, then the repository root's `.claude/settings.local.json` when
|
|
134
|
+
launching below it. `$CLAUDE_CONFIG_DIR` replaces `~/.claude` for user settings when set.
|
|
135
|
+
The terminal prints `INTEGRATION Claude Code plugin sidegraph@sidegraph enabled (MCP + hooks)`.
|
|
136
|
+
For Codex, `[plugins."sidegraph@<marketplace>"]` with `enabled = true` in
|
|
137
|
+
`$CODEX_HOME/config.toml` (default `~/.codex/config.toml`) satisfies its supported checks.
|
|
138
|
+
Under `INTEGRATION Codex best-effort`, it prints
|
|
139
|
+
`plugin sidegraph@sidegraph enabled; its hooks run once trusted in Codex (/hooks)`.
|
|
140
|
+
Bootstrap cannot see Codex hook trust.
|
|
134
141
|
|
|
135
142
|
Claude Code has the complete v1 flow. Codex has MCP, SessionStart, and Stop support, but no
|
|
136
143
|
Read/Grep PreToolUse equivalent. When store, anchors, all three supported Codex checks, and
|
|
137
144
|
production proof are complete, the command reports `best-effort`. In that state, best-effort completion exits 0
|
|
138
145
|
with an explicit warning. The terminal never prints `fully supported` for Codex (the optional
|
|
139
146
|
`--report` markdown does write `- fully supported: false` for Codex). A missing or invalid
|
|
140
|
-
supported check is actionable incomplete and exits `2
|
|
147
|
+
supported check is actionable incomplete and exits `2`, unless an enabled Sidegraph plugin
|
|
148
|
+
provides MCP and hooks for this host.
|
|
141
149
|
|
|
142
150
|
Exit `0` also covers full Claude Code activation and safe diagnostics with no required write.
|
|
143
151
|
A run whose approved candidates were all skipped as unanchored (see below) is such a
|
|
@@ -16,7 +16,8 @@ file- and domain-linked records without a graph; the complete workflow below ins
|
|
|
16
16
|
|
|
17
17
|
### Platform coverage
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
On every pull request that is ready for review (not a draft), on `main` and before every
|
|
20
|
+
publish, the automated matrix runs the full suite on Linux with Python 3.13 and 3.14. Native
|
|
20
21
|
Windows x64 (`windows-2022`) runs a selected portable core/MCP suite on both versions:
|
|
21
22
|
Store mutation/rollback and cross-process conflicts, UTF-8 and descriptor cleanup,
|
|
22
23
|
MCP result contracts, invocation admission, and wheel-probe guards. It also builds and
|
|
@@ -45,7 +46,8 @@ with Git for Windows installed; they do not establish support for Windows hosts
|
|
|
45
46
|
remains outside these checks.
|
|
46
47
|
See [Windows](#windows) before installing a host plugin.
|
|
47
48
|
|
|
48
|
-
Package dependencies support `fastmcp>=3.4.10,<4
|
|
49
|
+
Package dependencies support `fastmcp>=3.4.10,<4`, `mcp>=1.30,<2` and `markdown-it-py>=4,<5`
|
|
50
|
+
(markdown section scope for drift checks). Runtime security
|
|
49
51
|
floors also require `certifi>=2026.10.19` and
|
|
50
52
|
`opentelemetry-api>=1.45.1`, including standalone wheel installations. Major SDK upgrades
|
|
51
53
|
require a separate compatibility review; an unlocked package install may resolve newer
|
|
@@ -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).
|
|
@@ -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.
|
|
@@ -113,14 +113,21 @@ that depends on the exception:
|
|
|
113
113
|
- A store that requires a newer Sidegraph (`This store requires Sidegraph >= X.Y.Z; this is
|
|
114
114
|
A.B.C.`): upgrade to at least that version and start a new session. A teammate raised it
|
|
115
115
|
with `sidegraph-require`.
|
|
116
|
+
- A missing format marker (`the store format marker … is missing`, or
|
|
117
|
+
`store format marker is missing and git did not answer in time`): if a git command is
|
|
118
|
+
running (a pull or checkout), start a new session when it finishes. Otherwise restore a
|
|
119
|
+
committed marker with `git -C .sidegraph checkout HEAD -- format`. If the message names an
|
|
120
|
+
index lock and no git command is running, remove that named lock and open again. For a
|
|
121
|
+
repeated timeout with no git command running, check `git -C .sidegraph status`.
|
|
116
122
|
- A store written by a different Sidegraph version, for example a packed (format 2) store opened
|
|
117
123
|
by 0.14 to 0.16, whose message ends `migration tooling is deferred — use a fresh store`:
|
|
118
124
|
upgrade Sidegraph, or use the version that wrote it. The message predates `sidegraph-migrate`
|
|
119
125
|
and does not mean you need a fresh store.
|
|
120
126
|
- Anything else: `sidegraph-verify` gives the details.
|
|
121
127
|
|
|
122
|
-
|
|
123
|
-
next session start opens the store.
|
|
128
|
+
An ordinary store write lock held by another process is transient. The hook stays silent for
|
|
129
|
+
it, and the next session start opens the store. The marker-specific git refusal above instead
|
|
130
|
+
names its recovery step.
|
|
124
131
|
|
|
125
132
|
### pending-ratification
|
|
126
133
|
|
|
@@ -134,7 +141,8 @@ notice.
|
|
|
134
141
|
Records needing content review after code changed or a prior scoped check stopped applying.
|
|
135
142
|
The line says how many. Inspect current code: record an explicit `record_drift_check` if the
|
|
136
143
|
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,
|
|
144
|
+
`sidegraph-doctor` lists them as `code-drift` findings, grouped by the drifted file with one `git diff` per distinct
|
|
145
|
+
change (`sidegraph-doctor --flat` prints one line per record instead), and the `sidegraph:triage-drift` skill walks them.
|
|
138
146
|
`SIDEGRAPH_DRIFT_NUDGE=off` silences the line.
|
|
139
147
|
|
|
140
148
|
### graph-borrowed
|
|
@@ -89,14 +89,16 @@ exclusions, review/state table, host matrix, and recovery semantics.
|
|
|
89
89
|
| `--codex-config` | `.codex/config.toml` | alternate Codex MCP config path |
|
|
90
90
|
| `--candidate` | all candidates | review only the displayed candidate key |
|
|
91
91
|
| `--task` | deterministic proof selection | additional repository path for production retrieval proof |
|
|
92
|
-
| `--report` | none | after a confirmed apply (including the all-unanchored diagnostic), write an aggregate, source-content-free Markdown report; never uploaded. The pre-apply diagnostics (no candidates, every candidate skipped in review, a changed plan with no writes) write none. The destination must not be, or be hard-linked to, the graph, any host
|
|
92
|
+
| `--report` | none | after a confirmed apply (including the all-unanchored diagnostic), write an aggregate, source-content-free Markdown report; never uploaded. The pre-apply diagnostics (no candidates, every candidate skipped in review, a changed plan with no writes) write none. The destination must not be, or be hard-linked to, the graph, any host config file the check reads (both hosts', whichever `--host` is set, including the user-level Claude Code settings and Codex config) or a scanned source, and must not lie inside the store; the report replaces the file rather than truncating it in place |
|
|
93
93
|
| `--resume` | off | marker only, for the resume command a failed run prints — it changes no behavior. The scan/review/reconcile flow is idempotent, so reissuing the same command without it behaves identically |
|
|
94
94
|
|
|
95
95
|
Output keeps `STORE`, `ANCHORS`, `INTEGRATION`, and `PROOF` independent. Claude Code can
|
|
96
96
|
complete the full v1 flow. Codex verifies MCP, SessionStart, and Stop but reports Read/Grep
|
|
97
97
|
PreToolUse as unsupported; a green supported subset plus store, anchor, and proof completion
|
|
98
98
|
is `best-effort` and exits `0`, but is never labeled fully supported. A missing supported
|
|
99
|
-
check exits `2`.
|
|
99
|
+
check exits `2`. An enabled Sidegraph plugin satisfies the host check when the manual
|
|
100
|
+
registration files are not complete; see
|
|
101
|
+
[Completion, recovery, and hosts](../getting-started/bootstrap.md#completion-recovery-and-hosts).
|
|
100
102
|
|
|
101
103
|
**Exit codes:** `0` for complete activation, Codex best-effort completion, or a safe
|
|
102
104
|
no-write diagnostic; `1` for usage or operational failure, unreachable once anything has been
|
|
@@ -1515,7 +1517,7 @@ Once any record, hot or archived, carries an `auto:` stamp, two more information
|
|
|
1515
1517
|
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`.
|
|
1516
1518
|
|
|
1517
1519
|
```
|
|
1518
|
-
sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--json] [--graph PATH]
|
|
1520
|
+
sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--json] [--flat] [--graph PATH]
|
|
1519
1521
|
```
|
|
1520
1522
|
|
|
1521
1523
|
| Flag | Default | Meaning |
|
|
@@ -1524,7 +1526,8 @@ sidegraph-doctor [--db PATH] [--against GIT_REF] [--check] [--stale-days N] [--j
|
|
|
1524
1526
|
| `--against GIT_REF` | none | also run `sidegraph-verify`'s transition layer vs `GIT_REF` (identical semantics — same operational-error rules) |
|
|
1525
1527
|
| `--check` | off | advisory findings also exit `2`, except `maintenance-due` (default: report only; a *skipped* check never fails, even with `--check`) |
|
|
1526
1528
|
| `--stale-days N` | `30` | flag a proposed decision/domain whose id timestamp is strictly older than `N` days; must be `>= 0` |
|
|
1527
|
-
| `--json` | off | print `{"clean", "violations", "findings", "skipped"}` as one JSON object to stdout (nothing else) |
|
|
1529
|
+
| `--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) |
|
|
1530
|
+
| `--flat` | off | one `code-drift` line per record, as before: restores the flat listing and skips the grouping by file |
|
|
1528
1531
|
| `--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) |
|
|
1529
1532
|
|
|
1530
1533
|
One-stop store health: composes `sidegraph-verify`'s strict snapshot (+ optional
|
|
@@ -1554,7 +1557,7 @@ plain-text line):
|
|
|
1554
1557
|
| `stale-proposal` | a proposed decision/domain whose ULID timestamp is strictly older than `--stale-days` |
|
|
1555
1558
|
| `unreferenced-entity` | a hot entity no committed anchor set references (structural `domain:*`/`community:*` entities are exempt) |
|
|
1556
1559
|
| `expired-open-validity` | a decision's `valid_to` is strictly past but its status is still open (`proposed`/`accepted`) |
|
|
1557
|
-
| `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 |
|
|
1560
|
+
| `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 |
|
|
1558
1561
|
| `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 |
|
|
1559
1562
|
| `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 |
|
|
1560
1563
|
| `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 |
|
|
@@ -1620,7 +1623,8 @@ neither flagged nor cleared. `drill_down` does record a `domain:<slug>` seed, bu
|
|
|
1620
1623
|
consumes it yet; its *shows* count normally, so surfacing only through a domain drill-down
|
|
1621
1624
|
still protects a decision from a false flag.
|
|
1622
1625
|
|
|
1623
|
-
Each JSON finding has `code`, `path`, `detail`, `record_id` and `
|
|
1626
|
+
Each JSON finding has `code`, `path`, `detail`, `record_id`, `record_type` and `first_seen`
|
|
1627
|
+
(the ISO time Sidegraph first saw a `code-drift` finding's record drifted, otherwise `null`).
|
|
1624
1628
|
Per-record findings carry their logical identity (`decision`, `fact`, `entity`, `domain`,
|
|
1625
1629
|
or `bindings`); global notes have null record fields. A malformed raw record whose id
|
|
1626
1630
|
cannot be read also has a null subject; use its violation and physical path for repair. `path` retains the physical source,
|
|
@@ -1700,9 +1704,10 @@ Rendering does not mutate canonical records or `graph.json`. It opens the ordina
|
|
|
1700
1704
|
so startup may migrate supported legacy data or rebuild `index.db`. Binding status
|
|
1701
1705
|
(live/degraded/orphaned) reflects the last `sidegraph-sync`; run sync first for a fresh view.
|
|
1702
1706
|
Exit code 0 on success (a store with problems still exits 0 — the problems are the output), 2
|
|
1703
|
-
on an operational error
|
|
1704
|
-
|
|
1705
|
-
|
|
1707
|
+
on an operational error: an uninitialized store, a store that cannot be opened (for example
|
|
1708
|
+
a corrupt `index.db` or a format marker this version does not read; one
|
|
1709
|
+
`store not readable (<path>): <error>` line on stderr, and with `--json` nothing on stdout),
|
|
1710
|
+
or an unwritable output path.
|
|
1706
1711
|
|
|
1707
1712
|
## `sidegraph-export-adr`
|
|
1708
1713
|
|
|
@@ -1785,9 +1790,9 @@ write failure there can leave a partial export. A killed export can leave `.<out
|
|
|
1785
1790
|
or `.<out>.okf-old-*` beside `--out` (the repo root for the default `--out`). The `-old-`
|
|
1786
1791
|
one holds the previous export: if `--out` is missing, rename it back; if `--out` already holds
|
|
1787
1792
|
the new bundle, delete it. Exit `0` on success, `2` on an operational error
|
|
1788
|
-
(uninitialized store — never auto-created —
|
|
1789
|
-
|
|
1790
|
-
|
|
1793
|
+
(uninitialized store — never auto-created — a store that cannot be opened, printed as
|
|
1794
|
+
`store not readable (<path>): <error>` on stderr, or a refused/unwritable out dir or its
|
|
1795
|
+
parent).
|
|
1791
1796
|
|
|
1792
1797
|
## `sidegraph-stats`
|
|
1793
1798
|
|
|
@@ -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
|