sidegraph 0.17.1__tar.gz → 0.17.3__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.17.1 → sidegraph-0.17.3}/.github/workflows/ci.yml +1 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/CHANGELOG.md +42 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/CLAUDE.md +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/PKG-INFO +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/ci-cd-maintenance.md +9 -7
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/troubleshooting.md +5 -2
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/graphify.md +14 -2
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/cli.md +11 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/hooks.md +11 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/mcp-tools.md +34 -13
- {sidegraph-0.17.1 → sidegraph-0.17.3}/package.json +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.muse-plugin/plugin.json +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/explain-why/SKILL.md +4 -2
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/heal-anchors/SKILL.md +21 -14
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/manage-domains/SKILL.md +5 -6
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/triage-drift/SKILL.md +27 -11
- {sidegraph-0.17.1 → sidegraph-0.17.3}/pyproject.toml +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/cli.py +21 -8
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/doctor.py +46 -6
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/githooks.py +152 -30
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/hooks.py +12 -3
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/integrity.py +43 -5
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/server.py +48 -19
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/validation_errors.py +21 -0
- sidegraph-0.17.3/tests/githooks_legacy_helper.py +46 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/githooks_support.py +0 -21
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bounded_listings.py +28 -9
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_doctor.py +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_code_drift.py +2 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_integrity.py +2 -1
- sidegraph-0.17.3/tests/test_doctor_record_identity.py +138 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_stale_instructions.py +2 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_drift_checks.py +46 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_githooks.py +2 -5
- sidegraph-0.17.3/tests/test_githooks_atomic_lock.py +246 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_pretool_records.py +30 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity.py +2 -2
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_refresh_hook.py +87 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_readers_format2.py +5 -2
- {sidegraph-0.17.1 → sidegraph-0.17.3}/uv.lock +1 -1
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.agents/plugins/marketplace.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.claude-plugin/marketplace.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/CODEOWNERS +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.gitignore +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.gitleaks.toml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.opencode/INSTALL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/.python-version +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/AGENTS.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/CONTRIBUTING.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/LICENSE +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/README.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/SECURITY.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/README.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/data-model.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/mind-model.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/concepts/retrieval.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/bootstrap.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/claude-code-setup.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/codex-setup.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/installation.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/getting-started/quickstart.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/adr-export.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/capturing-decisions.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/health-check.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/migrating-to-0.14.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/migrating-to-0.17.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/retrieval-in-sessions.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/semantic-docs.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/team-workflow.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/using-0.15.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/using-0.16.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/claude-code.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/codex.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/grok.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/muse.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/integrations/opencode.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/llms.txt +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/configuration.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/git-bindings.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/operations.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/releasing.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/stability.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/reference/store-format.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/index.js +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/check-plan/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/compact/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/compact/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/health-check/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/health-check/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/health-check/scripts/collect.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/import-adrs/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/setup/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr_cli.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr_files.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/adr_identity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bash_paths.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/apply.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/capture.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/config.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/delivery.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/doc_import.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/domain_snapshot.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/drift_checks.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/engine/rationale.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/diagnostics.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/mcp_entry.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/session_identity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/host/subagent.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/hot_index.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/importer.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/input_limits.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/maintenance.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/maintenance_clock.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/migrate.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/redaction_scan.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/redaction_tokens.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/retrieval.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/schema.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/stats/model.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_format.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_layout.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_rules.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/store_view.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/sync.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/text_paths.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/tool_rate_limit.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/verify.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/worktree_seeds.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/src/sidegraph/write_boundary.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/__init__.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/bounded_listings_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/conftest.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/drift_checks_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/graph_fixtures.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/graph_repo_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/membership_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/moved_adoption_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/opencode_plugin_runner.mjs +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/snapshot_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/store_format2_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/store_non_file_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/store_record_support.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_adr.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_adr_files.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_adr_identity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchor_descriptor.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchor_paths.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchoring.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_anchoring_membership.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_batch_panel_fixes.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_apply.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_descriptor_cleanup.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_scan_regular.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_bootstrap_unanchored.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_adr.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_compact_format2.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_domains_snapshot.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_import.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_init.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_store_precedence.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_command_windows.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_compact_skill.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_config.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_delivery_evidence.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_delivery_stats.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_delivery_surfaces.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doc_import.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_docs_claims.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_unhashable_payload.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domain_seed_names.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domain_snapshot_format.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domain_snapshot_notices.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_domains.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_engine_build.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entity_twins.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_entry_point_arguments.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_file_bound_retrieval.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_flow_profile.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_format2_notices.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_env.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_git_output_utf8.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_graphify_pin.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_health_check_skill.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_body_compaction.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_contention.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_failure_diagnostics.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_payload_encoding.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_showings.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_integrity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_launch.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_stop.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_host_wiring_checks.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_index.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_index_facts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_index_hook.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_import_dry_run_preview.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_importer.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_index_journal_mode.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_engine_version.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_clock.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_dry_run_parity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_plan.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_maintenance_publish.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_mcp_entry_ratify_policy.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_mcp_entry_repo_root.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_merge_matrix_format2.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_migrate.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_muse_plugin.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_okf.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_opencode_plugin.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_portable_json.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_private_tests_isolation.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_public_hook_launch.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_ratify_policy.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_rationale_compatibility.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_engine_version.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_file_labels.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_label_conventions.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_read.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_stub_collapse.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_type_split.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_reader_version.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_rebuild_instruction.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_redaction_scan.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_redaction_tokens.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_repo_relative_paths_portable.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_membership_generations.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_membership_index.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_capture_diagnostics.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_capture_limits.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_cli_diagnostics.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_doc_limits.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_input_limits.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_mcp_write_diagnostics.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_numeric_enums.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_python_shapes.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_redaction_cursor.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_validation_errors.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_security_write_boundary.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_seed_paths_portable.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_annotations.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_argument_names.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_borrowed_graph.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_capture.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_decision_listing.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_domains.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_facts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_import.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_invocation_policy.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_mcp_smoke.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_record_types.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_result_contract.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_server_verify.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_session_attribution.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_skill_frontmatter.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_health.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_model.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_render.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_stop_rearm.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_compact.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_cross_process_mutations.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_domain_members.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_domains.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_entities.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_facts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_file_anchor_names.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format2_load.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format2_marker.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_format2_writes.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_inventory.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_meta.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_migration.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_non_file_entries.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_record_types.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_requirement.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_rules.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_snapshot_wiring.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_threading.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_subagent_start_manifests.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_subprocess_text_encoding.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_membership.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_run.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_snapshot_membership.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_text_paths.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_domain_snapshot.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_format2_against.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_format2_snapshot.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_git_framing.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_git_revisions.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_git_stdin.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_snapshot.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_model.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/test_worktree_seeds.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/wheel_server_trace.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tests/wheel_smoke.py +0 -0
- {sidegraph-0.17.1 → sidegraph-0.17.3}/tools/check_no_session_links.py +0 -0
|
@@ -201,6 +201,7 @@ jobs:
|
|
|
201
201
|
tests/test_hot_index_facts.py `
|
|
202
202
|
tests/test_delivery_evidence.py tests/test_delivery_stats.py tests/test_delivery_surfaces.py `
|
|
203
203
|
tests/test_git_output_utf8.py `
|
|
204
|
+
tests/test_githooks_atomic_lock.py::test_windows_pid_probe_is_never_a_signal_from_python `
|
|
204
205
|
tests/test_health_check_skill.py `
|
|
205
206
|
$privateTests
|
|
206
207
|
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
@@ -7,6 +7,48 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.17.3] — 2026-10-26
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Graph refresh hooks acquire both the runner lock and stale-breaker gate with exclusive
|
|
15
|
+
shell PID files. Concurrent hooks remain serialized on systems whose external `mkdir`
|
|
16
|
+
can report success to two racing callers, while live legacy directory locks are respected.
|
|
17
|
+
- Installer cleanup coordinates with the same breaker gate and preserves a lock whose owner
|
|
18
|
+
changed during its PID check. Optional native-lock failures no longer prevent publishing
|
|
19
|
+
an updated helper, and a failed gate PID write no longer leaves a permanent gate.
|
|
20
|
+
- Doctor detects the complete older directory-lock helper; plain `sidegraph-init` repairs
|
|
21
|
+
it while keeping hook bytes and the recorded choice. Automatic detection conservatively
|
|
22
|
+
preserves unfamiliar scripts and quoted examples. Run `sidegraph-init` after upgrading
|
|
23
|
+
in each clone that uses the old helper.
|
|
24
|
+
- Native Windows installer cleanup leaves PID-bearing locks untouched, instead of using
|
|
25
|
+
Python signal probes on process ids from a potentially different POSIX-shell namespace.
|
|
26
|
+
|
|
27
|
+
## [0.17.2] — 2026-10-25
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Doctor identifies per-record advisory findings with `record_id` and `record_type` in
|
|
32
|
+
JSON and prints the subject beside its physical path in text. Decisions sharing one
|
|
33
|
+
packed shard, source file and capture commit can now be triaged separately. This also
|
|
34
|
+
covers never-surfaced, orphaned-record, binding and other record findings; global notes
|
|
35
|
+
remain subjectless. Fixes [#1](https://github.com/SantyagoSeaman/sidegraph/issues/1).
|
|
36
|
+
- MCP domain-listing hints use the local Store API for oversized records, including packed
|
|
37
|
+
domains, and pending-proposal hints explain the visibility policy instead of promising
|
|
38
|
+
that an explicit id can bypass it.
|
|
39
|
+
- Drift checks distinguish missing required anchor files, absent checkable anchors and
|
|
40
|
+
untracked inspected paths with safe fixed diagnostics. Missing-scope errors explain how
|
|
41
|
+
to inspect the full anchor scope locally without reading SQLite. Unavailable anchor
|
|
42
|
+
entities and failed Git scope lookups get specific diagnostics before any check is published.
|
|
43
|
+
- Ratification refusals explain that an accepted decision or fact is not proposed. The
|
|
44
|
+
drift and anchor playbooks no longer recommend dropping accepted decisions, and clarify
|
|
45
|
+
that drift markers appear in formatted context rather than raw decision-listing JSON.
|
|
46
|
+
- PreToolUse refuses delivery before claiming files if a record-selection read fails.
|
|
47
|
+
Concurrent zero-wait hooks therefore cannot skip an unreadable early file and consume
|
|
48
|
+
different three-file sets from the same command.
|
|
49
|
+
- Complete the headless anchor-healing example's write-tool deny list with drift-check
|
|
50
|
+
writes and domain proposals.
|
|
51
|
+
|
|
10
52
|
## [0.17.1] — 2026-10-25
|
|
11
53
|
|
|
12
54
|
### Security
|
|
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
|
|
|
13
13
|
continuing participant in the project. A core feature must preserve, organize, or deliver
|
|
14
14
|
accumulated project understanding. Document search by itself is not the product.
|
|
15
15
|
|
|
16
|
-
Sidegraph is pre-1.0 (v0.17.
|
|
16
|
+
Sidegraph is pre-1.0 (v0.17.3) — the full loop (capture, ratification, mistakes-first
|
|
17
17
|
retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
|
|
18
18
|
facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
|
|
19
19
|
a stable release. See
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.17.
|
|
3
|
+
Version: 0.17.3
|
|
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
|
|
@@ -10,9 +10,10 @@ unattended.
|
|
|
10
10
|
|
|
11
11
|
1. **CI never ratifies.** Nothing in these recipes calls `ratify`/`sidegraph-ratify --accept`
|
|
12
12
|
(or `--drop`, for that matter). A scheduled job may *propose* a superseding decision
|
|
13
|
-
(`propose_decisions` with `supersedes`) or
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
(`propose_decisions` with `supersedes`) or report obsolete subjects in its summary.
|
|
14
|
+
Recommend drop only for proposed decisions/facts or a supported domain drop; accepted
|
|
15
|
+
decisions without a meaningful successor retain their history. A proposal verdict
|
|
16
|
+
stays a human action. See [`heal-anchors`](../../plugin/sidegraph/skills/heal-anchors/SKILL.md#triage-decision-tree-re-anchor-supersede-or-report-an-obsolete-subject)
|
|
16
17
|
for the triage tree these jobs run. An auto-ratification policy would break this rule
|
|
17
18
|
without any `ratify` call — the transition rides `propose_decisions` itself, which the
|
|
18
19
|
deny list below cannot block. Legacy `SIDEGRAPH_AUTO_ACCEPT=on` bypasses the queue too.
|
|
@@ -316,9 +317,10 @@ jobs:
|
|
|
316
317
|
claude -p 'Run the heal-anchors playbook: call sync_anchors(force=True), then for
|
|
317
318
|
every orphaned/ambiguous entity and every stale decision, follow the triage tree —
|
|
318
319
|
add_anchors for code that moved, propose_decisions(supersedes=...) for content
|
|
319
|
-
that is genuinely outdated, and a
|
|
320
|
-
|
|
321
|
-
|
|
320
|
+
that is genuinely outdated, and a status-aware summary for obsolete subjects.
|
|
321
|
+
Recommend drop only for proposed decisions/facts or a supported domain drop;
|
|
322
|
+
retain accepted decision history when there is no meaningful successor.
|
|
323
|
+
Summarize every action taken and recommendation at the end.' \
|
|
322
324
|
--model "$SIDEGRAPH_TRIAGE_MODEL" \
|
|
323
325
|
--mcp-config mcp-config.json --strict-mcp-config \
|
|
324
326
|
--allowedTools "mcp__sidegraph__sync_anchors mcp__sidegraph__find_entity mcp__sidegraph__query_structure mcp__sidegraph__query_decisions mcp__sidegraph__add_anchors mcp__sidegraph__propose_decisions mcp__sidegraph__list_proposed mcp__sidegraph__retrieve_decisions mcp__sidegraph__get_entity_history mcp__sidegraph__list_facts mcp__sidegraph__verify_store" \
|
|
@@ -355,7 +357,7 @@ CLI default.
|
|
|
355
357
|
|
|
356
358
|
Do not add `--permission-mode bypassPermissions`: it disables both tool lists. The
|
|
357
359
|
`--disallowedTools` list is the ratification guard: it names the tools that ratify or write a
|
|
358
|
-
record directly
|
|
360
|
+
record directly, records a drift check, or proposes a domain. The allowlist only narrows normal MCP
|
|
359
361
|
access and can be widened by ambient host settings. Keep both. Read-only built-in
|
|
360
362
|
tools can still inspect the checkout in a headless run; the troubleshooting note below states
|
|
361
363
|
that boundary explicitly. The matching
|
|
@@ -222,8 +222,11 @@ entity file is skipped, an anchor to the same name mints a second entity; once t
|
|
|
222
222
|
|
|
223
223
|
### refresh-helper-outdated
|
|
224
224
|
|
|
225
|
-
A git hook runs
|
|
226
|
-
|
|
225
|
+
A git hook runs an older graph refresh helper that uses directory-based locking, or starts
|
|
226
|
+
Graphify without `GRAPHIFY_NO_AUTO_REFRESH=1`.
|
|
227
|
+
The directory lock can admit overlapping rebuilds with uutils `mkdir`; the replacement uses
|
|
228
|
+
exclusive PID files for both the runner lock and the stale-breaker gate.
|
|
229
|
+
Graphify 0.9.87 and later refresh the agent skills they installed,
|
|
227
230
|
such as `~/.claude/skills/graphify/`, on the first run after a Graphify upgrade unless that
|
|
228
231
|
variable is set. One hook that runs the helper is enough for the check to fire, and a recorded "no"
|
|
229
232
|
does not silence it. Run `sidegraph-init` with no flag: it rewrites the helper and keeps your
|
|
@@ -242,13 +242,25 @@ the `/graphify` skill's `--update` form).
|
|
|
242
242
|
[above](#linked-worktrees-read-the-main-checkouts-graph)), so a commit in one does nothing.
|
|
243
243
|
Rebuilding there as well costs about 18 MB and 43 s for a cold build on one field corpus with
|
|
244
244
|
25 worktrees, and agents commit in worktrees constantly.
|
|
245
|
-
- **In the background, one at a time.** Git never waits for the rebuild.
|
|
245
|
+
- **In the background, one at a time.** Git never waits for the rebuild. An exclusively created PID file keeps
|
|
246
246
|
one rebuild running; a hook that fires while it runs makes it go once more when it finishes, so
|
|
247
247
|
the graph never settles on a tree older than the last request. A lock left by a job that died
|
|
248
248
|
is detected and cleared: by its pid, or, when the job died before writing one (a full disk, a
|
|
249
|
-
quota), by its age, ten minutes. `sidegraph-init --hooks`
|
|
249
|
+
quota), by its age, ten minutes. Re-running `sidegraph-init --hooks` refreshes the helper and clears a dead lock;
|
|
250
|
+
a fresh lock without a PID is kept until the ten-minute grace period expires. One risk
|
|
250
251
|
remains: after a reboot a pid can belong to a live, unrelated process, and the hook then waits
|
|
251
252
|
until that process exits.
|
|
253
|
+
Plain `sidegraph-init` also repairs an outdated helper in use, keeping the recorded choice.
|
|
254
|
+
Older helpers used lock directories; the new helper respects a live old runner and can
|
|
255
|
+
recover its stale directory. Both the lock and the stale-breaker gate now use shell
|
|
256
|
+
exclusive creation, so locking does not depend on external `mkdir`.
|
|
257
|
+
Installer cleanup takes the same breaker gate before removing a dead runner lock. A small
|
|
258
|
+
native OS lock on `sidegraph-graph-refresh.repair` serializes installers while they recover
|
|
259
|
+
a dead gate; the coordination file stays in the common git directory to keep a stable inode.
|
|
260
|
+
Where native locks are unsupported, helper publication still proceeds and optional installer
|
|
261
|
+
cleanup is skipped. On Windows, PID-bearing locks are left to the POSIX helper to recover,
|
|
262
|
+
because its PIDs need not be native Windows PIDs. Installing or repairing a helper does not
|
|
263
|
+
itself start a rebuild.
|
|
252
264
|
- **Where the output goes.** The last rebuild's output is `sidegraph-graph-refresh.log` in the
|
|
253
265
|
common git directory (`.git/` in a normal clone).
|
|
254
266
|
- **No `sidegraph-sync` in the hook.** The next memory call notices the new graph version and
|
|
@@ -1562,7 +1562,7 @@ plain-text line):
|
|
|
1562
1562
|
| `orphaned-record` | an open (`proposed`/`accepted`) decision or fact whose every Tier-2 (leaf) anchor is `orphaned`, so retrieval reaches it only through its file or domain; one finding per record, at its canonical file, naming how many leaf anchors it has. Statuses come from `index.db` and read "as of last sync", so the check is skipped while the statuses are not computed for the current graph (see *Skipped checks* below; run `sidegraph-sync`). It is the record-level view of `orphaned-binding` (any record it flags has orphaned bindings, which that code already reports), so it adds no new reason for `--check` to exit `2`. The fix is to rebuild a stale graph, then `sidegraph-sync`; otherwise re-anchor the record with `add_anchors` or the `heal-anchors` skill, or supersede it if the code is gone. Needs a usable `index.db` |
|
|
1563
1563
|
| `store-uncommitted` | store files nobody committed for at least 24 hours: records, bindings, entities, an archive segment or the root files (`format`, `.gitignore`, `stamping_live_since`) that `git status` shows as new, modified or deleted. One finding, at the store path, naming how many files there are, how old the oldest is and what kinds they are (a new `archive/` segment beside deleted records reads as "a compaction"). A new record or entity file is aged by its ULID name, which a `git stash` cannot rewrite; a modified file, or anything under `bindings/`, by its modification time; a deleted file by its subdirectory's, a lower bound. Entries fully staged in the index are not counted, so a `--check` run in a pre-commit hook does not block the commit that fixes the problem. **`--check` exits `2` on it.** The fix is to commit the store in a pull request. Silent, and not run, outside a git repository, with no `git`, or when git is slower than 2 seconds |
|
|
1564
1564
|
| `plugin-off-in-subdirectories` | Claude Code sessions started below the repository root run without the Sidegraph plugin. Claude Code reads the project settings (`.claude/settings.json`) of the launch directory only, and the repository root's `.claude/settings.local.json` for every launch inside the repository; `enabledPlugins` merges key by key (user settings, then project, then local). Two problems, reported as up to two findings: (a) the plugin is enabled only in the root's `.claude/settings.json`, so every directory below the root without its own enabling settings runs without it (reported at that file); (b) nested directories with a `.claude/settings.json` or `.claude/settings.local.json` of their own that sets `enabledPlugins` and whose merge leaves the plugin off (reported at the first such directory, naming how many there are; a nested settings file without `enabledPlugins` cannot change the merge, so it is not counted). The walk covers every directory that holds a tracked file (one `git ls-files` over the index, a few tens of milliseconds on a large repository) and looks for the two settings files in each directly, so a repository that ignores `.claude/` is covered. User settings are read from `$CLAUDE_CONFIG_DIR/settings.json` when that variable is set and non-empty, else from `~/.claude/settings.json`. Silent when the plugin is not enabled for a launch at the root at all, and not run outside a git repository, with no `git`, or when `git ls-files` takes longer than 5 seconds. **`--check` exits `2` on it**, like any finding; enabling the plugin at user scope or in the root's `.claude/settings.local.json` clears it |
|
|
1565
|
-
| `refresh-helper-outdated` | a git hook runs
|
|
1565
|
+
| `refresh-helper-outdated` | a git hook runs an older graph refresh helper that uses directory-based locking (unsafe with uutils `mkdir`), or whose Graphify line lacks `GRAPHIFY_NO_AUTO_REFRESH=1` (Graphify 0.9.87 and later can rewrite installed agent skills after an upgrade). Advisory, per clone (the helper lives in `.git/hooks`); **`--check` exits `2` on it**, like any finding. One hook that runs the helper is enough, and a recorded decline does not silence it. The fix is `sidegraph-init` (no flag), which refreshes the helper and keeps a recorded hook choice. Silent outside a git repository, with no helper, or when no hook runs it |
|
|
1566
1566
|
| `engine-version` | the graph was built by a Graphify release this Sidegraph was not tested with (its `graph.graphify_version` stamp is neither absent nor in the tested set), so anchors and domains may read differently. Advisory; **`--check` exits `2` on it**, like any finding. Pin Graphify to a tested release listed under [Engine version pinning](../integrations/graphify.md#engine-version-pinning), then rebuild the graph. It also fires for a mention-edge graph (Graphify 0.9.62 or later) over a store without a minimum Sidegraph version; follow the [0.14 migration guide](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/guides/migrating-to-0.14.md). A malformed marker leaves this second case silent. Silent without a readable graph |
|
|
1567
1567
|
| `store-not-migrated` | the store uses the pre-0.17 layout (a format marker below major 2) and holds at least one record of any kind (initiatives included). One finding, at the store path, naming `sidegraph-migrate` (run on the default branch, after the team checklist in the [0.17 migration guide](https://github.com/SantyagoSeaman/sidegraph/blob/main/docs/guides/migrating-to-0.17.md)) and the `sidegraph:compact` skill. Degraded; **`--check` exits `2` on it**, like any finding. Silent on an empty store and on a store that is already format 2 |
|
|
1568
1568
|
| `maintenance-due` | a format-2 store that `sidegraph-compact` would tidy: more than 200 per-record files, or a legacy `archive/` segment it would delete, or a misplaced or duplicated shard line, or a stray shard file. `sidegraph-verify` does not report these; maintenance heals them. A segment kept because one of its lines is not safe to delete does not count. Advisory; **`--check` exits `2` on it**, like any finding. Run `sidegraph-compact` on the default branch. Silent on a store that is not format 2 |
|
|
@@ -1617,6 +1617,16 @@ neither flagged nor cleared. `drill_down` does record a `domain:<slug>` seed, bu
|
|
|
1617
1617
|
consumes it yet; its *shows* count normally, so surfacing only through a domain drill-down
|
|
1618
1618
|
still protects a decision from a false flag.
|
|
1619
1619
|
|
|
1620
|
+
Each JSON finding has `code`, `path`, `detail`, `record_id` and `record_type`.
|
|
1621
|
+
Per-record findings carry their logical identity (`decision`, `fact`, `entity`, `domain`,
|
|
1622
|
+
or `bindings`); global notes have null record fields. A malformed raw record whose id
|
|
1623
|
+
cannot be read also has a null subject; use its violation and physical path for repair. `path` retains the physical source,
|
|
1624
|
+
including a shared shard or archive segment, so it is not a record locator. Text prints
|
|
1625
|
+
`<code> <record_type>:<record_id> <path> <detail>` for identified subjects; global notes
|
|
1626
|
+
omit the subject column. `duplicate-entity` identifies the selected lowest-id entity;
|
|
1627
|
+
its detail names the other members. A `bindings` subject uses the bound record's id.
|
|
1628
|
+
Use `record_id` to retrieve or check a drifted decision; do not parse the shard or detail.
|
|
1629
|
+
|
|
1620
1630
|
`clean` is `true` only when both `violations` and `findings` are empty.
|
|
1621
1631
|
|
|
1622
1632
|
**Skipped checks.** A check that cannot look says so and is never a finding: it affects neither
|
|
@@ -402,6 +402,13 @@ raises costs only its own line.
|
|
|
402
402
|
> installed on the first rebuild after an upgrade. Ask the user to run `sidegraph-init`,
|
|
403
403
|
> which refreshes the helper and keeps their recorded hook choice; do not run it unasked.
|
|
404
404
|
|
|
405
|
+
A helper using the old directory-based lock is also reported: uutils `mkdir` can admit
|
|
406
|
+
overlapping rebuilds. `sidegraph-init` replaces it with exclusive PID-file locking while
|
|
407
|
+
preserving hook bytes and the recorded choice. The outdated-helper check recognizes concrete defects in simple shell helpers,
|
|
408
|
+
rather than comparing the whole template. It conservatively skips unfamiliar scripts with
|
|
409
|
+
heredocs or multiline quotes. This controls automatic defect repair; an ordinary init
|
|
410
|
+
that refreshes a fully installed hook still rewrites its managed helper.
|
|
411
|
+
|
|
405
412
|
It also sends a notice for the person. See
|
|
406
413
|
[`refresh-helper-outdated`](../guides/troubleshooting.md#refresh-helper-outdated).
|
|
407
414
|
15. **Refresh-hook line.** When no git hook keeps the graph fresh, one line tells the model to
|
|
@@ -832,6 +839,10 @@ permission flow, untouched:
|
|
|
832
839
|
session's own agent, so the main agent's keys do not start with any subagent's prefix. The value
|
|
833
840
|
is the claim's ISO timestamp. These keys are deliberately **not** the `Stop` hook's
|
|
834
841
|
`capture_sessions` ledger, so the guards can't consume each other.
|
|
842
|
+
If any record-selection read fails, the hook refuses this delivery before claiming any
|
|
843
|
+
file. An unreadable early file is not treated as an empty one: otherwise parallel hooks
|
|
844
|
+
could choose different triples from the same command. A later clean call may deliver
|
|
845
|
+
the files because this refusal consumes no per-file claim or showing.
|
|
835
846
|
7. If at least one claim succeeded, the winner emits one non-blocking, `additionalContext`-only
|
|
836
847
|
block for the files it won:
|
|
837
848
|
|
|
@@ -765,8 +765,10 @@ hundreds of records, so the answer fills in this order:
|
|
|
765
765
|
`omitted_ids_unlisted` counts ids the budget cut as well.
|
|
766
766
|
|
|
767
767
|
Nothing is dropped silently: a superseded record is at worst a short row or a bare id. Read an
|
|
768
|
-
omitted decision with `
|
|
769
|
-
`
|
|
768
|
+
omitted decision locally with `Store.get_decision(id)` and an omitted fact with
|
|
769
|
+
`Store.get_fact(id)` on the configured store, or narrow with `status=[...]` (for example
|
|
770
|
+
`["superseded"]`). Explicit-id `retrieve_decisions`/`list_facts` calls still obey the
|
|
771
|
+
proposal-surfacing policy and may omit older or regulated-mode proposals.
|
|
770
772
|
`omitted_records` and `omitted_ids` appear only when something was left out.
|
|
771
773
|
|
|
772
774
|
## `get_task_context`
|
|
@@ -1228,10 +1230,13 @@ initial prefix of complete rows, sorted by slug. Each row retains the existing f
|
|
|
1228
1230
|
"seed_anchor_count", "parent_slug", "child_slugs"}`. `member_count` remains
|
|
1229
1231
|
`len(domain.communities)`. Parent/child lineage comes from the full store even when filters
|
|
1230
1232
|
exclude relatives. When the character budget omits rows, `hint` identifies the effective bound,
|
|
1231
|
-
suggests filters, and names a bounded
|
|
1232
|
-
(
|
|
1233
|
-
|
|
1234
|
-
`
|
|
1233
|
+
suggests filters, and names a bounded local Python fallback for the next omitted domain:
|
|
1234
|
+
`Store.get_domain("<id>")` on the configured store. It returns the full model, including
|
|
1235
|
+
`seed_anchors`, for both per-record and packed layouts. Open the configured store with
|
|
1236
|
+
`with Store(store_path) as store:` and call `store.get_domain(id)`; a domain may no longer
|
|
1237
|
+
have an individual `.json` file. If the id itself cannot fit the hint, use
|
|
1238
|
+
`Store.iter_domains()`. This local Store access can rebuild the derived index; it is distinct
|
|
1239
|
+
from the read-only MCP listing.
|
|
1235
1240
|
When `limit` cuts the list, the hint suggests filters and raising `limit` only below 100. Empty
|
|
1236
1241
|
stores say `No domains in the store.`; empty filtered matches name active filter keys without
|
|
1237
1242
|
echoing their values. This is the provisional MCP return shape and sends no output schema or
|
|
@@ -1494,12 +1499,14 @@ When the queue does not fit, the first line counts it (`Pending: 31 decisions, 4
|
|
|
1494
1499
|
domains. Showing 18 decisions, 0 facts, 2 domains.`), the sections fill in order with the
|
|
1495
1500
|
blocks that fit (a block that does not fit is skipped and the fill goes on), and the end lists
|
|
1496
1501
|
what is missing, in the order of the blocks, as `<id> <title head>` entries (then `and N more
|
|
1497
|
-
ids`).
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1502
|
+
ids`). Read every item before deciding its verdict. The hint explains that decision
|
|
1503
|
+
or fact proposals may be hidden from `retrieve_decisions`/`list_facts` by the proposal
|
|
1504
|
+
window or regulated mode;
|
|
1505
|
+
explicit ids do not bypass that policy. Inspect omitted decisions locally with
|
|
1506
|
+
`Store.get_decision(id)` and omitted facts with `Store.get_fact(id)` on the configured
|
|
1507
|
+
store, or use `sidegraph-ratify` without flags for the full pending queue. Domains use
|
|
1508
|
+
`list_domains(status="proposed")`. Ratify what is shown, then call again, or raise
|
|
1509
|
+
`budget_chars`.
|
|
1503
1510
|
|
|
1504
1511
|
**Returns:** a plain-text string.
|
|
1505
1512
|
|
|
@@ -1556,6 +1563,12 @@ makes `bootstrap → ratify` turn the TOC on in the same session, without waitin
|
|
|
1556
1563
|
two only ever appear for a fact id that rode a decision's cascade rather than being named
|
|
1557
1564
|
directly.
|
|
1558
1565
|
|
|
1566
|
+
Decisions and facts can be accepted or dropped only while `proposed`. A refusal names
|
|
1567
|
+
the existing status; an accepted decision cannot be retired through `drop`. Propose a
|
|
1568
|
+
meaningful supersession when the recorded claim becomes obsolete. If no successor exists,
|
|
1569
|
+
report that limitation and retain history rather than editing canonical status fields.
|
|
1570
|
+
Domain drop has its separate accepted-domain exception.
|
|
1571
|
+
|
|
1559
1572
|
## `ratify_decisions` (deprecated)
|
|
1560
1573
|
|
|
1561
1574
|
```python
|
|
@@ -1815,7 +1828,15 @@ that exact HEAD; unrelated dirty files do not block the check. All current check
|
|
|
1815
1828
|
concrete anchor files are required; explicitly inspected dependencies may extend coverage.
|
|
1816
1829
|
Unknown binding status conservatively includes existing committed anchor paths. Abstract-only,
|
|
1817
1830
|
unstamped, skipped or terminal subjects, missing Git HEAD, incomplete scope and dirty
|
|
1818
|
-
inspected files are refused without a new check.
|
|
1831
|
+
inspected files are refused without a new check. Missing required anchors return the
|
|
1832
|
+
fixed code `missing_required_files`, distinct from `no_checkable_files` and `untracked_files`.
|
|
1833
|
+
To inspect the scope locally without querying SQLite, open the configured Store, call
|
|
1834
|
+
`store.bindings_for_record(decision_id)`, and resolve each `binding.entity_id` with
|
|
1835
|
+
`store.get_entity(...)`; inspect the descriptors' file paths and current Git entries.
|
|
1836
|
+
Include every current checkable concrete anchor, not just doctor's changed-file subset.
|
|
1837
|
+
An unloadable required entity returns `unavailable_anchor_scope`; a failed initial Git
|
|
1838
|
+
scope lookup returns `git_scope_unavailable`. Both refusals occur before check publication.
|
|
1839
|
+
Write errors keep their bounded schema vocabulary and do not echo file names or raw causes.
|
|
1819
1840
|
|
|
1820
1841
|
The result names `id`, `decision_id`, `checked_commit`, `required_files`, `checked_files`,
|
|
1821
1842
|
`provenance`, `cache_cleared` and `redactions`. `cache_cleared` only says whether an existing
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sidegraph",
|
|
3
3
|
"displayName": "Sidegraph",
|
|
4
|
-
"version": "0.17.
|
|
4
|
+
"version": "0.17.3",
|
|
5
5
|
"description": "Durable decision/lessons memory over your code graph — ADRs, gotchas, and constraints that survive refactors, retrieved mistakes-first.",
|
|
6
6
|
"author": { "name": "SantyagoSeaman", "url": "https://github.com/SantyagoSeaman" },
|
|
7
7
|
"homepage": "https://github.com/SantyagoSeaman/sidegraph",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sidegraph",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.3",
|
|
4
4
|
"description": "Durable decision/lessons memory over your code graph — ADRs, gotchas, and constraints that survive refactors, retrieved mistakes-first.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"skills": "./skills/",
|
|
@@ -45,8 +45,10 @@ accepted it yet — present it as a proposal, not settled memory.
|
|
|
45
45
|
|
|
46
46
|
`get_entity_history` returns superseded records too — that's the point. On a long-lived
|
|
47
47
|
entity the newest records come in full and the rest as short rows (`omitted_records`) or bare
|
|
48
|
-
ids (`omitted_ids`)
|
|
49
|
-
|
|
48
|
+
ids (`omitted_ids`). Explicit-id `retrieve_decisions` / `list_facts` calls obey the
|
|
49
|
+
proposal-surfacing policy and can omit old or regulated-mode proposals. For complete local
|
|
50
|
+
records use `Store.get_decision(id)` / `Store.get_fact(id)` on the configured store, or
|
|
51
|
+
narrow history with `status=["superseded"]`. The answer to a
|
|
50
52
|
why-question has two layers, and the reader deserves both, clearly separated:
|
|
51
53
|
|
|
52
54
|
1. **Current truth** — the live (`accepted`) records: the standing decision, its
|
|
@@ -74,6 +74,9 @@ store write or a source change: confirm before acting.
|
|
|
74
74
|
with **explicit fresh `anchors` pointing at the successor code**. Do NOT omit
|
|
75
75
|
`anchors` here: omitting inherits the predecessor's bindings verbatim — *including
|
|
76
76
|
their orphaned status* — which reproduces exactly the problem you're healing.
|
|
77
|
+
If an accepted decision has no meaningful successor, report the obsolete subject to
|
|
78
|
+
the human and retain its history. `ratify(drop=...)` rejects only proposed decisions
|
|
79
|
+
and facts; it cannot retire an accepted decision. Do not edit canonical status fields.
|
|
77
80
|
2. **A lone `orphaned: <name> (no match)`** whose decision is NOT in the stale block —
|
|
78
81
|
multi-anchor did its job: another anchor still holds the decision live. No action
|
|
79
82
|
needed unless the orphaned one was the load-bearing anchor.
|
|
@@ -89,8 +92,9 @@ store write or a source change: confirm before acting.
|
|
|
89
92
|
domain's frozen membership is, and a re-scope applies only after
|
|
90
93
|
`sidegraph-domains snapshot --refresh --domain <slug>`); read the old rule back first
|
|
91
94
|
(`list_domains(ids=[<domain_id>])` returns the exact complete row, including
|
|
92
|
-
`path_prefixes`; check its `hint` and use its local
|
|
93
|
-
for the actual `seed_anchors` list
|
|
95
|
+
`path_prefixes`; check its `hint` and use its local Store fallback if the row does not fit;
|
|
96
|
+
for the actual `seed_anchors` list use local Python `Store.get_domain(domain_id)`
|
|
97
|
+
on the configured store, which works for files and packed shards) and carry what's still
|
|
94
98
|
right — then `ratify(accept=[<new_id>])`. Or retire it: `ratify(drop=[<domain_id>])`
|
|
95
99
|
if the area is genuinely gone.
|
|
96
100
|
5. **`path rule too broad — path contribution dropped (...):`** — a `path_prefixes` rule
|
|
@@ -127,7 +131,7 @@ store write or a source change: confirm before acting.
|
|
|
127
131
|
not, `ratify(drop=[<the part that should not exist>])`: the remaining domain takes the
|
|
128
132
|
frozen membership back at once.
|
|
129
133
|
|
|
130
|
-
## Triage decision tree (
|
|
134
|
+
## Triage decision tree (re-anchor, supersede, or report an obsolete subject)
|
|
131
135
|
|
|
132
136
|
For every `orphaned`/`ambiguous` entity and every `stale_decisions` entry, walk this tree
|
|
133
137
|
before touching anything — the same tree whether you're triaging interactively or running
|
|
@@ -174,16 +178,17 @@ is gated on a human's `ratify`. Never call `supersede_decision`/`supersede_fact`
|
|
|
174
178
|
immediately-`accepted` MCP tools) from an unattended/CI context — unlike `propose_decisions`,
|
|
175
179
|
they skip the ratify gate entirely.
|
|
176
180
|
|
|
177
|
-
**(c) The subject is genuinely gone.**
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
181
|
+
**(c) The subject is genuinely gone.** Confirm that it was deleted rather than renamed
|
|
182
|
+
or moved. Check the record's current status. For an accepted decision, propose a meaningful
|
|
183
|
+
supersession when something remains true or successor code exists; otherwise report the
|
|
184
|
+
obsolete subject and retain its history. There is no accepted-decision retirement API.
|
|
185
|
+
`ratify(drop=[<id>])` and `sidegraph-ratify --drop <id>` reject only proposed decisions/facts.
|
|
186
|
+
Recommend those only for proposed records, and leave the verdict to the human. Domain drop
|
|
187
|
+
has its separate accepted-domain exception. Never edit canonical status or valid_to fields.
|
|
183
188
|
|
|
184
189
|
## Running this playbook headlessly (CI)
|
|
185
190
|
|
|
186
|
-
|
|
191
|
+
The lookup, binding-repair and proposal steps above can run without a human verdict
|
|
187
192
|
in the moment — `sync_anchors`/`find_entity`/`query_structure`/`add_anchors`/
|
|
188
193
|
`propose_decisions` all run fine unattended, and so do the tools that read records
|
|
189
194
|
(`retrieve_decisions`/`get_entity_history`/`list_facts`/`verify_store`) used to confirm a
|
|
@@ -199,12 +204,13 @@ policy would ratify through `propose_decisions` with no `ratify` call at all, wh
|
|
|
199
204
|
claude -p 'Run the heal-anchors playbook: call sync_anchors(force=True), then for every
|
|
200
205
|
orphaned/ambiguous entity and every stale decision, follow the triage tree — add_anchors
|
|
201
206
|
for code that moved, propose_decisions(supersedes=...) for content that is genuinely
|
|
202
|
-
outdated, and a
|
|
203
|
-
|
|
207
|
+
outdated, and a status-aware summary for obsolete subjects. Recommend drop only for
|
|
208
|
+
proposed decisions/facts or a supported domain drop; retain accepted decision history when
|
|
209
|
+
there is no meaningful successor. Do not call ratify. Summarize every action taken and every recommendation at the end.' \
|
|
204
210
|
--model claude-sonnet-5 \
|
|
205
211
|
--mcp-config mcp-config.json --strict-mcp-config \
|
|
206
212
|
--allowedTools "mcp__sidegraph__*" \
|
|
207
|
-
--disallowedTools "mcp__sidegraph__ratify,mcp__sidegraph__ratify_decisions,mcp__sidegraph__add_decision,mcp__sidegraph__supersede_decision,mcp__sidegraph__supersede_fact,mcp__sidegraph__supersede_domain,mcp__sidegraph__add_domain,mcp__sidegraph__add_fact" \
|
|
213
|
+
--disallowedTools "mcp__sidegraph__ratify,mcp__sidegraph__ratify_decisions,mcp__sidegraph__add_decision,mcp__sidegraph__supersede_decision,mcp__sidegraph__supersede_fact,mcp__sidegraph__supersede_domain,mcp__sidegraph__add_domain,mcp__sidegraph__add_fact,mcp__sidegraph__record_drift_check,mcp__sidegraph__propose_domains" \
|
|
208
214
|
--output-format stream-json --verbose
|
|
209
215
|
```
|
|
210
216
|
|
|
@@ -214,7 +220,8 @@ system itself consults, so under bypass they'd bind nothing at all, and the run
|
|
|
214
220
|
able to call every tool including `ratify`. **The `--disallowedTools` deny list is the
|
|
215
221
|
load-bearing guard**: it names the exact write-gate tools this playbook must never call
|
|
216
222
|
unattended — `ratify`/`ratify_decisions`, `add_decision`/`supersede_decision`,
|
|
217
|
-
`add_fact`/`supersede_fact`, `add_domain`/`supersede_domain`
|
|
223
|
+
`add_fact`/`supersede_fact`, `add_domain`/`supersede_domain`, `record_drift_check`,
|
|
224
|
+
`propose_domains` — and blocks them regardless
|
|
218
225
|
of the machine's ambient permission configuration. The `--allowedTools` wildcard is scoping,
|
|
219
226
|
not enforcement: on a pristine machine a headless `-p` run auto-denies *MCP* tool calls
|
|
220
227
|
outside it (no terminal to prompt), but a permissive user- or project-level `settings.json`
|
|
@@ -28,8 +28,8 @@ path_prefixes, seed_anchor_count, parent_slug, child_slugs}`. `member_count` is
|
|
|
28
28
|
`len(communities)` (0 for a domain not yet ratified/synced), and lineage reflects the full store.
|
|
29
29
|
Read `hint` before assuming the listing is complete. Narrow with `status`, `query` (AND terms
|
|
30
30
|
across slug/title/summary), or `ids` (exact domain ids). `limit` is clamped to 1..100 and
|
|
31
|
-
`budget_chars` to 4,000..40,000. A budget cut includes
|
|
32
|
-
the next omitted row; a count cut suggests filters and raising `limit` only while it is below
|
|
31
|
+
`budget_chars` to 4,000..40,000. A budget cut includes a local `Store.get_domain(id)` fallback for
|
|
32
|
+
the next omitted row in either storage layout; a count cut suggests filters and raising `limit` only while it is below
|
|
33
33
|
100. This is the tool for "show me all domains" — prefer it over the narrower views below:
|
|
34
34
|
|
|
35
35
|
- **`list_proposed()`** — domains awaiting ratification only (`status=proposed`), rendered
|
|
@@ -97,10 +97,9 @@ need git-history archaeology either:
|
|
|
97
97
|
the row still does not fit.
|
|
98
98
|
- **`seed_anchors`** has no structured tool-read for the descriptors themselves —
|
|
99
99
|
`list_domains()` gives you only `seed_anchor_count` (how many, not what). For the actual
|
|
100
|
-
`{"name", "file_path"}` list,
|
|
101
|
-
`.
|
|
102
|
-
see [store format](../../../../docs/reference/store-format.md))
|
|
103
|
-
not exposed through an MCP tool yet.
|
|
100
|
+
`{"name", "file_path"}` list, use local Python `Store.get_domain(domain_id)` on the configured store and read
|
|
101
|
+
its `seed_anchors`. This works for per-record files and packed shards; a domain may no
|
|
102
|
+
longer have its own `.json` file (see [store format](../../../../docs/reference/store-format.md)).
|
|
104
103
|
|
|
105
104
|
`supersede_domain` is also the mechanism behind the naming guide's [recovering from a
|
|
106
105
|
mass-drop](../../../../docs/guides/naming-your-domains.md#recovering-from-a-mass-drop): give
|
|
@@ -28,10 +28,18 @@ The CLI runs through uvx at the session's version, never the copy on `PATH` ([wh
|
|
|
28
28
|
uvx --from git+https://github.com/SantyagoSeaman/sidegraph.git@main sidegraph-doctor --json # findings[] entries with "code": "code-drift"
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
For a per-decision `code-drift` finding, use `record_id` and `record_type` ("decision")
|
|
32
|
+
to identify the subject. `path` is its physical source: several records may share one shard.
|
|
33
|
+
Never infer identity from the shard, capture commit or human-readable `detail`. Global notes
|
|
34
|
+
(commit stamping unavailable, Git unavailable, check skipped) have null record fields; they
|
|
35
|
+
are not records to triage. `detail` names changed files or why a prior check no longer applies.
|
|
36
|
+
Original `provenance.commit` stays history. Doctor is a pure read.
|
|
37
|
+
|
|
38
|
+
The SessionStart count and `[drifted]` tags in detailed formatted `get_task_context`,
|
|
39
|
+
`query_decisions` and `drill_down` output use the lazily refreshed drift cache. Budgets can
|
|
40
|
+
omit records, and compact related-record lines do not all show the marker. Raw
|
|
41
|
+
`retrieve_decisions` JSON has no drift field or tag in either storage layout; use doctor
|
|
42
|
+
for the explicit current list.
|
|
35
43
|
|
|
36
44
|
Triage in batches — a 35-record queue does not need 35 interrupts. Group verdicts and
|
|
37
45
|
**put every question to the human into one message** (same discipline as
|
|
@@ -60,7 +68,10 @@ Triage in batches — a 35-record queue does not need 35 interrupts. Group verdi
|
|
|
60
68
|
```
|
|
61
69
|
|
|
62
70
|
Include every current checkable concrete anchor file and each additional dependency
|
|
63
|
-
actually inspected.
|
|
71
|
+
actually inspected. If `missing_required_files` is returned, inspect the local configured
|
|
72
|
+
Store: `bindings_for_record(decision_id)`, then `get_entity(binding.entity_id).descriptor`
|
|
73
|
+
for each binding. Include every current checkable concrete file, not just the files
|
|
74
|
+
named as changed by doctor. The files must be tracked regular files and clean relative to
|
|
64
75
|
that HEAD; unrelated dirt is allowed. The target must be open, commit-stamped and
|
|
65
76
|
concretely anchored. With no Git HEAD, dirty inspected files, incomplete scope or an
|
|
66
77
|
ineligible target, report the judgment and why no check was recorded; retain the
|
|
@@ -88,10 +99,14 @@ Triage in batches — a 35-record queue does not need 35 interrupts. Group verdi
|
|
|
88
99
|
The direct `supersede_decision` path is legitimate only when the human has dictated
|
|
89
100
|
or approved the successor text in this conversation. For an invalidated *fact*,
|
|
90
101
|
the same split applies with `supersede_fact`.
|
|
91
|
-
- **(c) The anchored code is gone entirely** — deleted, not changed.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
102
|
+
- **(c) The anchored code is gone entirely** — deleted, not changed. Run
|
|
103
|
+
`sidegraph:heal-anchors` to distinguish a rename from a lost subject. For accepted
|
|
104
|
+
decisions, propose a meaningful supersession that explains the obsolete scope and
|
|
105
|
+
anchors what remains true. `ratify(drop=...)` only rejects proposed decisions/facts;
|
|
106
|
+
it cannot retire an accepted decision. If there is no meaningful successor, report
|
|
107
|
+
that limitation to the human and retain history; do not invent an empty successor
|
|
108
|
+
or edit status/valid_to in canonical files. Accepted domains have their own supported
|
|
109
|
+
drop path; do not generalize that exception to decisions.
|
|
95
110
|
|
|
96
111
|
## Calibrate the effort
|
|
97
112
|
|
|
@@ -115,8 +130,9 @@ of the wave's own definition of done, not a later triage's discovery.
|
|
|
115
130
|
|
|
116
131
|
End with one summary the human can act on in a single pass: checked (decision id, returned check id, revision, inspected scope and cache-clear outcome), still true but
|
|
117
132
|
check unavailable (id and reason), proposed supersessions (old id → new draft title, awaiting
|
|
118
|
-
`sidegraph:ratify-decisions`), handed to heal-anchors (ids), and
|
|
119
|
-
(ids +
|
|
133
|
+
`sidegraph:ratify-decisions`), handed to heal-anchors (ids), and unresolved obsolete subjects
|
|
134
|
+
(ids + current status + reason). Recommend `ratify(drop=[...])` only for proposed
|
|
135
|
+
decisions/facts, or domains whose drop path explicitly permits it.
|
|
120
136
|
|
|
121
137
|
## See also
|
|
122
138
|
|