All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
lifting_statusnow tracks stale-feature drift across calls. A persistent per-server set records entities whose source was modified after they were lifted; the dashboard reportsstale_features: N entities modified since last liftand the NEXT STEP state machine prompts re-lift even when coverage is 100%.get_entities_for_lifting(scope="*")now returns stale entities alongside unlifted ones, so a single call covers both "never lifted" and "lifted-but-outdated" work.lifting_statusemits a sub-agent dispatch recommendation when the remaining work (unlifted + stale) is ≥100 entities. The response containsLOOP/DISPATCH/FALLBACKblocks so callers delegate directly without first loading a batch of source into their own context.get_entities_for_liftingbatch-0 emits a one-line dispatch hint when ≥10 token-aware batches are queued, pointing back tolifting_statusfor the full recommendation.submit_lift_resultsNEXT action is now scale-aware — when remaining work ≥100 entities, it redirects the caller tolifting_statusinstead of encouraging another foreground batch.build_rpgresponse now emits an action-oriented NEXT STEP directing the agent to lift immediately. Small scope lifts inline; large scope dispatches a sub-agent with the LOOP pattern embedded.- New
USE RPG FIRSTtop section inserver_instructions.mdwith a mapping table from shell patterns (grep -r,cat,find,wc -l, chained greps) to the RPG tool that replaces them. - New
DRIFT MAINTENANCEsection inserver_instructions.mdexplaining the three auto-sync notice variants and framing re-lift as part of definition-of-done for any task that wrote code. - Tool descriptions for
search_node,fetch_node,explore_rpg,rpg_info,semantic_snapshot,context_pack,impact_radius,plan_change,analyze_health,detect_cycles,find_paths, andslice_betweennow open with aPREFER THIS OVER ...marker naming the shell command or workflow they replace. .claude/skills/rpg/SKILL.mdandREADME.mdcarry the same RPG-first mapping table as the server prompt.- Crate-visible
LARGE_SCOPE_ENTITIES(100) andLARGE_SCOPE_BATCHES(10) constants replace duplicated magic numbers acrossserver.rs/tools.rswith doc comments describing the heuristic-vs-authoritative relationship. - Canonical lock-order invariant documented on the
RpgServerstruct so reviewers don't have to re-derive it from scattered call sites. reload_config_with_warninghelper onRpgServerthat distinguishes missing.rpg/config.toml(silent default) from malformed TOML (stderr warning, keeps previous in-memory config).
lifting_statusNEXT STEP is runtime-neutral. No specific runtime's dispatch syntax appears in the response; callers use whatever sub-agent or cheaper-model mechanism their runtime exposes. Explicit fallbacks: scoped lifting for callers with no delegation mechanism, andrpg-encoder lift --provider anthropic|openaifor callers with an API key and no sub-agent support.- Batch-size estimates in NEXT STEP messages read from the live
encoding.max_batch_tokensconfig instead of a hard-coded~12Kfigure, so the estimate scales when the user overrides the budget. NEXT STEP:remains a single parseable line; dispatch detail is emitted in labeled blocks immediately below.- Auto-sync notice now prescribes a verb: it distinguishes per-update delta from pre-existing backlog and separates new-entity drift from stale-feature drift, so an agent that commits code and sees the notice is told to re-lift rather than informed of a count.
- CLI fallback in large-scope guidance is gated to cases with actual
unlifted work, with a note that
rpg-encoder liftdoes not re-lift stale entities (it filters to entities with no features). get_routing_candidatesresponse header no longer includes the graph revision hash — it moved to the NEXT_ACTION block at the bottom. Keeps the stable preamble (instructions + entity table) cache-eligible while still surfacing the revision where the agent needs to read it back.server_instructions.mdLIFTING FLOW sub-section rewritten and shortened.set_project_rooton project switch now loads the new project's.rpg/config.tomlindependently; on parse failure it falls back toRpgConfig::default()rather than preserving the previous project's config. Same-projectreload_rpgpreserves the previous config on parse failure (different flow, different correctness requirement).
lifting_statuspreviously reportedGraph is completeas soon as every entity had some features, ignoring stale features from modified sources. The state machine now considersremaining + stale_featurescombined.get_entities_for_lifting(scope="*")previously returned zero entities when all drift was stale (features present, sources modified) becauseresolve_scopefilters to entities with no features. It now augments the resolved scope with tracked stale entities and routes them through the LLM loop.- Auto-sync notice previously conflated per-update delta with global backlog, so a one-line edit on a partially-lifted repo could claim "50 new entities unlifted" when only 1 was actually new.
finalize_liftingfallback guidance previously said to call it after each scoped subtree. That auto-routes pending entities against incomplete signals and locks the hierarchy early. Guidance now says to callfinalize_liftingonce after all scopes complete.rpg-encoder lift --provider ...(CLI fallback) left the MCP server on a stale in-memory graph. All docs that mention the CLI fallback now specify that the caller must callreload_rpgafterward.set_project_rootandreload_rpgpreviously usedunwrap_or_default()on config loads, collapsing missing-config and malformed-TOML into identical silent behavior.set_project_rootfailed to refreshself.configon project switch; the server kept serving the previous project's encoding settings.lifting_statuslarge-scope recommendation previously ran off raw unlifted count, before auto-lift had reduced the set. On repos full of trivial entities (getters, setters, constructors) it could recommend delegation for ~0 LLM calls. The large-scope branch now signals likely-large and defers the authoritative check to the post-auto-lift batch count inget_entities_for_lifting.rpg_infoerror wording ("No RPG found") was miscited as a friendly status string; corrected to "any RPG tool returns 'No RPG found'".build_rpgNEXT STEP andlifted: X/Yheader previously countedModuleentities against the unlifted total, whilelifting_statusandget_entities_for_liftingexclude them. The two could disagree by hundreds of entities on large codebases, tripping the delegation threshold inbuild_rpgwhenlifting_statuswould still recommend foreground lifting. Both paths now uselifting_coverage()(non-module) for the count, and the header readsliftable_entities: X/Y.submit_lift_resultspreviously emittedDONEas soon as coverage reached 100%, which could terminate a stale-only re-lift loop after batch 1 while later batches were still queued. The NEXT/DONE branch now counts unlifted + stale remaining.update_rpgnow feedssummary.modified_entity_idsinto the stale-tracking set so itsneeds_relift: Nreply aligns with whatlifting_statusandget_entities_for_lifting(scope="*")report.- Server startup auto-update now feeds
modified_entity_idsinto the stale-tracking set and seeds the auto-sync changeset hash for a clean workdir. Previously modifications between the last lift and a session restart silently dropped off the dashboard. auto_lifton a non-*scope now drains stale entries for every in-scope entity. The pipeline freshens features for each regardless of existing state, so stale markers for those IDs are invalid after the call; the unconditional drain also handles the identical-features case where a cosmetic edit re-lifts to the same output.- Auto-lifted features for entities previously flagged stale now
drain the stale-tracking set inline in
get_entities_for_lifting, so the count doesn't inflate when the auto-lifter writes fresh features directly. reload_rpgnow prunes the stale-tracking set against the newly loaded graph rather than clearing it wholesale. The CLI / isolated sub-agent re-lift flow only refreshes entities with no features — stale entities survive it, so clearing would letlifting_statusreport 100% coverage while re-lift work remained.reload_rpgdrift-tracking reset now sits on the success path, afterstorage::loadreturnsOk. Transient read errors no longer wipe the backlog while leaving the previous graph in memory.build_rpgnow prunes the stale-tracking set against the newly built graph so dead entity IDs don't accumulate across rebuilds.build_semantic_hierarchysharded init no longer acquireshierarchy_session.write()beforegraph.read(). The original order formed a deadlock cycle withupdate_rpg's graph-then-session order under concurrent scheduling. The init path now collapses decision + snapshot into a singlehierarchy_session.write()held undergraph.read()and packages the work into anActionenum so there's no peek-then-trust.build_batch_0_domain_discoveryandbuild_cluster_batchnow take&RPGraphand (where applicable) clusters as parameters instead of re-readingself.graph/self.hierarchy_session. Closes two TOCTOU windows: a session-clear race where a concurrentbuild_rpg/update_rpgcould panic onsession.as_mut().unwrap(), and a graph-replace race where a concurrentset_project_rootcould panic ongraph.as_ref().unwrap().set_project_roottool description is no longer Claude-Code-specific in its example; reads runtime-neutral.get_entities_for_liftingbatch-0 dispatch NOTE no longer references "batches 2..N" (off-by-one against the 0-basedbatch_indexparameter). Reads "do not request further batches in this context".
set_project_rootMCP tool — switch the active project root at runtime without restarting the session. Loads the new root's.rpg/graph.jsonif present, resets lifting/hierarchy sessions, auto-sync markers, and pending routing state. Tilde-expands and canonicalizes the supplied path. Fixes the common case where a session is launched from$HOMEbut the user wants to work on~/some-project— previously the server's project root was locked to the launch directory.- MCP tool count: 27 → 28.
RpgServer::project_rootis now an async accessor backed byArc<RwLock<PathBuf>>(previously a staticPathBuffield). All tool handlers acquire a snapshot at call time, so each invocation reads whateverset_project_rootmost recently set.get_config_blockingrenamed toload_configand made async.staleness_detailmade async (needed to acquire the new project-root lock).
- CRITICAL: Auto-sync on workdir changes was a no-op (caught by Codex audit) —
v0.8.0 detected workdir changes and computed a hash, but the underlying
run_updateonly diffedbase_commit..HEAD, so uncommitted edits were silently ignored. The hash was then cached as "synced", masking the staleness from later queries. This made the headline v0.8.0 feature (workdir auto-sync) effectively non-functional. - Auto-sync error path no longer caches markers — transient failures no longer leave the server silently stale. The next query retries.
- Revert detection — when a previously-dirty file returns to its HEAD state, the graph is now restored. Previously, the entity additions from the dirty version persisted forever.
- CLI
updatenow defaults to workdir-aware — matches the MCP server. Pass--since <commit>for commit-range diffing as before. - README said "six crates" while listing seven. Now says seven.
tools.rsmodule comment said "17 tools" — actually 27.
run_update_workdirinrpg-encoder::evolution— public API that applies the working-tree diff (committed + staged + unstaged) instead of the committed-only diff.run_update_from_changesinrpg-encoder::evolution— public API that applies a caller-suppliedVec<FileChange>. Used by the MCP server to compose workdir changes with revert-detection re-parses.
semantic_snapshotMCP tool — Whole-repo semantic understanding in one call (~25K tokens for 1000 entities). Includes hot spots: top-10 most-connected entities as architectural backbone.auto_liftMCP tool — Autonomous lifting via external LLM API (Anthropic Haiku, OpenAI GPT-4o-mini, OpenRouter, Google Gemini). Supportsapi_key_envparameter to resolve keys from environment variables (safer than raw keys in tool calls).analyze_healthMCP tool — Code health metrics: coupling, instability, god objects, clone detection.detect_cyclesMCP tool — Circular dependency detection.- Auto-staleness resolution — Server auto-syncs graph when git HEAD moves. Navigation tools no longer show passive stale warnings, they auto-update.
- MCP tool annotations —
read_only_hint,destructive_hint,open_world_hinton all tools per MCP 2025-03-26 spec. tool_list_changedcapability enabled for future progressive tool loading.- Claude Code hooks —
PreToolUseon Write/Edit (auto-context injection),PostToolUseon Bash (auto-update after git commits). - MCP tool count: 23 → 27
- Deadlock in
auto_sync_if_stale()error path — write lock held while calling read-lock method (#75) auto_liftgraph loss on pipeline error — graph now stays in write lock viablock_in_place(#75, #77)- API key exposure in Debug derive — manual
Debugimpl redactsapi_key(#75) - Concurrent
auto_liftguard —lift_in_progressAtomicBool rejects parallel calls (#76) - Cost estimate overcounting — Review-confidence entities no longer counted as LLM-needed (#76)
- Pre-commit hook supply-chain risk — removed unpinned
npx -yfallback (#77) - Autonomous lift name collision — tries qualified
Class::methodnames when bare name misses (#77) - Snapshot dep skeleton ambiguity — uses qualified names instead of bare names (#77)
- Shell hook portability — replaced GNU
grep -Pwith POSIXsed(#77) - Root scope handling in shared search —
scope="."andscope=""now behave as unscoped (#70)
- Unused
kodamadependency
server.jsonversion updated to 0.7.0 (was stuck at 0.6.7)- CONTRIBUTING.md corrected: tools are in
tools.rsnotmain.rs - README rewritten: leads with value proposition, credits inspirations (RPG paper, GitNexus, Serena)
- Dead code removed from rpg-lift
progress.rs
- Claude Code skill (
.claude/skills/rpg/SKILL.md) and Gemini CLI extension (#68) - README updated to cite arXiv paper directly
- Entity Signatures carried over from v0.6.0
- MCP tool count: 23 (unchanged)
- Auto-migrate existing Windows graphs — When loading graphs created on Windows
(schema <2.2.0), all backslash entity IDs are automatically normalized to forward
slashes across
entities,file_index,edges, andhierarchy. All lifted semantic features and data are fully preserved. Schema version bumped to 2.2.0.
- Windows path format mismatch in entity IDs (#49) —
Path::display()produces backslashes on Windows, causing key mismatches when MCP tools receive forward-slash keys from users/LLMs. Addednormalize_path()utility inrpg-core::graphand applied it at all ID-generating call sites:RawEntity::id(),resolve_dependencies(),apply_renames(), andcreate_module_entities(). No-op on Unix. Closes #49. - Pre-existing clippy
inefficient_to_stringwarnings incritic.rs,hierarchy.rs, andevolution_test.rs.
- Entity Signatures — Typed function/method signatures extracted from AST
(parameters with type annotations, return types). Stored on
Entity.signature. - DataFlow Edges — New
EdgeKind::DataFlowfor parameter passing and return value flow between entities. Adds data lineage tracking to the dependency graph. - Area Connectivity —
rpg_infonow reports inter-area dependency counts, showing which functional areas are most tightly coupled. - MCP tool count: 23
- Schema version bumped for signature and data flow support
- Protocol Deduplication — Version references save 10K-40K tokens per lifting session
get_files_for_synthesisuses version references after batch 0:[RPG Protocol: file_synthesis v<hash>]- SHA256-based prompt versioning in MCP server (
PromptVersionsstruct)
- Graph Reasoning Tools — Two new MCP tools for dependency path analysis
find_paths: K-shortest paths between entities using Yen's algorithm (returns paths of varying lengths)slice_between: Extract minimal connecting subgraph (Steiner tree with strict edge tracking)- Eliminates 5-10 manual tool calls for path queries
- Diff-Aware Search —
search_nodeacceptssince_commitparameter for PR review workflows- Proximity-based ranking: 3x boost for changed entities, 2x for 1-hop neighbors, 1.5x for 2-hop
- Automatically maps git changes to entity IDs via
rpg_encoder::evolution::detect_changes - Computes dependency proximity tiers using BFS traversal
- Boost applied before truncation to ensure changed entities can rank into results
- 50-70% fewer irrelevant results projected in PR review tasks
- Sharded Hierarchy Foundation — Clustering infrastructure for repos >100 files
- File clustering with deterministic batching (target: 70 files per cluster)
- Representative sampling for domain discovery
- Balance clusters to maintain manageable batch sizes
- FULL MCP INTEGRATION COMPLETE: Two-phase batched workflow (domain discovery → file assignment per cluster)
search_nodeMCP tool supports diff-aware ranking viasince_commitparameterSearchParamsextended withdiff_contextfield for proximity boosting- Diff boost now applied before truncation (expands search limit 10x when diff_context present)
find_pathsdefaults to max_hops=5 (use -1 for unlimited)- File clustering uses sorted iteration for deterministic batch assignments
- Protocol deduplication: ~75 tokens saved per batch after batch 0 (10K-40K total over 20-batch session)
- Graph reasoning tools: Single-call path queries vs 5-10 manual explore/fetch calls
- Diff-aware search: Reduces noise in PR review workflows
- Added dependencies:
sha2 = "0.10"(rpg-mcp),kodama = "0.2"(rpg-encoder, currently unused) - New modules:
rpg-nav/src/diff.rs(189 lines, 5 tests): Proximity computation and boost applicationrpg-nav/src/paths.rs(290 lines, 7 tests): K-shortest paths with Yen's algorithmrpg-nav/src/slice.rs(300 lines, 8 tests): Minimal subgraph extraction with strict edge tracking
- Extended
rpg-encoder/src/hierarchy.rs(+210 lines, 4 tests): Clustering and batching functions - MCP tool count: 21 → 23 (new:
find_paths,slice_between) - Sharded hierarchy: Session management, automatic clustering, batched domain discovery and file assignment
- All tests passing (466+ tests across workspace)
- Clustering simplified from HAC to deterministic batching (kodama API complexity deferred)
- Incremental Embeddings — Per-entity fingerprint sync replaces full embedding rebuild.
Only re-embeds entities whose features changed. Stored in
embeddings.meta.jsonalongside existing binary format. - Confidence-Gated Auto-Lift — Structural signal analysis (branches, loops, calls, early
returns) in new
signals.rsmodule. Three confidence buckets:- Accept: apply features silently (simple getters, setters, constructors)
- Review: show in batch 0 for LLM verification (moderate complexity)
- Reject: needs full LLM analysis (high complexity)
TOML rules extended with
max_branches,max_loops,max_callsstructural gates.
- Lift Quality Critic — Non-blocking feedback on
submit_lift_results. Checks for vague verbs ("handle", "process"), implementation details ("loop", "iterate"), too-short/too-long features, and duplicates. Features are always applied; warnings help the LLM self-correct. plan_changeMCP tool — Answers "what existing code needs to change for goal X, and in what order?" Orchestrates search + impact_radius + topological sort + test coverage detection. Returns dependency-safe modification order with blast radius analysis.feature_sourceprovenance —Option<String>field on Entity tracks feature origin ("auto","llm","synthesized"). Backward-compatible viaserde(default).- MCP tool count: 20 → 21 (new:
plan_change)
- Language-Universal Auto-Lift — 134 TOML-driven auto-lift rules across 13 languages with
acronym-aware field normalization (
getHTTPClient→return http client) (#40) - LLM Performance Optimizations —
context_packsuper-tool (search→fetch→explore in 1 call),impact_radiusBFS reachability, dependency context in lifting batches, auto-lift trivial entities (≤3 lines, getter/setter/new patterns) (#38) - Preserve semantic features on
build_rpgrebuild and prune.rpgignorefiles (#36) - MCP tool count: 17 → 20 (new:
context_pack,impact_radius,reconstruct_plan)
- Scope auto-lift rules by language to prevent cross-language collisions (#42)
- Reconstruction Scheduler —
reconstruct_planbuilds dependency-safe execution batches for guided code reconstruction workflows (#34) - Validation improvements and documentation fixes (#34)
- Refactored rpg-mcp — Split monolithic
tools.rsinto focused modules:params.rs,types.rs,helpers.rs,server.rs - Test count: 379 → 446+
- LLM-Based Semantic Routing (Algorithm 4) — Two new MCP tools (
get_routing_candidates,submit_routing_decisions) let the connected agent perform semantic hierarchy placement decisions. Entities are routed via LLM judgment rather than Jaccard similarity alone. Persisted pending state (.rpg/pending_routing.json) with graph revision protection for crash safety and stale-decision rejection. - Three-Zone Drift Judgment (Algorithm 3) — Configurable drift thresholds split
re-lifted entities into three zones:
drift < 0.3(ignore): minor edit, in-place update0.3 <= drift <= 0.7(borderline): surfaced for agent review via routing candidatesdrift > 0.7(auto-route): automatically queued for re-routing New config options:drift_ignore_threshold,drift_auto_threshold.
- Embedding-Based Semantic Search — Feature-level embeddings via
fastembed+ BGE-small-en-v1.5 (384 dimensions).search_nodefeatures mode now uses hybrid rank-based scoring (0.6 semantic + 0.4 lexical) with max-cosine similarity over per-feature vectors. Model auto-downloads on first search, runs fully offline afterward. - TOML-driven paradigm pipeline — Framework detection and entity classification via declarative TOML configs instead of hardcoded patterns (#28)
- 7 additional language parsers — C, C++, Go (enhanced), Java (enhanced), with per-language entity and dependency modules (#28)
- Semantic drift re-routing and feature-based hierarchy routing (#30)
- Full-scale paper fidelity documentation
- MCP tool count: 15 → 17 (new:
get_routing_candidates,submit_routing_decisions)
- Parser architecture refactored into per-language modules under
crates/rpg-parser/src/languages/ - Paradigm detection moved to
crates/rpg-parser/src/paradigms/ graph_revisionnow usesupdated_attimestamp instead ofbase_commitbuild_rpg,update_rpg,reload_rpgnow clear pending routing and invalidate embeddings- Test count: 275 → 379+
- Windows
build.rspath escaping and dropped Intel Mac from release matrix
- Redux Toolkit frontend adapter for TypeScript/React/Next.js — extracts
createSlice,createAsyncThunk, RTK Query hooks, and store configuration as first-class entities (#26) - Benchmark comparison analysis (
benchmarks/comparison.md) - Use cases guide (
use_cases.md)
.rpgignoresupport — exclude files from the RPG graph using gitignore-style patterns (#23)- Rebuilt RPG graph with full semantic hierarchy and 100% lifting coverage
- Updated benchmark results for 652 entities, 39 queries
- Enhanced TS/JS parser for React/Next.js patterns — JSX components, hooks, pages, layouts, API routes (#15)
- Per-file language detection in lifting for mixed-language projects (#21)
- Scoped dependency resolution during lifting (#21)
- Entity IDs correctly rekeyed on file rename during incremental update (#19)
- New entities from renamed files receive hierarchy assignments (#19)
- npm publish made idempotent to avoid false-failure CI status (#14)
- Aligned MCP synthesis instructions with file synthesis prompt (#17)
- Fixed stale benchmark data (#17)
- Paper alignment improvements — closer match to Algorithms 1-4 from the paper (#11)
- Deterministic edge ordering in serialized graph output (#11)
- Improved hierarchy construction prompts
- Qualified entity IDs — use
file:Class::methodformat to resolve merged-key coverage ceiling where entities from different files shared names (#8) - 100% lifting coverage now achievable (557/557 entities)
- Deterministic JSON serialization — all maps use
BTreeMapfor reproduciblegraph.jsonoutput across runs (#6)
- Multi-repo setup instructions in README (#4)
- Auto-preserve semantic features on
build_rpg— previously, rebuilding the graph would discard all lifted features. Now, features from the old graph are automatically merged into the new graph for entities that still exist (#2) - Collapsed nested if statements to satisfy clippy
- npm publish in release workflow (CI)
- npm OIDC trusted publishers support
Initial npm release. Same code as v0.1.0, published to npm registry.
Initial public release. Independent Rust implementation of the RPG-Encoder framework described in arXiv:2602.02084.
- Semantic Lifting (Phase 1) — Parse code with tree-sitter, enrich entities with
verb-object features via the connected coding agent's MCP interactive protocol
(
get_entities_for_lifting→submit_lift_results) - Structure Reorganization (Phase 2) — Agent discovers functional domains and builds
a 3-level semantic hierarchy (
build_semantic_hierarchy→submit_hierarchy) - Artifact Grounding (Phase 3) — Anchor hierarchy nodes to directories via LCA algorithm, resolve cross-file dependency edges (imports, invocations, inheritance)
- 8 languages via tree-sitter: Python, Rust, TypeScript, JavaScript, Go, Java, C, C++
- Per-language entity extraction (functions, classes, methods, structs, traits, interfaces)
- Per-language dependency resolution (imports, calls, inheritance, trait impls)
- Git-diff-based incremental updates (Algorithms 2-4 from the paper)
- Deletion pruning with hierarchy cleanup
- Modification with semantic drift detection (Jaccard distance)
- Structural entity insertion with dependency re-resolution
- Modified entities tracked for agent re-lifting
- search_node — Intent-based search across 3 modes: features, snippets, auto
- fetch_node — Entity details with source code, dependencies, hierarchy context; V_H hierarchy node fetch support
- explore_rpg — Dependency graph traversal (upstream/downstream/both) with configurable depth and edge filtering by kind (imports, invokes, inherits, contains)
- rpg_info — Graph statistics, hierarchy overview, per-area lifting coverage
- Cross-view traversal between V_L (code entities) and V_H (hierarchy nodes)
- TOON (Token-Oriented Object Notation) serialization for token-efficient LLM output
- 15 tools:
build_rpg,search_node,fetch_node,explore_rpg,rpg_info,update_rpg,lifting_status,get_entities_for_lifting,submit_lift_results,finalize_lifting,get_files_for_synthesis,submit_file_syntheses,build_semantic_hierarchy,submit_hierarchy,reload_rpg - Semantic lifting via connected coding agent — no API keys, no local LLMs, no setup
- Staleness detection on read-only tools (prepends
[stale]notice when graph is behind HEAD) - Auto-update on server startup when graph is stale (structural-only, sub-second)
- Commands:
build,update,search,fetch,explore,info,diff,validate,export,hook --include/--excludeglob filtering for builds--sincecommit override for incremental updates- Pre-commit hook:
rpg-encoder hook install(auto-updates and stages graph on commit) - Graph export as DOT (Graphviz) or Mermaid flowchart
- Graph integrity validation
- RPG graph committed to repos (
.rpg/graph.json) — collaborators get instant semantic search without rebuilding - Self-contained
.rpg/.gitignore(ignoresconfig.toml) - Optional zstd compression for large graphs
.rpg/config.tomlwith sections:[encoding],[navigation],[storage]- Environment variable overrides (
RPG_BATCH_SIZE,RPG_SEARCH_LIMIT, etc.) - Feature normalization: trim, lowercase, sort+dedup per paper spec
- Modular crate architecture: rpg-core, rpg-parser, rpg-encoder, rpg-nav, rpg-cli, rpg-mcp
- Clean
cargo clippy --workspace --all-targets -- -D warnings - Clean
cargo fmt --all -- --check