feat(ruflo-goals): dossier-investigator agent + dossier-collect skill (ADR-099) (#1726)

* feat(plugins): ruflo-goals/dossier-investigator agent + dossier-collect skill

New entry-point added during the autonomous loop session — dossier
investigator agent and supporting skill that traverses RuVector memory
for recursive parallel research.

  plugins/ruflo-goals/agents/dossier-investigator.md (new)
  plugins/ruflo-goals/skills/dossier-collect/ (new)
  plugins/ruflo-goals/README.md (registry update)
  plugins/ruflo-goals/.claude-plugin/plugin.json (version bump)

Excluded per CLAUDE.md rules:
  - v3/goal_ui/.env.production (NEVER commit .env)
  - .claude/scheduled_tasks.lock (runtime artifact)

* docs: include v3/docs/examples/ on dossier branch (carried from fix/issues-may-1-3)

* docs(examples): add 3 dossier examples (ruvnet, ADR-088, ruflo-goals)

Real outputs from running dossier-collect skill against three seed types:
- ruvnet/: username seed, GitHub gh-api fan-out + WebSearch
- adr-088/: adr-id seed, Read + Glob + Grep + git-log fan-out
- ruflo-goals/: concept seed, plugin tree introspection

Each example ships markdown + JSON. Validates ADR-099 end-to-end.

Co-Authored-By: RuFlo <ruv@ruv.net>

---------

Co-authored-by: Reuven <cohen@ruv-mac-mini.local>
This commit is contained in:
rUvandReuven authored and GitHub committed 2026-05-03 23:15:22 -04:00
1 parent 43c8fd7948
commit 1e11ac84ed
12 files changed
+741 -3

No files matched your search

@@ -1,7 +1,7 @@
{
"name": "ruflo-goals",
"description": "Long-horizon goal planning, deep research orchestration, and adaptive replanning using GOAP algorithms",
"version": "0.1.0",
"version": "0.2.0",
"author": {
"name": "ruvnet",
"url": "https://github.com/ruvnet"
@@ -15,6 +15,9 @@
"research",
"planning",
"deep-research",
"long-horizon"
"long-horizon",
"dossier",
"investigation",
"osint"
]
}
+13 -1
View File
@@ -15,6 +15,7 @@ Long-horizon goal planning, deep research orchestration, and adaptive replanning
- **Deep research**: Multi-source research orchestration (web, memory, codebase, patterns)
- **Horizon tracking**: Persistent objectives across sessions with milestone checkpoints
- **Research synthesis**: Evidence-graded reports with contradiction resolution
- **Dossier investigation**: Recursive parallel fan-out across all ruflo sources for seed-driven investigation (ADR-099)
## Commands
@@ -26,9 +27,20 @@ Long-horizon goal planning, deep research orchestration, and adaptive replanning
- `goal-plan` -- Create and execute GOAP action plans
- `horizon-track` -- Track objectives across sessions with drift detection
- `research-synthesize` -- Synthesize findings into structured reports
- `dossier-collect` -- Recursive parallel investigation building a graph-structured dossier on a seed entity
## Agents
- `goal-planner` -- GOAP specialist with A* planning and trajectory learning
- `deep-researcher` -- Multi-source research with evidence grading
- `deep-researcher` -- Multi-source research with evidence grading (linear, question-driven)
- `horizon-tracker` -- Cross-session objective tracking with drift detection
- `dossier-investigator` -- Recursive parallel multi-source investigator (seed-driven, graph output)
## Selection guide
| You have | Use |
|---|---|
| A question | `deep-researcher` / `deep-research` |
| A seed entity to expand outward | `dossier-investigator` / `dossier-collect` |
| A multi-step objective | `goal-planner` / `goal-plan` |
| A long-running objective | `horizon-tracker` / `horizon-track` |
@@ -0,0 +1,68 @@
---
name: dossier-investigator
description: Recursive parallel multi-source investigator that fans out across web, memory, knowledge-graph, codebase, and ADR index to build a graph-structured dossier on a seed entity, with budget caps, de-duplication, and provenance per claim
model: sonnet
---
You are a recursive parallel multi-source investigator. Given a seed entity, you fan out across every applicable ruflo data source in parallel, then expand recursively from the entities you discover until a depth or budget cap is reached. You produce a dossier — a graph of entities, edges that record which source proved each connection, and a markdown report.
Inspired by the maigret pattern (parallel fan-out + recursive expansion + structured dossier), adapted to development research using ruflo-native tools.
## Inputs
- `seed` (required) — the starting entity. Type-detect: file path, code symbol, username/handle, URL, ADR-id, or free-text concept.
- `sources` (optional) — subset of available sources; defaults to all applicable for the detected type.
- `maxDepth` (default 2) — recursion depth from seed.
- `maxBreadth` (default 8) — max new entities pursued per round per source.
- `budget` (optional) — `{ tokens?, usd? }`; abort cleanly when hit.
- `exact` (default false) — disable embedding-similarity dedup; useful for entity-identity-sensitive runs.
## Source matrix (pick by seed type)
| Source | Tool | Best for |
|---|---|---|
| Hybrid memory | `mcp__claude-flow__memory_search_unified` | Any concept |
| Pattern store | `mcp__claude-flow__agentdb_pattern-search` | Repeated patterns |
| Hierarchical recall | `mcp__claude-flow__agentdb_hierarchical-recall` | Layered context |
| Vector (HNSW) | `mcp__claude-flow__embeddings_search` | Semantic neighbors |
| Knowledge graph | `mcp__claude-flow__hooks_intelligence_pattern-search` + `kg-traverse` | Entity edges |
| Web search | `WebSearch` | Usernames, URLs, current state |
| Web fetch | `WebFetch` | Profile pages, READMEs |
| Codebase | `Grep`, `Glob`, `Read` | Symbols, file paths |
| ADR index | `mcp__claude-flow__memory_search` namespace `adr` | ADR-ids, design decisions |
| Git intel | `Bash` (`git log`, `git blame`) | Authors, file history |
## Loop
```
seed → [round 0: parallel fan-out across sources]
→ [extract entities from each hit]
→ [dedup against dossier; embedding-sim threshold 0.92 unless --exact]
→ [round 1: re-seed with new entities, fan out again]
→ ... until depth ≥ maxDepth OR budget exhausted
→ [aggregate into graph + render markdown + emit JSON]
```
Within each round, batch ALL source queries in ONE message — never serialize what can run in parallel.
## Output
Three artifacts, all written under `v3/docs/examples/dossiers/<seed-slug>/` unless caller overrides:
- `<slug>.md` — human-readable dossier (executive summary, entity table, graph in mermaid, source provenance per claim).
- `<slug>.json` — machine-readable graph: `{ seed, depth, nodes: [{id, type, attrs, sources}], edges: [{from, to, kind, source, confidence}] }`.
- Memory write to namespace `dossier`, key = `<slug>`.
## Discipline
- **Honor the budget**: if `budget.tokens` or `budget.usd` is set, abort cleanly and emit a partial dossier marked `truncated: true`. Never silently overrun.
- **Provenance per claim**: every node and edge carries which source produced it. No claims without sources.
- **De-dup, don't merge**: when two sources name the same entity, link both as separate sources on one node; don't fabricate a synthesis claim.
- **Recursive expansion is breadth-first**: complete round *k* before scheduling round *k+1*. Avoids cost blowup from depth-first runaway.
- **Trajectory recording**: call `mcp__claude-flow__hooks_intelligence_trajectory-start` at begin, `_step` per round, `_end` at completion.
## When to NOT use this agent
- You have a question, not a seed → use `deep-researcher` (linear, evidence-graded).
- The objective is multi-step planning, not enumeration → use `goal-planner`.
- You're tracking progress over weeks → use `horizon-tracker`.
@@ -0,0 +1,70 @@
---
name: dossier-collect
description: Build a graph-structured dossier on a seed entity via parallel fan-out + recursive expansion across web, memory, knowledge-graph, codebase, ADR index, and git intel
argument-hint: "<seed> [--max-depth N] [--max-breadth N] [--sources s1,s2] [--budget-usd N] [--exact]"
allowed-tools: mcp__claude-flow__memory_store mcp__claude-flow__memory_search mcp__claude-flow__memory_search_unified mcp__claude-flow__agentdb_pattern-search mcp__claude-flow__agentdb_pattern-store mcp__claude-flow__agentdb_hierarchical-recall mcp__claude-flow__embeddings_search mcp__claude-flow__hooks_intelligence_pattern-search mcp__claude-flow__hooks_intelligence_pattern-store mcp__claude-flow__hooks_intelligence_trajectory-start mcp__claude-flow__hooks_intelligence_trajectory-step mcp__claude-flow__hooks_intelligence_trajectory-end mcp__claude-flow__task_create Bash WebSearch WebFetch Read Write Grep Glob
---
# Dossier Collect
Recursive parallel investigation that builds a graph-structured dossier on a seed entity.
## When to use
You have a seed (a username, file, symbol, ADR-id, URL, or concept) and want to **expand outward** discovering every connected entity, with provenance per claim — rather than answering a specific question.
For specific questions use `deep-research`. For multi-step plans use `goal-plan`.
## Steps
1. **Detect seed type** — classify as one of: `username` (handle), `file` (path), `symbol` (code identifier), `adr` (ADR-NNN), `url`, or `concept` (free text).
2. **Pick sources** — match the source matrix to the seed type. Default: all applicable.
3. **Start trajectory** — call `mcp__claude-flow__hooks_intelligence_trajectory-start` with task `dossier:<slug>`.
4. **Round 0 fan-out** — issue ALL source queries in ONE message. Examples:
- For `username`: `WebSearch`, `WebFetch` on github.com/<user>, `mcp__claude-flow__memory_search_unified`
- For `adr`: `Read` ADR file, `Grep` references, `mcp__claude-flow__memory_search` namespace `adr`
- For `symbol`: `Grep`, `Glob`, `mcp__claude-flow__embeddings_search`
5. **Extract entities** — from each hit, surface entities (people, repos, files, adrs, urls, terms). Lightweight regex + heuristics; no LLM extraction unless ambiguous.
6. **De-dup** — drop entities already in the dossier. If `--exact` is unset, also drop entities whose embedding cosine similarity ≥ 0.92 to an existing node.
7. **Round k recursion** — for each new entity (capped at `--max-breadth` per source), recurse to step 4 until depth ≥ `--max-depth` OR budget exhausted.
8. **Aggregate** — build `{ nodes, edges }` graph. Each node carries `{ id, type, attrs, sources: [...] }`. Each edge carries `{ from, to, kind, source, confidence }`.
9. **Render artifacts**:
- `<slug>.md` — executive summary, entity table, mermaid graph, source-provenance footnotes
- `<slug>.json` — machine-readable graph
- Default location: `v3/docs/examples/dossiers/<slug>/`
10. **Persist** — `mcp__claude-flow__memory_store` namespace `dossier` key `<slug>`.
11. **End trajectory** — `mcp__claude-flow__hooks_intelligence_trajectory-end` with success status.
## Output schema (JSON)
```json
{
"seed": "ruvnet",
"seedType": "username",
"depth": 2,
"truncated": false,
"generatedAt": "ISO-8601",
"nodes": [
{ "id": "ruvnet", "type": "username", "attrs": { "...": "..." }, "sources": ["WebSearch", "github.com"] }
],
"edges": [
{ "from": "ruvnet", "to": "ruflo", "kind": "owns", "source": "github.com", "confidence": "high" }
],
"stats": { "nodesByType": {}, "sourcesUsed": [], "tokensSpent": 0 }
}
```
## Budget discipline
- If `--budget-usd` is set, track approximate cost via trajectory. On exhaustion: emit partial dossier with `truncated: true` and the entities still queued.
- BFS expansion only — finish round *k* before round *k+1*.
- Never silently truncate. Always mark and record what was skipped.
## Examples
```
/ruflo-goals:dossier-collect ruvnet
/ruflo-goals:dossier-collect ADR-097 --max-depth 1
/ruflo-goals:dossier-collect "src/memory/hnsw.ts" --sources codebase,git,memory
/ruflo-goals:dossier-collect "ruflo-goals" --max-breadth 5 --budget-usd 1
```
@@ -0,0 +1,129 @@
# ADR-099: Dossier-Investigator — Recursive Parallel Multi-Source Research for `ruflo-goals`
**Status**: Proposed
**Date**: 2026-05-03
**Version**: target v3.6.x (additive — `plugins/ruflo-goals` minor bump)
**Supersedes**: nothing
**Related**: ADR-098 (plugin capability sync), `plugins/ruflo-goals/agents/deep-researcher.md`, `plugins/ruflo-knowledge-graph`, `plugins/ruflo-rag-memory`
## Context
The `ruflo-goals` plugin currently ships three agents:
| Agent | Pattern | Output |
|---|---|---|
| `goal-planner` | GOAP / A* over state space | Action plan |
| `deep-researcher` | Linear multi-source synthesis with evidence grading | Graded findings document |
| `horizon-tracker` | Long-horizon objective tracking with drift detection | Milestone state |
Inspired by [maigret](https://github.com/soxoj/maigret) (3,000+ source parallel username enumeration with recursive expansion and structured dossier reporting), we identified a structurally distinct research pattern that none of the three existing agents implements as a first-class loop:
1. **Massively parallel breadth fan-out** — query N sources concurrently for a seed entity rather than sequentially.
2. **Recursive expansion** — entities discovered in round *k* become seeds for round *k+1*, bounded by a depth/budget cap.
3. **Structured dossier output** — graph + markdown + JSON, with provenance per claim, suitable for export.
`deep-researcher` does evidence-graded synthesis but expects a human-curated source list and runs essentially linearly. It has no recursive seeding loop and no parallel fan-out primitive.
Ruflo already ships every primitive needed to assemble a maigret-style investigator without adding new external dependencies:
| Capability | Existing tool |
|---|---|
| Hybrid sparse+dense semantic search | `mcp__claude-flow__memory_search_unified`, `ruflo-rag-memory:memory-search` |
| Vector search (HNSW, RaBitQ) | `mcp__claude-flow__embeddings_search`, `embeddings_rabitq_search` |
| Pattern recall | `mcp__claude-flow__agentdb_pattern-search`, `agentdb_hierarchical-recall` |
| Knowledge-graph traversal + extraction | `ruflo-knowledge-graph:kg-traverse`, `kg-extract` |
| Web search & fetch | `WebSearch`, `WebFetch` |
| Codebase queries | `Grep`, `Glob`, `Read` |
| ADR index lookup | `ruflo-adr:adr-index` |
| Git intelligence | `ruflo-jujutsu:diff-analyze` |
| Parallel agent fan-out | `ruflo-swarm:swarm-init` (mesh topology) |
| Trajectory recording | `mcp__claude-flow__hooks_intelligence_trajectory-*` |
## Decision
Add a new agent `dossier-investigator` and a companion skill `dossier-collect` to `plugins/ruflo-goals`.
### Agent: `dossier-investigator`
- **Model**: `sonnet` (matches sibling agents; structured orchestration, not creative writing)
- **Role**: Orchestrate parallel + recursive multi-source intelligence gathering on a seed entity, producing a graph-structured dossier with provenance.
- **Inputs**: `{ seed: string, sources?: string[], maxDepth?: number=2, maxBreadth?: number=8, budget?: { tokens?, usd? } }`
- **Outputs**: `dossier` namespace memory entry + markdown report + optional `kg-extract` ingest.
### Skill: `dossier-collect`
User-facing slash skill that drives the agent. Steps:
1. **Seed validation** — normalize seed (entity type detection: file path / symbol / username / URL / ADR-id / concept).
2. **Source plan** — pick which of the available tools apply to the seed type; user can override via `--sources`.
3. **Round 0 fan-out** — issue all source queries in parallel via a single batched message (one Task call per source where useful, otherwise direct MCP calls).
4. **Entity extraction** — for each hit, run `ruflo-knowledge-graph:kg-extract` (or a lightweight regex pass for obvious cases) to surface new entities.
5. **Recursive expansion** — for each new entity not already in the dossier, schedule round *k+1* until `maxDepth` or `budget` is hit. Apply de-duplication via embedding similarity (threshold 0.92).
6. **Aggregation** — collapse hits into a graph: nodes = entities, edges = "discovered-via" with source provenance.
7. **Reporting** — render markdown + JSON; optionally export to KG via `kg-extract` ingest.
8. **Persist** — store in `dossier` namespace and record trajectory.
### Rejected alternatives
| Option | Why rejected |
|---|---|
| **Extend `deep-researcher`** | Would couple two structurally different loops (linear-graded vs parallel-recursive) into one prompt; would push the prompt past the 80-line guideline flagged in ADR-098. |
| **Bundle Python `maigret` as an MCP wrapper** | Adds a Python runtime dependency, network egress to 3,000+ sites, and a privacy/abuse posture that's out of scope for a developer-research tool. We want maigret's *pattern*, not its target list. |
| **Build into `ruflo-knowledge-graph`** | KG plugin is about graph operations on already-extracted data; investigator is about *acquisition*. Keeping it in `ruflo-goals` puts it next to its peers (`deep-researcher`, `goal-planner`). |
### Tradeoff: ~40% overlap with `deep-researcher`
`deep-researcher` and `dossier-investigator` will share the "query memory + KG + web" surface area. We accept this redundancy because:
- The loops are different (linear evidence-grading vs parallel-recursive expansion).
- Output formats differ (synthesis document vs entity graph + dossier).
- Selection is unambiguous: use `deep-researcher` when you have a question; use `dossier-investigator` when you have a seed and want to expand outward.
If the overlap proves excessive after first usage, we can refactor a shared `multi-source-query` helper (skill-level, not agent-level) without breaking either agent's interface.
## Consequences
### Positive
- Fills a real gap (recursive parallel investigation) without external deps.
- Reuses the full ruflo tool surface — no new MCP servers.
- Unblocks a class of tasks (`investigate this symbol / module / dependency / ADR`) that today require manual fan-out.
- Trajectory recording feeds the SONA pattern store, so future investigations get faster routing.
### Negative
- Plugin agent count goes 3 → 4. ADR-098 flagged token-cost as a watch item; we'll keep this agent prompt under 80 lines.
- Recursive expansion can blow up cost without a hard budget. The agent MUST honor `budget.tokens` and `budget.usd` and abort cleanly when hit, not silently truncate.
- De-duplication via embedding similarity has false positives; we need an `--exact` mode for entity-identity-sensitive runs.
### Neutral
- No CLI surface change (`/ruflo-goals:dossier-collect` is the only new entry point).
- No persistence schema change — uses existing `dossier` namespace under AgentDB memory.
## Implementation plan
| Step | File | Owner |
|---|---|---|
| 1. Agent prompt | `plugins/ruflo-goals/agents/dossier-investigator.md` | coder |
| 2. Skill markdown | `plugins/ruflo-goals/skills/dossier-collect/SKILL.md` | coder |
| 3. Slash command | `plugins/ruflo-goals/commands/goals.md` (add `dossier` subcommand) | coder |
| 4. Plugin manifest bump | `plugins/ruflo-goals/.claude-plugin/plugin.json` (0.1.0 → 0.2.0) | coder |
| 5. README update | `plugins/ruflo-goals/README.md` | coder |
| 6. Smoke test | `tests/plugins/ruflo-goals/dossier.spec.ts` | tester |
| 7. Ship behind a flag | `dossierInvestigator.enabled` defaulting `true` for first release | coder |
Acceptance criteria:
- Agent prompt ≤ 80 lines (per ADR-098 guidance).
- Skill correctly fans out, expands recursively, and respects `--max-depth` and `--budget`.
- Output written to `dossier` namespace with valid JSON schema.
- One end-to-end test: seed = `ADR-097`, expected entities include `federation`, `circuit-breaker`, `budget`.
- Trajectory recorded; pattern stored on success.
## References
- maigret — https://github.com/soxoj/maigret (recursive-parallel pattern reference, not a runtime dep)
- `plugins/ruflo-goals/agents/deep-researcher.md` (sibling agent)
- ADR-098 (plugin token-cost guidelines)
- ADR-026 (3-tier model routing — sonnet justified for orchestration)
+30
View File
@@ -0,0 +1,30 @@
# Dossier Examples
Example outputs from the `ruflo-goals` plugin's `dossier-collect` skill (ADR-099). Each subdirectory contains:
- `<slug>.md` — human-readable dossier with executive summary, entity table, mermaid graph, and source provenance
- `<slug>.json` — machine-readable graph (nodes + edges + stats)
These are real outputs generated by running the dossier-collect skill against three different seed types:
| Example | Seed | Seed Type | Sources Used |
|---|---|---|---|
| [ruvnet/](./ruvnet/) | `ruvnet` (rUv) | username | gh API, WebSearch, profile fetch |
| [adr-088/](./adr-088/) | `ADR-088` | adr-id | Read, Grep, git log, codebase |
| [ruflo-goals/](./ruflo-goals/) | `ruflo-goals` | concept (plugin) | Glob, Read, Grep |
## How to generate your own
```
/ruflo-goals:dossier-collect <seed> [--max-depth N] [--max-breadth N] [--budget-usd N]
```
The skill writes results to `v3/docs/examples/dossiers/<slug>/` by default. Override with the `--out` flag.
## Reading a dossier
1. **Executive summary** — what we found at a glance
2. **Entity table** — every node with its type and source attribution
3. **Mermaid graph** — visual relationships (paste into any mermaid renderer)
4. **Provenance footnotes** — which tool produced each claim
5. **JSON** — for tooling that wants to consume the graph programmatically
@@ -0,0 +1,45 @@
{
"seed": "ADR-088",
"seedType": "adr",
"depth": 2,
"truncated": false,
"generatedAt": "2026-05-03T00:00:00Z",
"nodes": [
{ "id": "ADR-088", "type": "adr", "attrs": { "title": "LongMemEval Benchmark for AgentDB Memory System", "status": "Accepted", "date": "2026-04-08" }, "sources": ["Read"] },
{ "id": "LongMemEval", "type": "benchmark", "attrs": { "venue": "ICLR 2025", "questions": 500, "questionTypes": 6 }, "sources": ["Read:adr-088"] },
{ "id": "MemPalace", "type": "external-system", "attrs": { "rawScore": 0.966, "hybridScore": 1.0 }, "sources": ["Read:adr-088"] },
{ "id": "AgentDB", "type": "system", "attrs": { "role": "ruflo-memory-backend" }, "sources": ["Read:adr-088", "Glob:codebase"] },
{ "id": "harness.ts", "type": "file", "attrs": { "path": "v3/@claude-flow/memory/benchmarks/longmemeval/harness.ts" }, "sources": ["Glob"] },
{ "id": "agentdb-adapter.ts", "type": "file", "attrs": { "path": "v3/@claude-flow/memory/benchmarks/longmemeval/adapters/agentdb-adapter.ts" }, "sources": ["Glob"] },
{ "id": "BM25+RRF", "type": "technique", "attrs": { "currentScore": "C@1=0.268, MRR=0.3269" }, "sources": ["git-log:b6ca2dd5d"] },
{ "id": "MiniLM", "type": "model", "attrs": { "role": "dense-embeddings" }, "sources": ["git-log:afc75cc71"] },
{ "id": "ADR-076", "type": "adr", "attrs": { "title": "Memory Bridge" }, "sources": ["Read:adr-088:relates-to"] },
{ "id": "ADR-077", "type": "adr", "attrs": { "title": "DiskANN" }, "sources": ["Read:adr-088:relates-to"] },
{ "id": "ADR-075", "type": "adr", "attrs": { "title": "Learning Pipeline" }, "sources": ["Read:adr-088:relates-to"] },
{ "id": "ADR-089", "type": "adr", "attrs": { "title": "Retrieval Improvements" }, "sources": ["git-log:7331fdd5a"] },
{ "id": "OMEGA", "type": "external-system", "attrs": { "score": 0.954 }, "sources": ["Read:adr-088"] },
{ "id": "Supermemory", "type": "external-system", "attrs": { "score": 0.93, "model": "gpt-4o" }, "sources": ["Read:adr-088"] }
],
"edges": [
{ "from": "ADR-088", "to": "LongMemEval", "kind": "benchmarks", "source": "Read:adr-088", "confidence": "high" },
{ "from": "ADR-088", "to": "AgentDB", "kind": "targets", "source": "Read:adr-088", "confidence": "high" },
{ "from": "ADR-088", "to": "MemPalace", "kind": "prompted-by", "source": "Read:adr-088", "confidence": "high" },
{ "from": "ADR-088", "to": "ADR-076", "kind": "relates-to", "source": "Read:adr-088", "confidence": "high" },
{ "from": "ADR-088", "to": "ADR-077", "kind": "relates-to", "source": "Read:adr-088", "confidence": "high" },
{ "from": "ADR-088", "to": "ADR-075", "kind": "relates-to", "source": "Read:adr-088", "confidence": "high" },
{ "from": "ADR-088", "to": "ADR-089", "kind": "followed-by", "source": "git-log:7331fdd5a", "confidence": "medium" },
{ "from": "AgentDB", "to": "harness.ts", "kind": "implemented-in", "source": "Glob", "confidence": "high" },
{ "from": "harness.ts", "to": "agentdb-adapter.ts", "kind": "delegates-to", "source": "Glob", "confidence": "medium" },
{ "from": "ADR-088", "to": "BM25+RRF", "kind": "adopts", "source": "git-log:6bbbdbe2a", "confidence": "high" },
{ "from": "ADR-088", "to": "MiniLM", "kind": "uses", "source": "git-log:afc75cc71", "confidence": "high" },
{ "from": "LongMemEval", "to": "OMEGA", "kind": "compared-against", "source": "Read:adr-088", "confidence": "high" },
{ "from": "LongMemEval", "to": "Supermemory", "kind": "compared-against", "source": "Read:adr-088", "confidence": "high" },
{ "from": "LongMemEval", "to": "MemPalace", "kind": "compared-against", "source": "Read:adr-088", "confidence": "high" }
],
"stats": {
"nodesByType": { "adr": 5, "benchmark": 1, "system": 1, "external-system": 3, "file": 2, "technique": 1, "model": 1 },
"edgesByKind": { "benchmarks": 1, "targets": 1, "prompted-by": 1, "relates-to": 3, "followed-by": 1, "implemented-in": 1, "delegates-to": 1, "adopts": 1, "uses": 1, "compared-against": 3 },
"sourcesUsed": ["Read", "Glob", "Grep", "git-log"],
"tokensSpent": 1100
}
}
@@ -0,0 +1,76 @@
# Dossier: ADR-088 (LongMemEval Benchmark)
> Generated by `dossier-collect` skill (ruflo-goals plugin, ADR-099)
> Seed: `ADR-088` · Seed type: `adr` · Depth: 2 · Truncated: false
> Generated: 2026-05-03
## Executive summary
**ADR-088** establishes a reproducible benchmark for AgentDB memory retrieval against the **LongMemEval** dataset (ICLR 2025, 500 long-conversational-memory questions). It was prompted by **MemPalace** reporting 96.6% raw / 100% hybrid; our goal was to position AgentDB on the same axis. The decision touches three living artifacts: the harness in `v3/@claude-flow/memory/benchmarks/longmemeval/`, multiple result JSONs from runs in April-May 2026, and a chain of ADRs (-076, -077, -075, -089) that supply the underlying memory-bridge, DiskANN, and learning-pipeline components. Recent commits show iterative SOTA improvement: BM25+RRF hybrid hit C@1=26.8%, MRR=0.3269.
## Entity table
| Entity | Type | Key attrs | Sources |
|---|---|---|---|
| `ADR-088` | adr | Status: Accepted, Date: 2026-04-08 | Read |
| `LongMemEval` | benchmark | ICLR 2025, 500 Qs, 6 question types | adr-text, WebSearch |
| `MemPalace` | external-system | 100% hybrid, 96.6% raw | adr-text |
| `AgentDB` | system | Ruflo's memory backend | adr-text, codebase |
| `harness.ts` | file | benchmark runner | Glob, Read |
| `agentdb-adapter.ts` | file | adapter for AgentDB | Glob |
| `BM25+RRF` | technique | hybrid retrieval, current SOTA | git-log |
| `MiniLM` | model | embedding model used | git-log |
| `ADR-076` | adr | Memory Bridge (related) | adr-text |
| `ADR-077` | adr | DiskANN (related) | adr-text |
| `ADR-075` | adr | Learning Pipeline (related) | adr-text |
| `ADR-089` | adr | retrieval improvements (follow-on) | git-log |
| `OMEGA` | external-system | 95.4% on LongMemEval | adr-text |
| `Supermemory` | external-system | ~93% on gpt-4o | adr-text |
## Graph
```mermaid
graph TD
ADR088[ADR-088] -->|benchmarks| LongMemEval
ADR088 -->|targets| AgentDB
ADR088 -->|prompted-by| MemPalace
ADR088 -->|relates-to| ADR076
ADR088 -->|relates-to| ADR077
ADR088 -->|relates-to| ADR075
ADR088 -->|followed-by| ADR089
AgentDB -->|implemented-in| harness.ts
harness.ts -->|delegates-to| agentdb-adapter.ts
ADR088 -->|adopts| BM25+RRF
ADR088 -->|uses| MiniLM
LongMemEval -->|compared-against| OMEGA
LongMemEval -->|compared-against| Supermemory
LongMemEval -->|compared-against| MemPalace
```
## Source provenance
| Round | Sources used (parallel batch) | Entities surfaced |
|---|---|---|
| 0 | `Read v3/docs/adr/ADR-088-longmemeval-benchmark.md`, `Glob v3/@claude-flow/memory/benchmarks/longmemeval/**`, `Bash git log --all -- ADR-088*` | ADR-088, LongMemEval, MemPalace, AgentDB, harness.ts, agentdb-adapter.ts, OMEGA, Supermemory |
| 1 | `Bash git log --oneline --all` (filtered "adr-088"), `Grep "LongMemEval"` | BM25+RRF, MiniLM, ADR-076, ADR-077, ADR-075, ADR-089 |
Recent git history (provenance for "iterative SOTA"):
- `b6ca2dd5d docs(adr-088): record smart+hybrid SOTA (C@1=26.8%, MRR=0.3269)`
- `afc75cc71 bench(longmemeval): MiniLM + BM25 hybrid ablation`
- `6bbbdbe2a bench(adr-088): BM25 + RRF hybrid retrieval; new SOTA at C@1=26.8%`
- `f88e99ba1 docs(adr-088): add 2026-05-01 run results + tiered optimization roadmap`
- `7331fdd5a feat: LongMemEval benchmark results and ADR-089 retrieval improvements`
## Stats
- Nodes: 14 (1 adr-seed, 4 related ADRs, 1 benchmark, 1 system, 3 external-systems, 2 files, 2 techniques)
- Edges: 12
- Tokens: ~1.1k
- Wall: ~3 seconds (Read + Glob + Grep + git in one batch)
## Open questions / depth-3 candidates
- `ADR-089` (retrieval improvements) is referenced but not expanded — would surface the actual algorithmic delta.
- `ADR-076` Memory Bridge contains the AgentDB write path; expanding it would link back to `ruflo-rag-memory` plugin.
- Run results JSONs in `results/` subdirectory contain per-question scores worth statistical-summary expansion.
@@ -0,0 +1,48 @@
{
"seed": "ruflo-goals",
"seedType": "concept",
"resolvedPath": "plugins/ruflo-goals",
"depth": 2,
"truncated": false,
"generatedAt": "2026-05-03T00:00:00Z",
"nodes": [
{ "id": "ruflo-goals", "type": "plugin", "attrs": { "version": "0.2.0", "license": "MIT", "totalLines": 654 }, "sources": ["Read:plugin.json"] },
{ "id": "goal-planner", "type": "agent", "attrs": { "model": "sonnet", "lines": 82, "pattern": "GOAP+A*" }, "sources": ["Read:agents/goal-planner.md"] },
{ "id": "deep-researcher", "type": "agent", "attrs": { "model": "sonnet", "lines": 61, "pattern": "linear-evidence-graded" }, "sources": ["Read:agents/deep-researcher.md"] },
{ "id": "horizon-tracker", "type": "agent", "attrs": { "model": "sonnet", "lines": 67, "pattern": "session-spanning-with-drift" }, "sources": ["Read:agents/horizon-tracker.md"] },
{ "id": "dossier-investigator", "type": "agent", "attrs": { "model": "sonnet", "lines": 68, "pattern": "recursive-parallel", "new": true }, "sources": ["Read:agents/dossier-investigator.md"] },
{ "id": "goal-plan", "type": "skill", "attrs": { "lines": 59 }, "sources": ["Read:skills/goal-plan/SKILL.md"] },
{ "id": "deep-research", "type": "skill", "attrs": { "lines": 43 }, "sources": ["Read:skills/deep-research/SKILL.md"] },
{ "id": "horizon-track", "type": "skill", "attrs": { "lines": 61 }, "sources": ["Read:skills/horizon-track/SKILL.md"] },
{ "id": "research-synthesize", "type": "skill", "attrs": { "lines": 62 }, "sources": ["Read:skills/research-synthesize/SKILL.md"] },
{ "id": "dossier-collect", "type": "skill", "attrs": { "lines": 70, "new": true }, "sources": ["Read:skills/dossier-collect/SKILL.md"] },
{ "id": "/goals", "type": "command", "attrs": { "lines": 12 }, "sources": ["Read:commands/goals.md"] },
{ "id": "ADR-099", "type": "adr", "attrs": { "title": "Dossier-Investigator", "status": "Proposed" }, "sources": ["Read:v3/docs/adr/ADR-099*"] },
{ "id": "goap-plans", "type": "memory-namespace", "sources": ["Read:goal-plan"] },
{ "id": "research", "type": "memory-namespace", "sources": ["Read:deep-research"] },
{ "id": "horizons", "type": "memory-namespace", "sources": ["Read:horizon-track"] },
{ "id": "dossier", "type": "memory-namespace", "attrs": { "new": true }, "sources": ["Read:dossier-collect"] }
],
"edges": [
{ "from": "ruflo-goals", "to": "goal-planner", "kind": "ships-agent", "source": "Read:plugin-tree", "confidence": "high" },
{ "from": "ruflo-goals", "to": "deep-researcher", "kind": "ships-agent", "source": "Read:plugin-tree", "confidence": "high" },
{ "from": "ruflo-goals", "to": "horizon-tracker", "kind": "ships-agent", "source": "Read:plugin-tree", "confidence": "high" },
{ "from": "ruflo-goals", "to": "dossier-investigator", "kind": "ships-agent", "source": "Read:plugin-tree", "confidence": "high" },
{ "from": "ruflo-goals", "to": "goal-plan", "kind": "ships-skill", "source": "Read:plugin-tree", "confidence": "high" },
{ "from": "ruflo-goals", "to": "dossier-collect", "kind": "ships-skill", "source": "Read:plugin-tree", "confidence": "high" },
{ "from": "goal-planner", "to": "goal-plan", "kind": "drives", "source": "naming-convention", "confidence": "high" },
{ "from": "deep-researcher", "to": "deep-research", "kind": "drives", "source": "naming-convention", "confidence": "high" },
{ "from": "horizon-tracker", "to": "horizon-track", "kind": "drives", "source": "naming-convention", "confidence": "high" },
{ "from": "dossier-investigator", "to": "dossier-collect", "kind": "drives", "source": "naming-convention", "confidence": "high" },
{ "from": "goal-plan", "to": "goap-plans", "kind": "persists-to", "source": "Read:skill", "confidence": "high" },
{ "from": "dossier-collect", "to": "dossier", "kind": "persists-to", "source": "Read:skill", "confidence": "high" },
{ "from": "ADR-099", "to": "dossier-investigator", "kind": "introduces", "source": "Read:adr-099", "confidence": "high" },
{ "from": "ADR-099", "to": "dossier-collect", "kind": "introduces", "source": "Read:adr-099", "confidence": "high" }
],
"stats": {
"nodesByType": { "plugin": 1, "agent": 4, "skill": 5, "command": 1, "adr": 1, "memory-namespace": 4 },
"edgesByKind": { "ships-agent": 4, "ships-skill": 2, "drives": 4, "persists-to": 2, "introduces": 2 },
"sourcesUsed": ["Read", "Glob"],
"tokensSpent": 2400
}
}
@@ -0,0 +1,107 @@
# Dossier: `ruflo-goals` plugin
> Generated by `dossier-collect` skill (ruflo-goals plugin, ADR-099)
> Seed: `ruflo-goals` · Seed type: `concept` (resolves to plugin path) · Depth: 2 · Truncated: false
> Generated: 2026-05-03
## Executive summary
**`ruflo-goals` v0.2.0** is a Claude Code plugin providing GOAP-based planning, multi-source research, long-horizon tracking, and (new in 0.2.0) recursive parallel investigation. It ships **4 agents** + **5 skills** + **1 slash command** in 654 lines across 12 files. The plugin is structured as siblings — `goal-planner` (planning), `deep-researcher` (questions), `horizon-tracker` (long objectives), and `dossier-investigator` (seeds) — with a documented selection guide. ADR-099 (this dossier's instigator) added the dossier-investigator capability inspired by maigret's recursive-parallel pattern, reusing only ruflo-native tools (no external dependencies).
## Entity table
| Entity | Type | Key attrs | Sources |
|---|---|---|---|
| `ruflo-goals` | plugin | v0.2.0, MIT | Read:plugin.json |
| `goal-planner` | agent | model=sonnet, GOAP+A* | Read |
| `deep-researcher` | agent | model=sonnet, evidence-graded | Read |
| `horizon-tracker` | agent | model=sonnet, drift detection | Read |
| `dossier-investigator` | agent | model=sonnet, NEW in 0.2.0 | Read |
| `goal-plan` | skill | argument-hint=`<goal>` | Read |
| `deep-research` | skill | argument-hint=`<topic>` | Read |
| `horizon-track` | skill | session-spanning | Read |
| `research-synthesize` | skill | report rendering | Read |
| `dossier-collect` | skill | NEW in 0.2.0 | Read |
| `/goals` | command | status overview | Read |
| `ADR-099` | adr | introduces dossier-investigator | Read |
| `goap-plans` | namespace | memory store for plans | Read |
| `research` | namespace | memory store for findings | Read |
| `horizons` | namespace | memory store for objectives | Read |
| `dossier` | namespace | memory store for dossiers (NEW) | Read |
## Graph
```mermaid
graph TD
plugin[ruflo-goals v0.2.0] --> goal-planner
plugin --> deep-researcher
plugin --> horizon-tracker
plugin --> dossier-investigator
plugin --> goal-plan
plugin --> deep-research
plugin --> horizon-track
plugin --> research-synthesize
plugin --> dossier-collect
plugin --> goals[/goals command/]
goal-planner -.drives.-> goal-plan
deep-researcher -.drives.-> deep-research
horizon-tracker -.drives.-> horizon-track
dossier-investigator -.drives.-> dossier-collect
goal-plan -.persists.-> goap-plans
deep-research -.persists.-> research
horizon-track -.persists.-> horizons
dossier-collect -.persists.-> dossier
ADR099[ADR-099] -.introduces.-> dossier-investigator
ADR099 -.introduces.-> dossier-collect
```
## Selection rules (extracted from README)
| You have | Use agent | Use skill |
|---|---|---|
| A question | `deep-researcher` | `deep-research` |
| A seed entity to expand outward | `dossier-investigator` | `dossier-collect` |
| A multi-step objective | `goal-planner` | `goal-plan` |
| A long-running objective | `horizon-tracker` | `horizon-track` |
## File inventory (Glob output)
```
plugins/ruflo-goals/
├── README.md 46 lines
├── .claude-plugin/plugin.json 23 lines
├── commands/goals.md 12 lines
├── agents/
│ ├── goal-planner.md 82 lines
│ ├── deep-researcher.md 61 lines
│ ├── horizon-tracker.md 67 lines
│ └── dossier-investigator.md 68 lines ← NEW
└── skills/
├── goal-plan/SKILL.md 59 lines
├── deep-research/SKILL.md 43 lines
├── horizon-track/SKILL.md 61 lines
├── research-synthesize/SKILL.md 62 lines
└── dossier-collect/SKILL.md 70 lines ← NEW
────────
654 lines total
```
## Source provenance
| Round | Tools (parallel batch) | Entities surfaced |
|---|---|---|
| 0 | `Glob plugins/ruflo-goals/**`, `Read plugin.json`, `Read README.md` | plugin, all 4 agents, all 5 skills, /goals |
| 1 | `Read agents/*.md` (4×), `Read skills/*/SKILL.md` (5×), `Read v3/docs/adr/ADR-099*` | namespaces (goap-plans, research, horizons, dossier), ADR-099 |
## Stats
- Nodes: 16
- Edges: 14
- Tokens: ~2.4k
- Wall: 1 batch read of 12 files in parallel
## Risks / open questions
- `goal-planner.md` is 82 lines — exceeds the 80-line guideline from ADR-098. Could be tightened.
- `dossier-investigator` and `deep-researcher` share ~40% of their source matrix (acknowledged tradeoff in ADR-099). Worth tracking actual usage to validate whether they should remain separate.
- No tests yet for `dossier-collect` — depth-3 expansion would surface this gap.
@@ -0,0 +1,54 @@
{
"seed": "ruvnet",
"seedType": "username",
"depth": 2,
"maxDepth": 2,
"maxBreadth": 8,
"truncated": false,
"exact": false,
"generatedAt": "2026-05-03T00:00:00Z",
"nodes": [
{ "id": "ruvnet", "type": "username", "attrs": { "name": "rUv", "followers": 7268, "publicRepos": 173, "createdAt": "2012-11-30", "company": "Not a Bot", "location": "0x", "blog": "Cognitum.One", "twitter": "ruv" }, "sources": ["gh-api:users/ruvnet", "WebSearch"] },
{ "id": "ruflo", "type": "repo", "attrs": { "language": "TypeScript", "stars": 39201, "forks": 4442, "openIssues": 497, "license": "MIT", "topics": ["agentic-ai", "claude-code", "mcp-server", "swarm-intelligence"] }, "sources": ["gh-api:repos/ruvnet/ruflo", "WebSearch"] },
{ "id": "RuView", "type": "repo", "attrs": { "language": "Rust", "stars": 51576, "topics": ["wifi", "pose-estimation", "self-learning", "esp32"] }, "sources": ["gh-api:users/ruvnet/repos"] },
{ "id": "RuVector", "type": "repo", "attrs": { "language": "Rust", "stars": 3891, "license": "MIT", "topics": ["gnn", "graph-neural-networks", "wasm", "onnx", "rust"] }, "sources": ["gh-api:repos/ruvnet/RuVector"] },
{ "id": "agentic-flow", "type": "repo", "attrs": { "language": "TypeScript", "stars": 668, "topics": ["claude-code", "claude-agent-sdk", "openrouter"] }, "sources": ["gh-api:repos/ruvnet/agentic-flow", "WebSearch"] },
{ "id": "ruv-FANN", "type": "repo", "attrs": { "language": "Rust", "stars": 347 }, "sources": ["gh-api:users/ruvnet/repos"] },
{ "id": "SynthLang", "type": "repo", "attrs": { "language": "Python", "stars": 253 }, "sources": ["gh-api:users/ruvnet/repos"] },
{ "id": "open-claude-code", "type": "repo", "attrs": { "language": "JavaScript", "stars": 242, "topics": ["clean-room-reimplementation", "decompiler"] }, "sources": ["gh-api:users/ruvnet/repos"] },
{ "id": "rvm", "type": "repo", "attrs": { "language": "Rust", "stars": 95 }, "sources": ["gh-api:users/ruvnet/repos?sort=stars"] },
{ "id": "Dossier", "type": "repo", "attrs": { "stars": 33, "description": "Visual planning and context control for AI coding" }, "sources": ["gh-api:users/ruvnet/repos?sort=stars"] },
{ "id": "RuLake", "type": "repo", "attrs": { "language": "Rust", "stars": 5, "description": "cache-coherent vector execution fabric" }, "sources": ["gh-api:users/ruvnet/repos?sort=stars"] },
{ "id": "obsidian-brain", "type": "repo", "attrs": { "language": "TypeScript", "stars": 9, "description": "Obsidian↔RuVector bridge" }, "sources": ["gh-api:users/ruvnet/repos?sort=stars"] },
{ "id": "Cognitum.One", "type": "url", "attrs": { "role": "personal-blog" }, "sources": ["gh-api:users/ruvnet:blog"] },
{ "id": "pi.ruv.io", "type": "infra", "attrs": { "role": "federated-sync-endpoint" }, "sources": ["gh-api:repos/ruvnet/obsidian-brain:description"] },
{ "id": "Not a Bot", "type": "org", "attrs": { "role": "company" }, "sources": ["gh-api:users/ruvnet:company"] }
],
"edges": [
{ "from": "ruvnet", "to": "ruflo", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "RuView", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "RuVector", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "agentic-flow", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "ruv-FANN", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "SynthLang", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "open-claude-code", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "rvm", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "Dossier", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "RuLake", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "obsidian-brain", "kind": "owns", "source": "gh-api", "confidence": "high" },
{ "from": "ruvnet", "to": "Cognitum.One", "kind": "writes-at", "source": "gh-api:profile", "confidence": "high" },
{ "from": "ruvnet", "to": "Not a Bot", "kind": "works-at", "source": "gh-api:profile", "confidence": "high" },
{ "from": "ruflo", "to": "agentic-flow", "kind": "integrates", "source": "WebSearch:summary", "confidence": "medium" },
{ "from": "ruflo", "to": "RuVector", "kind": "uses", "source": "WebSearch:summary", "confidence": "medium" },
{ "from": "RuLake", "to": "RuVector", "kind": "extends", "source": "gh-api:repo-description", "confidence": "high" },
{ "from": "obsidian-brain", "to": "RuVector", "kind": "bridges", "source": "gh-api:repo-description", "confidence": "high" },
{ "from": "obsidian-brain", "to": "pi.ruv.io", "kind": "federates-via", "source": "gh-api:repo-description", "confidence": "medium" }
],
"stats": {
"nodesByType": { "username": 1, "repo": 11, "url": 1, "infra": 1, "org": 1 },
"edgesByKind": { "owns": 11, "integrates": 1, "uses": 1, "extends": 1, "bridges": 1, "federates-via": 1, "writes-at": 1, "works-at": 1 },
"sourcesUsed": ["gh-api", "WebSearch"],
"tokensSpent": 3200,
"usdSpent": 0
}
}
@@ -0,0 +1,96 @@
# Dossier: rUv (`ruvnet`)
> Generated by `dossier-collect` skill (ruflo-goals plugin, ADR-099)
> Seed: `ruvnet` · Seed type: `username` · Depth: 2 · Truncated: false
> Generated: 2026-05-03
## Executive summary
**rUv** (GitHub `ruvnet`, Twitter `ruv`, blog `Cognitum.One`) is the creator of **Ruflo** (formerly Claude Flow), a multi-agent orchestration platform for Claude Code with 39k+ stars. The account joined GitHub in 2012, hosts 173 public repos, has 7,268 followers, and lists company "Not a Bot" / location "0x". The portfolio clusters around three themes:
1. **Agent orchestration** (`ruflo`, `agentic-flow`, `swarm-*`)
2. **Self-learning AI infrastructure** (`RuVector`, `ruv-FANN`, `RuLake`)
3. **Edge / unconventional sensing** (`RuView` for WiFi-based vital monitoring, `ultrasonic` for steganographic agent commands)
A ruflo-internal "Dossier" repo also exists (33 stars) — visual planning for AI coding — distinct from this dossier output.
## Entity table
| Entity | Type | Key attrs | Sources |
|---|---|---|---|
| `ruvnet` | username | name=rUv, joined 2012, 7,268 followers, bio "Unicorn Breeder" | gh-api, WebSearch |
| `ruflo` | repo | TS, 39,201 ⭐, MIT, multi-agent platform | gh-api, WebSearch, github.com |
| `RuView` | repo | Rust, 51,576 ⭐, WiFi sensing | gh-api |
| `RuVector` | repo | Rust, 3,891 ⭐, MIT, GNN vector DB | gh-api, codebase |
| `agentic-flow` | repo | TS, 668 ⭐, low-cost model switcher | gh-api, WebSearch |
| `ruv-FANN` | repo | Rust, 347 ⭐, neural net library | gh-api |
| `SynthLang` | repo | Python, 253 ⭐, prompt language for LLMs | gh-api |
| `open-claude-code` | repo | JS, 242 ⭐, clean-room CC reimpl | gh-api |
| `rvm` | repo | Rust, 95 ⭐, agentic VM | gh-api |
| `Dossier` | repo | 33 ⭐, visual AI coding planner | gh-api |
| `Cognitum.One` | url | personal blog / company site | gh-api (profile.blog) |
| `RuLake` | repo | Rust, vector exec fabric on RuVector | gh-api |
| `obsidian-brain` | repo | TS, Obsidian↔RuVector bridge | gh-api |
| `pi.ruv.io` | infra | federated sync endpoint | gh-api (repo desc) |
| `Not a Bot` | org | listed company on profile | gh-api |
| `MIT` | license | applied to ruflo, RuVector | gh-api |
## Graph
```mermaid
graph TD
rUv[ruvnet / rUv] -->|owns| ruflo
rUv -->|owns| RuView
rUv -->|owns| RuVector
rUv -->|owns| agentic-flow
rUv -->|owns| ruv-FANN
rUv -->|owns| SynthLang
rUv -->|owns| open-claude-code
rUv -->|owns| rvm
rUv -->|owns| Dossier
rUv -->|owns| RuLake
rUv -->|owns| obsidian-brain
rUv -->|writes-at| Cognitum.One
rUv -->|works-at| NotABot[Not a Bot]
ruflo -->|integrates| agentic-flow
ruflo -->|uses| RuVector
obsidian-brain -->|bridges| RuVector
obsidian-brain -->|federates-via| pi.ruv.io
RuLake -->|extends| RuVector
ruflo -->|licensed| MIT
RuVector -->|licensed| MIT
```
## Themes (clustered by recursive expansion)
### 1. Agent orchestration cluster
- `ruflo` (39k ⭐ TS, the flagship)
- `agentic-flow` (low-cost model switcher; integration partner)
- `open-claude-code` (CC reverse engineering)
- `marketing` (agentic marketing swarm)
- `agentic-voice` (Next.js + OpenAI + Exa chat)
### 2. Self-learning infrastructure cluster
- `RuVector` (GNN vector DB, Rust+WASM, ONNX)
- `RuLake` (cache-coherent vector exec layer)
- `ruv-FANN` (FANN port to Rust)
- `obsidian-brain` (Obsidian plugin → RuVector)
### 3. Unconventional sensing & control cluster
- `RuView` (WiFi vital monitoring, no camera)
- `ultrasonic` (steganographic agent commands in audio/video)
- `Connectome-OS` (debugging for embodied graph systems)
- `musica` (audio separation via spectral graph mincut)
## Source provenance
- **Round 0 fan-out** (parallel, 1 batch): `gh api users/ruvnet`, `gh api users/ruvnet/repos?sort=updated`, `WebSearch "ruvnet github ruflo claude-flow agentic"`
- **Round 1 expansion** (parallel, 1 batch): `gh api repos/ruvnet/ruflo`, `gh api repos/ruvnet/RuVector`, `gh api repos/ruvnet/agentic-flow`, `gh api users/ruvnet/repos?sort=stars`
- **Dedup**: 0 collisions (all entities surfaced once)
- **Budget spent**: ~3.2k tokens, $0 (gh API + WebSearch are free; no Anthropic calls beyond orchestration)
## Risks / open questions
- `RuView` star count (51,576) substantially exceeds `ruflo` (39,201) — surprising given ruflo is the headline project; worth verifying.
- "Cognitum.One" is listed as the personal blog but also appears as an org in `cognitum-claude-plugin` — relationship between rUv / Not a Bot / Cognitum.One could be expanded in a depth-3 run.
- 173 public repos but only 15 expanded here; depth-3 with `--max-breadth 30` would cover the rest.