sidegraph 0.9.0__tar.gz → 0.10.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.9.0 → sidegraph-0.10.0}/.agents/plugins/marketplace.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.claude-plugin/marketplace.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/CHANGELOG.md +104 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/CLAUDE.md +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/PKG-INFO +22 -9
- {sidegraph-0.9.0 → sidegraph-0.10.0}/README.md +21 -8
- {sidegraph-0.9.0 → sidegraph-0.10.0}/SECURITY.md +15 -4
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/concepts/mind-model.md +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/concepts/retrieval.md +50 -11
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/getting-started/claude-code-setup.md +17 -4
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/getting-started/codex-setup.md +7 -4
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/getting-started/installation.md +9 -2
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/getting-started/quickstart.md +20 -3
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/capturing-decisions.md +9 -7
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/retrieval-in-sessions.md +67 -16
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/semantic-docs.md +2 -2
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/team-workflow.md +11 -4
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/troubleshooting.md +3 -2
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/integrations/claude-code.md +36 -18
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/integrations/codex.md +41 -15
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/llms.txt +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/cli.md +55 -36
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/configuration.md +2 -2
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/hooks.md +52 -10
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/mcp-tools.md +207 -26
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/operations.md +12 -4
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/releasing.md +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/stability.md +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/.claude-plugin/plugin.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/.codex-plugin/plugin.json +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/check-plan/SKILL.md +7 -3
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/explain-why/SKILL.md +8 -6
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/heal-anchors/SKILL.md +6 -5
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/import-adrs/SKILL.md +10 -2
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/ratify-decisions/SKILL.md +6 -2
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/setup/SKILL.md +21 -6
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/triage-drift/SKILL.md +3 -3
- {sidegraph-0.9.0 → sidegraph-0.10.0}/pyproject.toml +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/__init__.py +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/apply.py +9 -5
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/cli.py +31 -10
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/doc_import.py +230 -50
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/importer.py +52 -3
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/retrieval.py +19 -6
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/server.py +677 -57
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/store.py +31 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_apply.py +44 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doc_import.py +67 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_docs_claims.py +35 -9
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_flow_profile.py +8 -1
- sidegraph-0.10.0/tests/test_import_dry_run_preview.py +619 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_importer.py +1 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_ratify_policy.py +14 -5
- sidegraph-0.10.0/tests/test_server_annotations.py +86 -0
- sidegraph-0.10.0/tests/test_server_argument_names.py +275 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_borrowed_graph.py +98 -0
- sidegraph-0.10.0/tests/test_server_decision_listing.py +773 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_mcp_smoke.py +10 -2
- sidegraph-0.10.0/tests/test_server_record_types.py +177 -0
- sidegraph-0.10.0/tests/test_store_record_types.py +77 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/uv.lock +1 -1
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/CODEOWNERS +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/secret_scanning.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/workflows/ci.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/workflows/publish.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/workflows/scorecard.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.github/workflows/session-link-gate.yml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.gitignore +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.gitleaks.toml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.pre-commit-config.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/.python-version +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/AGENTS.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/CODE_OF_CONDUCT.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/CONTRIBUTING.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/LICENSE +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/README.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/concepts/anchoring.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/concepts/data-model.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/concepts/decision-memory.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/getting-started/bootstrap.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/ci-cd-maintenance.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/naming-your-domains.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/surviving-refactors.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/guides/verifying-your-setup.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/integrations/graphify.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/pilot-kit/README.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/pilot-kit/corpus_fit.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/pilot-kit/judge-prompt.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/pilot-kit/questions-prompt.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/pilot-kit/rubric-template.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/git-bindings.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/reference/store-format.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/docs/whitepaper/index.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/.mcp.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/codex/hooks.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/codex/mcp.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/hooks/hooks.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/check-plan/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/explain-why/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/heal-anchors/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/import-adrs/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/manage-domains/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/manage-domains/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/name-domains/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/name-domains/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/ratify-decisions/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-decision/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-decision/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-fact/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/record-fact/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/setup/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/stats/SKILL.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/stats/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/plugin/sidegraph/skills/triage-drift/agents/openai.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/anchoring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bash_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/catalog.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/cli.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/integrations.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/planner.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/proof.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/review.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/bootstrap/scan.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/capture.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/config.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/doctor.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/engine/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/engine/reader.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/freshness.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/gitenv.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/githooks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/gitio.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/host/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/host/claude_settings.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/host/hooks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/host/launch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/host/subagent.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/hot_index.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/nearest_anchored.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/okf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/profiles.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/schema.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/seed_ladder.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/stats/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/stats/model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/stats/render.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/store_layout.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/sync.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/text_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/verify.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/viz/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/viz/assets/vis-network.min.js +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/viz/model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/viz/render.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/src/sidegraph/viz/template.html +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/__init__.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/conftest.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/auto_policy/parity_goldens.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bitfinex_slice.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/bmad/_bmad-output/planning-artifacts/architecture/cache/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/generic-adr/docs/adr/001-retry.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/genkovich-sdd/docs/features/cache/adr/001.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/spec-kit/specs/cache/plan.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/flows/superpowers/docs/superpowers/specs/2026-07-01-cache-design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/claude/.claude/settings.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/claude/.mcp.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/codex/.codex/config.toml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/hosts/codex/.codex/hooks/hooks.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/bootstrap/scan/docs/adr/001-safe.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/corpus/PUBLIC_CORPORA.txt +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/corpus/openspec/_provenance.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/corpus/openspec/graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/corpus/self-corpus/_provenance.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/corpus/self-corpus/expected/retrieval-engine-reader.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/corpus/self-corpus/graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/adr/0001-use-sessions.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/.memlog.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/architecture/architecture-payments-2026-07-30/ARCHITECTURE-SPINE.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/bmad/tree/_bmad-output/planning-artifacts/prds/prd-payments-2026-07-30/prd.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/0001-queue-backpressure.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/sad.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/adr/0001-queue-backpressure.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/sad.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/genkovich/tree/docs/features/payments/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design-empty.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design-h3-split.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design-with-summary.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/proposal-alternatives.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/proposal.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/proposal.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/specs/cap/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/add-thing/tasks.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/changes/archive/2026-01-01-add-thing/proposal.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/config.yaml +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/openspec/tree/openspec/specs/cap/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/spec-kit/plan.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/plan.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/spec-kit/tree/specs/003-payment-retries/spec.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/superpowers/2026-07-01-example-design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/flows/superpowers/2026-07-01-thin-design.md +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/member_names_python_graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/member_names_swift_graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/fixtures/mini_graph.json +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/githooks_support.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_agent_brief_manifests.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_anchoring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_anchoring_mapping_refresh.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bash_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_catalog.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_cli.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_integrations.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_planner.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_proof.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_review.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_bootstrap_scan.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_capture_auto_accept.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_capture_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_capture_initiative.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_capture_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_capture_neighbors.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_capture_propose.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_capture_redact.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_compact.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_doctor.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_graph_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_import.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_init.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_init_hooks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_okf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_ratify.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_ratify_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_stats.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_sync.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_sync_check.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_unreadable_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_cli_viz.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_codex_plugin.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_community_baseline.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_config.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_config_ancestor_lookup.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_config_borrowed_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_corpus_expected_renders.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_corpus_self_corpus.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_coverage_telemetry_e2e.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_digest_integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doc_corpus_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_auto_share.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_code_drift.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_dangling_supports.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_duplicate_entity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_graph_root_mismatch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_graph_stale.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_never_surfaced.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_scan.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_stale_instructions.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_doctor_unratified_accept.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_entity_duplicate_resolution.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_entity_get_or_create_race.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_env_isolation.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_fact_reachability_gate.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_git_bindings_blame.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_git_bindings_hook.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_git_bindings_provenance.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_git_config_isolation.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_git_env.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_githooks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_graph_freshness.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_hook_spawn_guard.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_agent_brief.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_agent_state.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_borrowed_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_claude_settings.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_drift_nudge.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_launch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_pretool.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_pretool_records.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_session_key.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_session_start.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_session_start_concurrent.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_stop.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_subagent_start.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_subdirectory_launch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_touch_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_host_wiring_checks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_hot_index.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_hot_index_hook.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_hot_path_imports.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_integrity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_integrity_refresh_hook.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_integrity_replay.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_integrity_stranded.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_lazy_root.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_member_anchor_wiring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_mind_model_additive_fields.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_nearest_anchored.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_okf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_openspec_profile.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_pathless_descriptor_adoption.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_pilot_kit_corpus_fit.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_proposal_lifecycle.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_public_hook_launch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_ratify_listing_gone_dark.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_community_labels.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_doc_nodes.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_member_name_lookup.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_member_names.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_nodes_in_file.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_perf.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_rationale.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_read.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_resolve.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_subdir_mismatch.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_reader_version.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_redaction_seeded.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_repoint_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_budget_counters.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_context.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_drift_marker.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_drilldown.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_guessed.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_ids.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_rank.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_seeds.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_shown_ids.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_terminal_evidence.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_thin_tools.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_toc.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_toptier.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_retrieval_unratified.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sandbox_hygiene.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_schema_descriptor.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_schema_domain.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_schema_fact.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_seed_ladder.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_add_anchors.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_anchoring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_capture.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_commit_hint.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_coverage_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_drilldown.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_find_entity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_get_store.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_get_task_context.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_graph_freshness.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_graph_path.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_import.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_nearest_anchored.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_prewrite_anchor_validation.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_ratify_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_redaction.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_refresh.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_render_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_supersede.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_sync_anchors.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_telemetry.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_thin_tools.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_tolerant_seeds.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_server_verify.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stats_graph.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stats_health.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stats_model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stats_render.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stats_skill.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stats_snapshot.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stop_hot_path.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_stop_rearm.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_agent_state.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_atomic_write_tmp_names.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_bad_file.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_binding_index.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_canonical_stat.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_compact.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_compact_review.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_concurrent_open.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_coverage_telemetry.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_derived_community.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_entities.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_fact_cascade.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_facts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_git_root_symlink.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_meta.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_migration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_mutation_guard.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_mutation_immediate.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_opens_with_merged_duplicate.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_persistence.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_ratification.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_rebuild_atomicity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_record_identity.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_render_events.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_retrieval.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_slug_conflicts.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_stamping_marker.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_symlinks.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_telemetry.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_threading.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_tmp_sweep_age.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_store_update_meta_if.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_subagent_start_manifests.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_canonical_writes.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_clean.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_domains.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_drift_cache.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_fresh_clone.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_integration.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_moved_adoption.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_rebind.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_repoint.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_report_has_findings.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_run.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_toc_cache.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_volatile_heal.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_sync_wiring.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_telemetry_retention.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_text_paths.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_verify_snapshot.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_verify_transitions.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_viz_asset_packaged.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_viz_model.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_viz_render_html.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tests/test_viz_render_json.py +0 -0
- {sidegraph-0.9.0 → sidegraph-0.10.0}/tools/check_no_session_links.py +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"source": "local",
|
|
9
9
|
"path": "./plugin/sidegraph"
|
|
10
10
|
},
|
|
11
|
-
"description": "Durable decision/lessons memory over your code graph — captured in-session,
|
|
11
|
+
"description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors."
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
{
|
|
7
7
|
"name": "sidegraph",
|
|
8
8
|
"source": "./plugin/sidegraph",
|
|
9
|
-
"description": "Durable decision/lessons memory over your code graph — captured in-session,
|
|
9
|
+
"description": "Durable decision/lessons memory over your code graph — captured in-session, ratified before it is trusted, retrieved mistakes-first, surviving refactors.",
|
|
10
10
|
"homepage": "https://github.com/SantyagoSeaman/sidegraph"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
@@ -7,6 +7,110 @@ interfaces, exactly, and what each one promises: [`docs/reference/stability.md`]
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.10.0] — 2026-10-04
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Every MCP tool now carries annotations, so a host's auto-reviewer stops rejecting memory
|
|
15
|
+
reads.** In the field, Codex's auto-reviewer rejected 20 `get_task_context` calls, and each
|
|
16
|
+
one lost memory for that step: an unannotated tool takes the MCP defaults (destructive,
|
|
17
|
+
open-world), and the review's verdict then depends on the prompt. The seven tools that never
|
|
18
|
+
change a tracked file are read-only; the other 17 are non-destructive, closed-world local
|
|
19
|
+
writes. No tool sends anything off the machine and none deletes a record. A test runs the
|
|
20
|
+
read-only tools on a store where a lazy sync would adopt a moved symbol, and fails if one of
|
|
21
|
+
them changes a tracked file, so the annotation cannot drift from what the tool does. See the
|
|
22
|
+
[reference](docs/reference/mcp-tools.md#annotations) and the
|
|
23
|
+
[Codex page](docs/integrations/codex.md#the-auto-reviewer-and-memory-reads).
|
|
24
|
+
- **The seed tools accept the argument names agents try, and every tool names its parameters in
|
|
25
|
+
an error.** `get_task_context`, `query_structure` and `query_decisions` accept `paths` (as
|
|
26
|
+
`files`) and `seeds`; each seed goes to `files` when it looks like a path and to `entities`
|
|
27
|
+
otherwise. `task` is refused with a line saying there is no free-text query. Any other
|
|
28
|
+
unknown argument, on any tool, is an error that names it and lists the tool's real parameters;
|
|
29
|
+
FastMCP's own error named the argument but not the parameters.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- **`retrieve_decisions` no longer returns the whole store.** One call returned a full dump of
|
|
34
|
+
every visible decision: about 143,000 tokens on a store of 260 records, more than a host would
|
|
35
|
+
show, and in a field report most agents passed `include_superseded: true` and then either
|
|
36
|
+
printed the dump or filtered it by hand. The call now has two answers.
|
|
37
|
+
- With no narrowing filter it returns an **overview**: the total, counts by status and kind
|
|
38
|
+
(superseded and rejected records included, so the counts say that history exists), and the
|
|
39
|
+
newest records as compact rows (`id`, `kind`, `status`, `title`, `valid_from`).
|
|
40
|
+
- With a narrowing filter it returns **full records**, gotchas and lessons first and newest
|
|
41
|
+
first, cut at `limit` (default 25, at most 100) or `budget_chars` (default 24,000, at most
|
|
42
|
+
60,000), whichever comes first. A `hint` says what cut the list, or why it is empty.
|
|
43
|
+
- The filters are new arguments, and they combine with AND: `status` and `kind` (a string or a
|
|
44
|
+
list), `files`, `query` (every word must occur in the record's text) and `ids` (exact record
|
|
45
|
+
ids, superseded ones too). `include_superseded` keeps its meaning: it widens the overview's
|
|
46
|
+
`newest` and a filtered call that has no `status`.
|
|
47
|
+
- `files` are read the way `get_task_context` reads them: a basename, a suffix, a directory or
|
|
48
|
+
a letter-case slip works. `unresolved_files` lists, for each path nothing could read (at most
|
|
49
|
+
ten, with `unresolved_omitted` counting the rest), why (`ambiguous`, `directory-too-large`,
|
|
50
|
+
`not-in-graph` or `no-graph`) and the candidates to pass instead.
|
|
51
|
+
- **The return type changed from a list to a JSON object, sent once as a single text block
|
|
52
|
+
with no structured copy**, so `budget_chars` is the real cost on every host. A client that
|
|
53
|
+
read the list now reads `decisions` of a filtered answer. The proposal policy is unchanged
|
|
54
|
+
and applies to every shape.
|
|
55
|
+
- The `check-plan`, `explain-why`, `triage-drift` and `heal-anchors` skills now call it with a
|
|
56
|
+
filter, and a test fails if a skill calls it without one. See the
|
|
57
|
+
[reference](docs/reference/mcp-tools.md#retrieve_decisions).
|
|
58
|
+
|
|
59
|
+
### Fixed
|
|
60
|
+
|
|
61
|
+
- **A fault converting a reviewed item in `sidegraph-bootstrap` now prints the RESUME line.** The
|
|
62
|
+
conversion of each reviewed item, and the check that its ref still matches the candidate,
|
|
63
|
+
ran outside the per-item error handling. A fault there, after an earlier item had been
|
|
64
|
+
written, left `apply_review` without a report: an `AssertionError` ended the run as a
|
|
65
|
+
traceback, a `ValueError` was reported as a failure before anything was written, and neither
|
|
66
|
+
printed `RESUME`, though canonical files were already on disk. The fault now takes the path a
|
|
67
|
+
write error takes: the run stops, reports `partial-recoverable` with the durable candidates and
|
|
68
|
+
the failing ref, and prints the resume command. A fault on the first item, before anything is
|
|
69
|
+
written, now exits 2 with `STORE incomplete`, the failing ref and the resume command, where a
|
|
70
|
+
`ValueError` used to exit 1 with an `ERROR` line; the terminal shows the failing ref and not the
|
|
71
|
+
reason.
|
|
72
|
+
- **`sidegraph-import --dry-run` now says what auto-ratification would do.** Both import paths
|
|
73
|
+
decided auto-ratification only after a real write, so under a non-`manual`
|
|
74
|
+
`SIDEGRAPH_RATIFY_POLICY` a dry run could not show which records a real run would land
|
|
75
|
+
accepted without a human: on one fixture it reported 0 where the real run auto-ratified 2. The
|
|
76
|
+
dry run now runs the same eligibility gate on the record the write would produce and reports
|
|
77
|
+
the result in a new `would_auto_ratify` field on `ImportReport` and `DocImportReport`, and as
|
|
78
|
+
`auto_ratify_eligible` on each dry-run item. `auto_ratified` keeps its meaning, transitions
|
|
79
|
+
that actually happened, so it stays 0 in a dry run.
|
|
80
|
+
- **Behaviour change:** under a non-`manual` policy the summary line gains `would
|
|
81
|
+
auto-ratify M` before `(skipped:` and an eligible item line ends with ` [auto]`. Under
|
|
82
|
+
`manual` both are unchanged. A dry run still never carries the real run's `auto-ratified K`.
|
|
83
|
+
- The count is eligibility, not a guarantee: a real run's transition can still fail, for
|
|
84
|
+
example on a race or a refused cascade.
|
|
85
|
+
- A key repeated within one run no longer counts twice in the dry run. Two rationales with the
|
|
86
|
+
same title in one file count once. A document ref met more than once (one file named twice, a
|
|
87
|
+
directory plus a file inside it, or a live and an archived copy that a profile maps to one
|
|
88
|
+
ref) is classified against the records the earlier copies would have left there, as the real
|
|
89
|
+
run sees them: an identical repeat is skipped, a differing one supersedes, and a copy after a
|
|
90
|
+
`rejected` first copy is a fresh write. Two rare shapes can still differ in the
|
|
91
|
+
`superseded`/`skipped` split, not in the eligibility count where checked: a ref met three
|
|
92
|
+
times with the first content returning, under an auto policy, and a repeat with no anchor of
|
|
93
|
+
its own.
|
|
94
|
+
- **`find_entity` no longer calls a dangling record a decision.** Each binding was labelled
|
|
95
|
+
`fact` if a fact lookup found it and `decision` otherwise, so a binding whose record exists in
|
|
96
|
+
neither table (a record file removed by hand, or lost in a merge) came back as a decision that
|
|
97
|
+
`get_decision` could not fetch, and each binding cost a query of its own. The types of all of an
|
|
98
|
+
entity's bindings now come from one read of the index, and a binding with no record reports
|
|
99
|
+
`record_type: "unknown"`. The value is additive: a client that handles `decision` and `fact`
|
|
100
|
+
is unaffected. `get_entity_history` uses the same read and still skips such a binding. See the
|
|
101
|
+
[reference](docs/reference/mcp-tools.md#find_entity).
|
|
102
|
+
- **A document status like `should not be rejected` no longer lands `rejected`.** The check for
|
|
103
|
+
a turned-down status saw a negation only as `not` and one space directly before the word, so
|
|
104
|
+
`should not be rejected`, `not rejected` (two spaces), `never rejected` and `isn't rejected`
|
|
105
|
+
all read as rejections, and a false `rejected` lands closed and invisible to retrieval. A
|
|
106
|
+
negation is now `not`, `never` or a word ending `n't` within the three words before the word in
|
|
107
|
+
the same clause. A clause ends at `,` `;` `.` `:`, a pipe, a slash, an em or en dash, or a spaced
|
|
108
|
+
hyphen or `->`, so `not reviewed, rejected`, `Not accepted — rejected` and `Won't do / rejected`
|
|
109
|
+
still read as rejections, as does `not rejected, rejected`. A conjunction does not end a
|
|
110
|
+
clause: `Not adopted and rejected` reads as negated, and lands accepted unless `--propose` or
|
|
111
|
+
a draft marker sends it to the ratification queue. See the
|
|
112
|
+
[reference](docs/reference/cli.md#sidegraph-import).
|
|
113
|
+
|
|
10
114
|
## [0.9.0] — 2026-10-04
|
|
11
115
|
|
|
12
116
|
### Added
|
|
@@ -13,7 +13,7 @@ task-aware retrieval + decision memory riding on the engine's entity graph.
|
|
|
13
13
|
continuing participant in the project. A core feature must preserve, organize, or deliver
|
|
14
14
|
accumulated project understanding. Document search by itself is not the product.
|
|
15
15
|
|
|
16
|
-
Sidegraph is pre-1.0 (v0.
|
|
16
|
+
Sidegraph is pre-1.0 (v0.10.0) — the full loop (capture, ratification, mistakes-first
|
|
17
17
|
retrieval, refactor-surviving re-anchoring, semantic docs layer, mind-model domains, and the
|
|
18
18
|
facts evidence layer) ships and is exercised end-to-end, but interfaces may still move before
|
|
19
19
|
a stable release. See
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sidegraph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.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
|
|
@@ -82,7 +82,9 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
# 3. Install the CLIs + MCP server, then bootstrap the store in your repo
|
|
85
|
-
# (creates .sidegraph/, prints setup instructions)
|
|
85
|
+
# (creates .sidegraph/, prints setup instructions). In a terminal it also asks
|
|
86
|
+
# whether to install a git hook that rebuilds the code graph after each commit,
|
|
87
|
+
# merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
|
|
86
88
|
uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
|
|
87
89
|
sidegraph-init
|
|
88
90
|
|
|
@@ -172,6 +174,10 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
172
174
|
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
173
175
|
```
|
|
174
176
|
|
|
177
|
+
Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
|
|
178
|
+
subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
|
|
179
|
+
subagent that decision memory exists and how to ask it.
|
|
180
|
+
|
|
175
181
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
176
182
|
dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
|
|
177
183
|
graph is disposable — the engine regenerates it from source at any moment. The memory must
|
|
@@ -215,7 +221,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
|
|
|
215
221
|
| `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
|
|
216
222
|
| `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
|
|
217
223
|
| `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
|
|
218
|
-
| `retrieve_decisions` / `list_facts` |
|
|
224
|
+
| `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
|
|
219
225
|
| `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
|
|
220
226
|
| `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
|
|
221
227
|
| `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
|
|
@@ -247,16 +253,22 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
247
253
|
|
|
248
254
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
249
255
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
250
|
-
plus a local, gitignored index it can always rebuild.
|
|
256
|
+
plus a local, gitignored index it can always rebuild. Two things sit outside the store:
|
|
257
|
+
the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
|
|
258
|
+
three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
|
|
259
|
+
`${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
|
|
260
|
+
**Nothing leaves your machine** —
|
|
251
261
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
252
262
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
253
263
|
session touched afterwards) so you can see which memory was shown and which files
|
|
254
264
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
255
265
|
- **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
|
|
256
|
-
are stored. A ratification gate controls
|
|
257
|
-
`
|
|
258
|
-
|
|
259
|
-
|
|
266
|
+
are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
267
|
+
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
268
|
+
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
269
|
+
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|
|
270
|
+
at write time with a stamp that says so: lessons, gotchas, and standalone facts under
|
|
271
|
+
`auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
|
|
260
272
|
- **Nothing is silently rewritten.** The store is append-only; every change of mind is
|
|
261
273
|
recorded as a supersession with its reason.
|
|
262
274
|
|
|
@@ -269,7 +281,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
|
|
|
269
281
|
domains and retrieval still works, but symbol-level anchors, communities, and moved-code
|
|
270
282
|
resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
|
|
271
283
|
Everything the engine produces is derived and regenerated on every rebuild; everything
|
|
272
|
-
Sidegraph stores is deliberate
|
|
284
|
+
Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
|
|
285
|
+
person, or by the opt-in policy). **Own the memory, rent the graph.**
|
|
273
286
|
|
|
274
287
|
## Status
|
|
275
288
|
|
|
@@ -52,7 +52,9 @@ only ever reads `graph.json`, so the plain install above is all it needs.
|
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
# 3. Install the CLIs + MCP server, then bootstrap the store in your repo
|
|
55
|
-
# (creates .sidegraph/, prints setup instructions)
|
|
55
|
+
# (creates .sidegraph/, prints setup instructions). In a terminal it also asks
|
|
56
|
+
# whether to install a git hook that rebuilds the code graph after each commit,
|
|
57
|
+
# merge and branch switch; `sidegraph-init --remove-hooks` takes it out again
|
|
56
58
|
uv tool install sidegraph # from PyPI — puts sidegraph-init / sidegraph-mcp / … on PATH
|
|
57
59
|
sidegraph-init
|
|
58
60
|
|
|
@@ -142,6 +144,10 @@ projects the full store, history included, into an OKF v0.1 bundle any OKF consu
|
|
|
142
144
|
Read / Edit / Bash read ──▶ the file's records delivered in the call (once per file per agent)
|
|
143
145
|
```
|
|
144
146
|
|
|
147
|
+
Subagents get the memory too: on Claude Code a hook appends the decisions for the files a
|
|
148
|
+
subagent's brief names to that brief, and on Claude Code and Codex another hook tells each new
|
|
149
|
+
subagent that decision memory exists and how to ask it.
|
|
150
|
+
|
|
145
151
|
Two layers age differently: the **structure** layer (the code graph — entities,
|
|
146
152
|
dependencies, communities: *the what*) and the **decision** layer on top (*the why*). The
|
|
147
153
|
graph is disposable — the engine regenerates it from source at any moment. The memory must
|
|
@@ -185,7 +191,7 @@ dropping a decision carries its still-pending facts along in the same verdict. D
|
|
|
185
191
|
| `add_decision` / `supersede_decision` | Append / reverse a decision (nothing is ever deleted) |
|
|
186
192
|
| `add_fact` / `supersede_fact` | Append / falsify a non-derivable fact — evidence for a decision, or standalone |
|
|
187
193
|
| `find_entity` / `get_entity_history` | Which decisions *and facts* touch this entity, and how they evolved |
|
|
188
|
-
| `retrieve_decisions` / `list_facts` |
|
|
194
|
+
| `retrieve_decisions` / `list_facts` | Filter decisions (bounded) / list current facts |
|
|
189
195
|
| `propose_decisions` / `propose_domains` / `add_domain` | Draft a decision (plus attached or standalone facts) or name a domain, from a session or by hand |
|
|
190
196
|
| `supersede_domain` | Lineage-correct rename/re-scope of a domain: closes the old, writes a `proposed` successor |
|
|
191
197
|
| `list_proposed` / `ratify` | The human gate (see `SIDEGRAPH_RATIFY_POLICY` in the configuration reference): review pending decisions, facts, *and* domains, accept/drop (a decision's verdict cascades to its still-pending facts) |
|
|
@@ -217,16 +223,22 @@ retrieval a richer graph to anchor against. Walkthrough:
|
|
|
217
223
|
|
|
218
224
|
- **Everything is local.** Sidegraph reads your repo and the engine's `graph.json`
|
|
219
225
|
(strictly read-only) and writes small human-readable JSON records inside your repo,
|
|
220
|
-
plus a local, gitignored index it can always rebuild.
|
|
226
|
+
plus a local, gitignored index it can always rebuild. Two things sit outside the store:
|
|
227
|
+
the git hooks that `sidegraph-init` can install to keep the graph fresh (a helper and
|
|
228
|
+
three hooks under `.git/hooks/`) and one cache file, `sidegraph/launch-commit`, under
|
|
229
|
+
`${XDG_CACHE_HOME:-~/.cache}`. [SECURITY.md](SECURITY.md) lists every write.
|
|
230
|
+
**Nothing leaves your machine** —
|
|
221
231
|
no network calls, no remote telemetry, no account. Sidegraph does keep local usage
|
|
222
232
|
diagnostics in that gitignored index (which stored memory was shown, and which files a
|
|
223
233
|
session touched afterwards) so you can see which memory was shown and which files
|
|
224
234
|
those sessions then touched; they never travel, and `SIDEGRAPH_TELEMETRY=off` disables them.
|
|
225
235
|
- **Secrets don't enter memory.** Proposed decisions and facts pass redaction before they
|
|
226
|
-
are stored. A ratification gate controls
|
|
227
|
-
`
|
|
228
|
-
|
|
229
|
-
|
|
236
|
+
are stored. A ratification gate controls which of the agent's drafts become trusted
|
|
237
|
+
memory. Under the default `manual` policy a person ratifies them. A proposal is stored first
|
|
238
|
+
and waits as `proposed` until then. If you answer yes to `sidegraph-init`'s
|
|
239
|
+
question (or set `SIDEGRAPH_RATIFY_POLICY` yourself), eligible records ratify themselves
|
|
240
|
+
at write time with a stamp that says so: lessons, gotchas, and standalone facts under
|
|
241
|
+
`auto-low-risk`, and also ADRs, constraints, and domains under `auto-all`.
|
|
230
242
|
- **Nothing is silently rewritten.** The store is append-only; every change of mind is
|
|
231
243
|
recorded as a supersession with its reason.
|
|
232
244
|
|
|
@@ -239,7 +251,8 @@ The engine is optional at runtime: without a graph, records anchor to file paths
|
|
|
239
251
|
domains and retrieval still works, but symbol-level anchors, communities, and moved-code
|
|
240
252
|
resolution need it (see the [operations reference](docs/reference/operations.md#the-graph-dependency-stated-plainly)).
|
|
241
253
|
Everything the engine produces is derived and regenerated on every rebuild; everything
|
|
242
|
-
Sidegraph stores is deliberate
|
|
254
|
+
Sidegraph stores is deliberate and permanent, and it is trusted only once ratified (by a
|
|
255
|
+
person, or by the opt-in policy). **Own the memory, rent the graph.**
|
|
243
256
|
|
|
244
257
|
## Status
|
|
245
258
|
|
|
@@ -25,10 +25,21 @@ Sidegraph is a local-only tool. Its entire data surface:
|
|
|
25
25
|
the visualization, OKF export and bootstrap-report commands write to the output paths you
|
|
26
26
|
give them; and the optional `sidegraph-prepare-commit-msg` git hook, once you install it,
|
|
27
27
|
adds commented decision trailers to the commit message file git hands it
|
|
28
|
-
(normally `.git/COMMIT_EDITMSG`).
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
(normally `.git/COMMIT_EDITMSG`). Three more writes sit outside the repository's own
|
|
29
|
+
files. `sidegraph-init --hooks` (or a yes to its refresh question) writes a helper script
|
|
30
|
+
and a marked block in three git hooks (`post-commit`, `post-merge`, `post-checkout`) under
|
|
31
|
+
`.git/hooks/`. When `core.hooksPath` is set, `sidegraph-init` writes only the helper (to
|
|
32
|
+
`.git/hooks/`) and prints the lines to add to your hooks by hand. While it runs, the helper
|
|
33
|
+
also keeps a lock, a flag file and a log in the git directory. `sidegraph-init --no-hooks`
|
|
34
|
+
writes the git config key `sidegraph.graphRefresh` to the repository's own config, and
|
|
35
|
+
`sidegraph-init --remove-hooks` takes the blocks, the helper and that key out again. The
|
|
36
|
+
SessionStart hook writes one 40-character commit id to
|
|
37
|
+
`${XDG_CACHE_HOME:-~/.cache}/sidegraph/launch-commit`, and only when the running package was
|
|
38
|
+
installed from the canonical `git+https://github.com/SantyagoSeaman/sidegraph.git@main`. That
|
|
39
|
+
covers the plugin and the manual `uvx --from …@main` recipe. A PyPI, tag, SHA or editable
|
|
40
|
+
install never writes it. Beyond those, the only filesystem writes are the standard config
|
|
41
|
+
snippets you install yourself (`.mcp.json`, hook entries). See
|
|
42
|
+
[`docs/reference/store-format.md`](docs/reference/store-format.md) for the full layout.
|
|
32
43
|
- **Network:** none. No remote telemetry, no phone-home, nothing leaves your machine. Local
|
|
33
44
|
retrieval telemetry is recorded in the gitignored `index.db` by default (which records
|
|
34
45
|
were shown and which files were touched, never uploaded); set `SIDEGRAPH_TELEMETRY=off` to
|
|
@@ -105,7 +105,7 @@ write below — the three raw authoring paths underneath it are:
|
|
|
105
105
|
asked to) names a domain directly, optionally nesting it under a `parent_slug`.
|
|
106
106
|
|
|
107
107
|
All three land `status=proposed`. **Every path passes through the same ratification gate** —
|
|
108
|
-
the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, kept
|
|
108
|
+
the unified `ratify` MCP tool (`ratify_decisions` is a deprecated alias, still kept)
|
|
109
109
|
and the `sidegraph-ratify` CLI, which list and accept/drop decisions *and* domains side by
|
|
110
110
|
side. By default no path bypasses human review, including bootstrap: a fresh repo can
|
|
111
111
|
propose dozens of domains from its community structure in one command, but nothing is named
|
|
@@ -15,7 +15,8 @@ whether the store has any accepted domains yet:
|
|
|
15
15
|
- **`render_toc(cache)`** — the real, domain-named table of contents (activated the moment the
|
|
16
16
|
first domain is ratified — no sync required, see [below](#when-the-toc-goes-live)): one line
|
|
17
17
|
per accepted domain (title, one-line summary truncated to 100 characters, mistake count,
|
|
18
|
-
subdomain count when non-zero), then initiatives, then global mistakes
|
|
18
|
+
subdomain count when non-zero), then initiatives, then global mistakes, then any proposed
|
|
19
|
+
global mistakes under `## Unratified proposals`. This is what "the
|
|
19
20
|
mind model comes alive" means in practice. The per-domain mistake count is what
|
|
20
21
|
[`drill_down`](#drill_downdomain_slug--the-axis-1-operation) would serve for that domain:
|
|
21
22
|
the accepted `gotcha`/`lesson`/`constraint` decisions in the union of those tagged to the
|
|
@@ -25,8 +26,12 @@ whether the store has any accepted domains yet:
|
|
|
25
26
|
(the ratify and capture paths) leaves out the document branch until the next sync pass that
|
|
26
27
|
has one.
|
|
27
28
|
- **`top_tier_map(store, reader)`** — the legacy, nameless fallback: top communities by member
|
|
28
|
-
count (labeled only by god-node name), initiatives, global mistakes
|
|
29
|
-
|
|
29
|
+
count (labeled only by god-node name), initiatives, global mistakes, then up to 10 other
|
|
30
|
+
accepted decisions under `## Recorded decisions`, up to 10 accepted facts under
|
|
31
|
+
`## Known facts`, and the proposals inside the surfacing window under
|
|
32
|
+
`## Unratified proposals`. The last three are what keep a store that has recorded its first
|
|
33
|
+
decisions and named no domain yet from showing an agent only engine communities. Runs on
|
|
34
|
+
demand (no cache) whenever the store has zero accepted domains — a fresh repo, or one that hasn't
|
|
30
35
|
bootstrapped/ratified any domains yet, sees exactly the same output as before this layer
|
|
31
36
|
existed.
|
|
32
37
|
|
|
@@ -38,8 +43,14 @@ covers every search surface, not just `Read`/`Grep`: *"When you need to find or
|
|
|
38
43
|
code in this project, call `get_task_context(files=[…])` with repo-relative paths before any
|
|
39
44
|
grep or file search — decisions, gotchas and a domain map are indexed here. Before a
|
|
40
45
|
non-trivial change, run the sidegraph check-plan skill if it is available. If the tool is
|
|
41
|
-
listed only by name, load it first."*
|
|
42
|
-
|
|
46
|
+
listed only by name, load it first."* A `Sidegraph X.Y.Z` line follows it, so a session
|
|
47
|
+
that launched an old install says so in its own context. Both degrade gracefully — an empty
|
|
48
|
+
store still gets the instruction, the version line and the header. After the map the hook
|
|
49
|
+
appends the integrity checks' status lines (records awaiting ratification, code drift, a stale
|
|
50
|
+
or missing graph, uncommitted store files and the rest), and sends a notice to the person for
|
|
51
|
+
the problems that need one; the texts and the order are in the
|
|
52
|
+
[hooks reference](../reference/hooks.md#sidegraph-session-start) and
|
|
53
|
+
[troubleshooting](../guides/troubleshooting.md). The `SessionStart` hook itself never
|
|
43
54
|
blocks startup: any failure, or a cache it can't parse, falls back to `top_tier_map` rather
|
|
44
55
|
than crashing; any failure in *that* prints `{}` and exits 0.
|
|
45
56
|
|
|
@@ -105,7 +116,8 @@ path with a stray `./`, a wrong prefix or a bare file name, a directory, and a `
|
|
|
105
116
|
with no file. Every rewrite is a guess and is named as one in the reply, the seeds that resolved
|
|
106
117
|
as written come first, and a guess that could mean several things is listed and never read (see
|
|
107
118
|
[`get_task_context`](../reference/mcp-tools.md#seeds-are-read-tolerantly)). The rule is still
|
|
108
|
-
exact matching, never similarity.
|
|
119
|
+
exact matching, never similarity. `query_structure` and `query_decisions` have no such ladder:
|
|
120
|
+
they take a seed exactly as written, so a loosely spelled path finds nothing there.
|
|
109
121
|
|
|
110
122
|
A seed reaches the store's entities two ways, and both count: a named seed that matches a
|
|
111
123
|
stored anchor name is that entity directly (whatever the graph calls the node, so a stored
|
|
@@ -297,9 +309,9 @@ and the old truncation behavior is unchanged, byte-for-byte.
|
|
|
297
309
|
`query_structure(seeds, budget_chars)` and `query_decisions(seeds, budget_chars)` are
|
|
298
310
|
`get_task_context` split down the middle — the structural-map half and the decision-memory half
|
|
299
311
|
(mistakes, decisions, facts, related), exposed as their own MCP tools for a cheap follow-up once the
|
|
300
|
-
caller already has one half and just needs the other. Both reuse the
|
|
301
|
-
and ranking code as `get_task_context
|
|
302
|
-
algorithm. `query_structure` needs a reader (no graph, no structural map — it says so rather
|
|
312
|
+
caller already has one half and just needs the other. Both reuse the same seed-resolution
|
|
313
|
+
and ranking code as `get_task_context`, but not its [tolerant seed reading](#seeds): they match
|
|
314
|
+
seeds exactly as written. They're thinner call surfaces, not a different algorithm. `query_structure` needs a reader (no graph, no structural map — it says so rather
|
|
303
315
|
than crashing); `query_decisions` degrades like `get_task_context` always has: named-seed
|
|
304
316
|
resolution needs a reader, but `scope: global` decisions still surface without one.
|
|
305
317
|
|
|
@@ -352,8 +364,35 @@ not a normalized repo-relative path to a file (check it). In a linked worktree t
|
|
|
352
364
|
main checkout's graph, a file that exists only on the branch gets one sentence saying the graph
|
|
353
365
|
does not hold it, and the rebuild advice for any other file names the main checkout. With no graph
|
|
354
366
|
at all and at least one seed, a `## No code graph` block names the path looked at and says to build
|
|
355
|
-
it (or, when the graph is there and cannot be read, that it is not readable).
|
|
356
|
-
|
|
367
|
+
it (or, when the graph is there and cannot be read, that it is not readable). A file seed with
|
|
368
|
+
no current record of its own, and anchored files near it, gets a `## Nearest anchored` sentence
|
|
369
|
+
that names those files (under `## Why this is empty` when the answer is empty). When the answer
|
|
370
|
+
holds no decision memory at all, the records of the named files follow under
|
|
371
|
+
`## Nearest anchored records (not anchored to your files)`; see
|
|
372
|
+
[the nearest anchored records](../reference/mcp-tools.md#the-nearest-anchored-records).
|
|
373
|
+
`render()` itself produces none of these blocks.
|
|
374
|
+
|
|
375
|
+
## Records that arrive without a query
|
|
376
|
+
|
|
377
|
+
An agent does not always call `get_task_context`, and a subagent starts without the session's
|
|
378
|
+
context. So the read path has three more channels, all wired as hooks and all reading the
|
|
379
|
+
store's index directly (see [hooks](../reference/hooks.md)):
|
|
380
|
+
|
|
381
|
+
- **At the point of reading.** When a `Read`, `Edit`, `Write` or `Grep` call, or a Bash `sed`,
|
|
382
|
+
`grep`, `rg` or `cat` line, names a file that decisions are anchored to, the `PreToolUse` hook
|
|
383
|
+
hands the agent the top decisions for that file in the same tool call, mistakes first. Each file
|
|
384
|
+
is delivered once per agent. `SIDEGRAPH_GREP_NUDGE=off` stops it.
|
|
385
|
+
- **In a subagent's brief.** On an `Agent` call, the hook reads the files the brief names, and
|
|
386
|
+
the files named in a plan or notes document it names, and appends the decisions anchored to them
|
|
387
|
+
to the brief. The subagent sees the block in its first message; the parent's transcript keeps
|
|
388
|
+
the prompt it wrote. `SIDEGRAPH_AGENT_BRIEF=off` stops it.
|
|
389
|
+
- **At the start of a subagent.** The `SubagentStart` hook tells the new subagent that decision
|
|
390
|
+
memory exists, how to ask it, and how many decisions, files and mistakes it holds. It carries no
|
|
391
|
+
records. `SIDEGRAPH_SUBAGENT_BRIEF=off` stops it.
|
|
392
|
+
|
|
393
|
+
The first two deliver decisions only: their index reader has no fact query, so facts reach an
|
|
394
|
+
agent through `get_task_context`. The first two are Claude Code only. `SubagentStart` runs on Claude Code and on Codex. The day to
|
|
395
|
+
day view is in [retrieval in sessions](../guides/retrieval-in-sessions.md#memory-without-asking).
|
|
357
396
|
|
|
358
397
|
## See also
|
|
359
398
|
|
|
@@ -207,8 +207,9 @@ The env vars are inlined into the command because Claude Code hook entries have
|
|
|
207
207
|
ids, and a line naming `get_task_context` for the rest. Each file arrives once per agent, at
|
|
208
208
|
most three files per call and ten per agent, and the session's own agent and every subagent it
|
|
209
209
|
starts count separately; a file with no records prints nothing. Bash is wired as four entries
|
|
210
|
-
(`if` is `Bash(sed *)`, `Bash(grep *)`, `Bash(rg *)`, `Bash(cat *)`) with the same command
|
|
211
|
-
|
|
210
|
+
(`if` is `Bash(sed *)`, `Bash(grep *)`, `Bash(rg *)`, `Bash(cat *)`) with the same command.
|
|
211
|
+
The `if` field exists from Claude Code 2.1.85, and matching on compound command lines is
|
|
212
|
+
correct from 2.1.89, so use 2.1.89 or later. Set `SIDEGRAPH_GREP_NUDGE=off` (alongside the
|
|
212
213
|
other env vars in the command) to turn off all of it. See
|
|
213
214
|
[`reference/hooks.md`](../reference/hooks.md#sidegraph-pre-tool-use).
|
|
214
215
|
- The `Agent|Task` group runs that same command when the agent spawns a subagent. It appends the
|
|
@@ -238,5 +239,17 @@ start (a stub if the store is empty — that's expected). Then follow the
|
|
|
238
239
|
|
|
239
240
|
## Reset / cleanup
|
|
240
241
|
|
|
241
|
-
|
|
242
|
-
|
|
242
|
+
The store is `.sidegraph/`; everything Graphify owns is `graphify-out/`. Delete both to
|
|
243
|
+
start over. Your source files are never touched. Sidegraph can also leave a few things
|
|
244
|
+
outside those two directories:
|
|
245
|
+
|
|
246
|
+
- If you installed the graph refresh hook (`sidegraph-init --hooks`, or a yes to its
|
|
247
|
+
question), run `sidegraph-init --remove-hooks` first. Deleting the directories does not
|
|
248
|
+
remove the helper and the three hook blocks in `.git/hooks/`.
|
|
249
|
+
- `sidegraph-init --no-hooks` records the git config key `sidegraph.graphRefresh`.
|
|
250
|
+
`--remove-hooks` clears it.
|
|
251
|
+
- `sidegraph-init` may have written `SIDEGRAPH_RATIFY_POLICY` into `.claude/settings.json`.
|
|
252
|
+
- The SessionStart hook keeps `${XDG_CACHE_HOME:-~/.cache}/sidegraph/launch-commit`, one
|
|
253
|
+
file shared by every project on the machine.
|
|
254
|
+
|
|
255
|
+
[SECURITY.md](../../SECURITY.md) lists every write.
|
|
@@ -15,15 +15,18 @@ and AGENTS.md registered separately, for fine control or a source checkout).
|
|
|
15
15
|
|
|
16
16
|
## Option A: plugin (recommended)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
From a terminal, in that repo:
|
|
19
19
|
|
|
20
20
|
The commands below follow the current development branch. For durable environments, see
|
|
21
21
|
[how to pin mutable development references](installation.md#mutable-development-references).
|
|
22
22
|
|
|
23
|
+
```bash
|
|
24
|
+
codex plugin marketplace add SantyagoSeaman/sidegraph
|
|
25
|
+
codex plugin add sidegraph@sidegraph
|
|
23
26
|
```
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
|
|
28
|
+
These are shell commands, not slash commands typed inside a Codex session. The marketplace
|
|
29
|
+
source takes `owner/repo[@ref]`, a local path or a Git URL.
|
|
27
30
|
|
|
28
31
|
Installs the MCP server, the `SessionStart`/`Stop`/`SubagentStart` hooks, and all 12 skills in one step,
|
|
29
32
|
pointed at `SIDEGRAPH_DIR=.sidegraph`/`SIDEGRAPH_GRAPH=graphify-out/graph.json` by default.
|
|
@@ -38,13 +38,20 @@ name, so `--from sidegraph` is required (a bare `uvx sidegraph-mcp` will not res
|
|
|
38
38
|
|
|
39
39
|
### Option B — host plugin (recommended for Claude Code and Codex)
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
In the repo you want memory over. In Claude Code, inside an interactive session:
|
|
42
42
|
|
|
43
43
|
```
|
|
44
44
|
/plugin marketplace add SantyagoSeaman/sidegraph
|
|
45
45
|
/plugin install sidegraph@sidegraph
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
In Codex, from a terminal:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
codex plugin marketplace add SantyagoSeaman/sidegraph
|
|
52
|
+
codex plugin add sidegraph@sidegraph
|
|
53
|
+
```
|
|
54
|
+
|
|
48
55
|
The Claude Code host installs the MCP server and all four hooks (`SessionStart`, `Stop`,
|
|
49
56
|
`PreToolUse`, `SubagentStart`). Codex installs the MCP server, `SessionStart`/`Stop`/
|
|
50
57
|
`SubagentStart`, and the bundled skills;
|
|
@@ -127,7 +134,7 @@ setup, scripted/CI use, and the two deliberately human-run jobs (`sidegraph-impo
|
|
|
127
134
|
| `sidegraph-pre-tool-use` | `PreToolUse` hook — hands the agent the records anchored to a file when it reads or edits it (`Read`, `Grep`, `Edit`, `Write`, and `sed`/`grep`/`rg`/`cat` in Bash). |
|
|
128
135
|
| `sidegraph-subagent-start` | `SubagentStart` hook — tells a starting subagent that decision memory exists and how to ask it. |
|
|
129
136
|
| `sidegraph-bootstrap` | Guided CLI — scan one of six supported ADR/spec profiles, preview and review candidates, write only after confirmation, verify anchors/host integration, and prove production retrieval. |
|
|
130
|
-
| `sidegraph-init` | CLI — bootstrap `.sidegraph/` in a repo: create the store, check for the graph, print the plugin install path (and the no-plugin `claude mcp add` alternative). |
|
|
137
|
+
| `sidegraph-init` | CLI — bootstrap `.sidegraph/` in a repo: create the store, check for the graph, ask (in a terminal) whether to install the git hook that keeps the graph fresh (`--hooks`, `--no-hooks`, `--remove-hooks`), print the plugin install path (and the no-plugin `claude mcp add` alternative). |
|
|
131
138
|
| `sidegraph-ratify` | CLI — review/accept/drop proposed decisions, facts, and domains. |
|
|
132
139
|
| `sidegraph-sync` | CLI — re-anchor the store after a Graphify rebuild. |
|
|
133
140
|
| `sidegraph-import` | CLI — bootstrap decisions from Graphify rationale nodes (code docstrings, or ADR/SAD prose after a semantic pass), or from existing ADR/spec markdown directly (`--docs`). |
|
|
@@ -17,18 +17,32 @@ sidegraph-init
|
|
|
17
17
|
it. `sidegraph-init` creates the repo-committed `.sidegraph/` record directories and a
|
|
18
18
|
gitignored derived `index.db`. Both commands are safe to run again.
|
|
19
19
|
|
|
20
|
+
In a terminal, `sidegraph-init` also asks whether to keep the code graph fresh. Yes installs a
|
|
21
|
+
helper and a marked block in the `post-commit`, `post-merge` and `post-checkout` git hooks, which
|
|
22
|
+
rebuild `graphify-out/graph.json` in the background. It never replaces a hook you already have.
|
|
23
|
+
`sidegraph-init --hooks` answers yes without asking, `--no-hooks` answers no and stops the
|
|
24
|
+
reminder, and `--remove-hooks` takes the hook out. Without a terminal it does not ask. See
|
|
25
|
+
[keeping the graph fresh](../integrations/graphify.md#keeping-the-graph-fresh-git-hooks).
|
|
26
|
+
|
|
20
27
|
If the repository already contains ADRs or supported flow specs, you can now switch to the
|
|
21
28
|
[preview-first bootstrap](bootstrap.md). Otherwise continue here.
|
|
22
29
|
|
|
23
30
|
## 2. Connect your host
|
|
24
31
|
|
|
25
|
-
The plugin is the recommended route for both Claude Code and Codex:
|
|
32
|
+
The plugin is the recommended route for both Claude Code and Codex. In Claude Code:
|
|
26
33
|
|
|
27
34
|
```text
|
|
28
35
|
/plugin marketplace add SantyagoSeaman/sidegraph
|
|
29
36
|
/plugin install sidegraph@sidegraph
|
|
30
37
|
```
|
|
31
38
|
|
|
39
|
+
In Codex, from a terminal:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
codex plugin marketplace add SantyagoSeaman/sidegraph
|
|
43
|
+
codex plugin add sidegraph@sidegraph
|
|
44
|
+
```
|
|
45
|
+
|
|
32
46
|
Start a new interactive session in the repository and approve the hook trust prompt. For a
|
|
33
47
|
manual or source-checkout setup, use the host-specific page:
|
|
34
48
|
[Claude Code](claude-code-setup.md) or [Codex](codex-setup.md).
|
|
@@ -71,8 +85,11 @@ git status --short
|
|
|
71
85
|
sidegraph-verify
|
|
72
86
|
```
|
|
73
87
|
|
|
74
|
-
Commit `.sidegraph
|
|
75
|
-
|
|
88
|
+
Commit the whole `.sidegraph/` directory (`git add .sidegraph`). Its own `.gitignore` already
|
|
89
|
+
leaves out `index.db` (the derived index, with its SQLite sidecar files) and `*.tmp` files, so what
|
|
90
|
+
gets staged is what should travel: the `format` marker, `stamping_live_since`, `.gitignore` and the
|
|
91
|
+
record directories. A store file left uncommitted for a day is reported by
|
|
92
|
+
[`store-uncommitted`](../guides/troubleshooting.md#store-uncommitted).
|
|
76
93
|
|
|
77
94
|
The loop is now working. Next, run the short
|
|
78
95
|
[verification checklist](../guides/verifying-your-setup.md), then
|
|
@@ -103,9 +103,11 @@ guide is the checklist for.
|
|
|
103
103
|
|
|
104
104
|
## 2. The automated path: Stop hook → distill → propose → ratify
|
|
105
105
|
|
|
106
|
-
At the end of a session, the `Stop` hook fires a
|
|
106
|
+
At the end of a session, the `Stop` hook fires a nudge (see
|
|
107
107
|
[`reference/hooks.md`](../reference/hooks.md)) asking the agent to review the session for
|
|
108
|
-
anything durable. The
|
|
108
|
+
anything durable. The first nudge comes once the session looks substantial. A session that
|
|
109
|
+
keeps working is nudged again, but only after at least 30 minutes and 10 new commits since the
|
|
110
|
+
last nudge ([re-arm](../reference/hooks.md#re-arm-after-more-work)). The agent — not a separate LLM call, the same in-session agent — distills
|
|
109
111
|
what happened into one or more **What / Why / Where / Learned** drafts and calls
|
|
110
112
|
`propose_decisions(drafts=[...])`.
|
|
111
113
|
|
|
@@ -134,9 +136,9 @@ The write pipeline (`src/sidegraph/capture.py`) is deterministic — no LLM key
|
|
|
134
136
|
4. **Anchor** best-effort via the same multi-anchor resolution as `add_decision` (orphaned
|
|
135
137
|
leaf if no graph is present).
|
|
136
138
|
|
|
137
|
-
Proposed decisions are **not silently invisible**: they do surface in `get_task_context
|
|
138
|
-
|
|
139
|
-
draft hasn't been reviewed yet (see
|
|
139
|
+
Proposed decisions are **not silently invisible**: they do surface in `get_task_context`,
|
|
140
|
+
where every rendered line is tagged `[unratified]`, and in `retrieve_decisions`, where every
|
|
141
|
+
record carries its `status`, so you always know a draft hasn't been reviewed yet (see
|
|
140
142
|
[`guides/retrieval-in-sessions.md`](retrieval-in-sessions.md)). Ratification is what removes
|
|
141
143
|
that tag, not what makes the record appear.
|
|
142
144
|
|
|
@@ -148,8 +150,8 @@ Ratify without leaving the session. `SessionStart` tells you when something is w
|
|
|
148
150
|
is two MCP tools: `list_proposed()` (human-readable render of everything pending) and
|
|
149
151
|
`ratify(accept=[...], drop=[...])` — the unified tool that ratifies decisions *and* domains
|
|
150
152
|
through one gate (see [mind model](../concepts/mind-model.md#domain-lifecycle)).
|
|
151
|
-
`ratify_decisions(accept=[...], drop=[...])` still works but is a **deprecated alias
|
|
152
|
-
|
|
153
|
+
`ratify_decisions(accept=[...], drop=[...])` still works but is a **deprecated alias** (since
|
|
154
|
+
0.1.0, still kept) for existing callers only — prefer `ratify` in new code.
|
|
153
155
|
|
|
154
156
|
- **Accept** flips `proposed → accepted`. The record now reads untagged everywhere.
|
|
155
157
|
- **Drop** is append-only, like everything else in the store: it sets `valid_to` and flips
|