Skip to content

Feat/auto extracted edges#246

Merged
plind-junior merged 1 commit into
vouchdev:testfrom
claytonlin1110:feat/auto-extracted-edges
Jun 17, 2026
Merged

Feat/auto extracted edges#246
plind-junior merged 1 commit into
vouchdev:testfrom
claytonlin1110:feat/auto-extracted-edges

Conversation

@claytonlin1110

Copy link
Copy Markdown
Contributor

What changed

Approving a page now files relation proposals for the edges implied by its content: mentions for every [[wiki-link]] in the body, relates_to for the page's entities frontmatter, and derived_from for its sources frontmatter. Each is filed via the normal propose_relation path with proposed_by: vouch-extractor, so it lands in proposed/ and needs a reviewer's approve/reject like any hand-filed edge. Adds vouch reject-extracted [--page <id>] (+ MCP kb_reject_extracted / JSONL kb.reject_extracted) to mass-reject pending auto-extracted edges, scoped by proposed_by so it never touches a manually proposed relation.

Why

Closes #224. The Relation model exists but the graph is hand-populated; approved pages already carry wiki-links and structured entities/sources lists that imply edges nobody files. gbrain's writeup cites a measurable retrieval win (+31.4 P@5) from doing this automatically with zero LLM calls — this is the same write-time pass, scoped to vouch's existing fields.

What might break

  • New RelationType members mentions and relates_to (object model addition, additive/non-breaking for existing data).
  • New kb.reject_extracted method (additive; existing kb.* callers unaffected).
  • No on-disk layout change, no field shape change on existing artifacts.
  • A dangling [[wiki-link]] (target that doesn't resolve to a claim/page/entity/source) is silently skipped rather than erroring — extraction is best-effort and must never block the page approval that triggered it.

VEP

None filed yet. This touches the object model (RelationType additions) and the kb.* method surface (kb.reject_extracted), both of which proposals/README.md says need an accepted VEP before implementation. Flagging for maintainer input — happy to split a VEP out first if that's the right order here.

Tests

  • make check passes locally (ruff clean, mypy clean except a pre-existing unrelated jinja2 stub gap behind the [web] extra; full pytest pass except 4 pre-existing Windows-only failures — path-separator and symlink-privilege issues unrelated to this change)
  • New behaviour has tests (tests/test_extractors_edges.py: wiki-link extraction/dedup, mentions/relates_to/derived_from edge filing, dangling-link skip, no-links no-op, bulk reject scoping)
  • CHANGELOG.md updated under ## [Unreleased]

approving a page now files relation proposals for its `[[wiki-links]]`
(mentions), `entities` frontmatter (relates_to), and `sources`
frontmatter (derived_from), tagged proposed_by: vouch-extractor.
extraction calls back into propose_relation -- same review gate,
endpoint validation, and audit trail as a hand-filed edge -- so a
dangling wiki-link is skipped rather than blocking the page approval
that triggered it.

adds `vouch reject-extracted [--page <id>]` (+ mcp/jsonl equivalents)
to mass-reject pending auto-extracted edges, scoped by proposed_by so
it never touches a manually proposed relation.

closes vouchdev#224
@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@claytonlin1110, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 10 minutes and 40 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 7597b1bf-5afb-4f4b-8483-eeda31b76033

📥 Commits

Reviewing files that changed from the base of the PR and between 3beb821 and 0861f0e.

📒 Files selected for processing (144)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • AGENTS.md
  • CHANGELOG.md
  • CLAUDE.md
  • CONTRIBUTING.md
  • README.md
  • ROADMAP.md
  • adapters/claude-code/.claude/commands/vouch-propose-from-pr.md
  • adapters/claude-code/.claude/commands/vouch-recall.md
  • adapters/claude-code/.claude/commands/vouch-resolve-issue.md
  • adapters/claude-code/.claude/commands/vouch-status.md
  • adapters/claude-code/.claude/settings.json
  • adapters/claude-code/install.yaml
  • adapters/claude-desktop/README.md
  • adapters/claude-desktop/README.snippet.md
  • adapters/claude-desktop/claude_desktop_config.json
  • adapters/claude-desktop/install.yaml
  • adapters/cline/README.md
  • adapters/cline/cline_mcp_servers.json
  • adapters/cline/install.yaml
  • adapters/cline/vscode_settings.json
  • adapters/codex/install.yaml
  • adapters/continue/install.yaml
  • adapters/cursor/AGENTS.md.snippet
  • adapters/cursor/install.yaml
  • adapters/http-tunnel/Dockerfile
  • adapters/http-tunnel/README.md
  • adapters/http-tunnel/cloudflare-tunnel/compose.yml
  • adapters/http-tunnel/fly.toml
  • adapters/windsurf/README.md
  • adapters/windsurf/install.yaml
  • adapters/windsurf/mcp_config.json
  • adapters/zed/README.md
  • adapters/zed/install.yaml
  • adapters/zed/settings.json
  • benchmarks/bench_bundle.py
  • benchmarks/bench_index_rebuild.py
  • benchmarks/bench_propose.py
  • benchmarks/bench_search.py
  • benchmarks/conftest.py
  • docs/README.md
  • docs/gittensor.md
  • docs/metrics.md
  • docs/migrations.md
  • docs/multi-agent.md
  • docs/provenance.md
  • docs/review-ui.md
  • docs/superpowers/plans/2026-05-27-claude-code-adapter.md
  • docs/superpowers/specs/2026-05-25-vouch-diff-design.md
  • llms.txt
  • migrations/README.md
  • openclaw.plugin.json
  • proposals/README.md
  • proposals/VEP-0004-http-transport.md
  • proposals/VEP-0005-richer-scopes.md
  • pyproject.toml
  • schemas/capabilities.schema.json
  • schemas/claim.schema.json
  • schemas/source.schema.json
  • skills/pr-precheck/SKILL.md
  • spec/transports.md
  • src/vouch/__init__.py
  • src/vouch/bundle.py
  • src/vouch/capabilities.py
  • src/vouch/cli.py
  • src/vouch/context.py
  • src/vouch/diff.py
  • src/vouch/embeddings/similarity.py
  • src/vouch/extractors/__init__.py
  • src/vouch/extractors/edges.py
  • src/vouch/health.py
  • src/vouch/http_server.py
  • src/vouch/index_db.py
  • src/vouch/install_adapter.py
  • src/vouch/jsonl_server.py
  • src/vouch/logging_config.py
  • src/vouch/metrics.py
  • src/vouch/migrations/__init__.py
  • src/vouch/migrations/_legacy.py
  • src/vouch/migrations/journal.py
  • src/vouch/migrations/manifest.py
  • src/vouch/migrations/rewriter.py
  • src/vouch/migrations/runner.py
  • src/vouch/migrations/schema.py
  • src/vouch/migrations/semver.py
  • src/vouch/models.py
  • src/vouch/onboarding.py
  • src/vouch/pr_cache.py
  • src/vouch/proposals.py
  • src/vouch/provenance/__init__.py
  • src/vouch/provenance/cache.py
  • src/vouch/provenance/graph.py
  • src/vouch/provenance/model.py
  • src/vouch/provenance/query.py
  • src/vouch/scoping.py
  • src/vouch/server.py
  • src/vouch/sessions.py
  • src/vouch/stats.py
  • src/vouch/storage.py
  • src/vouch/sync.py
  • src/vouch/vault_sync.py
  • src/vouch/web/__init__.py
  • src/vouch/web/server.py
  • src/vouch/web/static/app.css
  • src/vouch/web/static/app.js
  • src/vouch/web/templates/audit.html
  • src/vouch/web/templates/base.html
  • src/vouch/web/templates/claim.html
  • src/vouch/web/templates/queue.html
  • src/vouch/web/templates/session.html
  • src/vouch/web/templates/source.html
  • templates/config.template.yaml
  • tests/embeddings/test_search.py
  • tests/fixtures/migrations/0099-test-rename.yaml
  • tests/test_bundle.py
  • tests/test_cli.py
  • tests/test_context.py
  • tests/test_diff.py
  • tests/test_expire.py
  • tests/test_extractors_edges.py
  • tests/test_health.py
  • tests/test_http_server.py
  • tests/test_http_server_mcp.py
  • tests/test_install_adapter.py
  • tests/test_jsonl_server.py
  • tests/test_logging.py
  • tests/test_logging_config.py
  • tests/test_metrics.py
  • tests/test_migrations.py
  • tests/test_pr_cache.py
  • tests/test_propose_similarity.py
  • tests/test_provenance.py
  • tests/test_retrieval_backend.py
  • tests/test_schema_migrations.py
  • tests/test_scoping.py
  • tests/test_sessions.py
  • tests/test_stats.py
  • tests/test_storage.py
  • tests/test_sync.py
  • tests/test_vault_sync.py
  • tests/test_web.py
  • tests/test_web_e2e.py
  • web/index.html
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claytonlin1110 claytonlin1110 changed the base branch from main to test June 17, 2026 03:42
@plind-junior plind-junior merged commit e97a6f0 into vouchdev:test Jun 17, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: auto-extracted typed edges on every approved page

2 participants