Releases: userFRM/rpg-encoder
Releases · userFRM/rpg-encoder
v0.8.3 — drift maintenance + RPG-first tool preference + sub-agent dispatch
[0.8.3] - 2026-04-14
Added
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 to
lifting_statusfor the full recommendation.submit_lift_resultsNEXT action is now scale-aware — when remaining
work ≥100 entities, it redirects the caller tolifting_status
instead 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.md
explaining 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, and
slice_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 across
server.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).
Changed
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~12K
figure, 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 thatrpg-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 to
RpgConfig::default()rather than preserving the previous project's
config. Same-projectreload_rpgpreserves the previous config on
parse failure (different flow, different correctness requirement).
Fixed
lifting_statuspreviously reportedGraph is completeas soon as
every entity had some features, ignoring stale features from
modified sources. The state machine now considers
remaining + 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_rpg
afterward.set_project_rootandreload_rpgpreviously used
unwrap_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 counted
Moduleentities against the unlifted total, while
lifting_statusandget_entities_for_liftingexclude them. The
two could disagree by hundreds of entities on large codebases,
tripping the delegation threshold inbuild_rpgwhen
lifting_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 what
lifting_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_status
report 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 acquires
hierarchy_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 single
hierarchy_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 concurrent
build_rpg/update_rpgcould panic onsession.as_mut().unwrap(),
and a graph-replace race where a concurrentset_project_root
could panic on `graph....
v0.8.2
What's Changed
Full Changelog: v0.8.1...v0.8.2
v0.8.1
v0.8.0
What's Changed
- feat: add Claude Code skill and Gemini CLI extension by @userFRM in #68
- fix: handle root scope in shared search by @VooDisss in #70
- feat: auto-staleness, semantic snapshot, MCP annotations by @userFRM in #71
- overhaul: cleanup, Claude Code hooks, README rewrite by @userFRM in #72
- feat: hot spots in snapshot + tool waste marketing by @userFRM in #73
- feat: auto_lift MCP tool — autonomous lifting via external LLM API by @userFRM in #74
- fix: deadlock, graph loss, API key leak (audit criticals) by @userFRM in #75
- fix: address all remaining audit findings (#4, #5, #6, #7, #14) by @userFRM in #76
- fix: address all Codex audit findings (8/8) by @userFRM in #77
- release: v0.8.0 — version bump, CHANGELOG, honest docs by @userFRM in #78
- chore: sync npm package.json to v0.8.0 by @userFRM in #79
- fix: release CI — macOS Intel + aarch64-linux build failures by @userFRM in #80
- fix: drop x86_64-apple-darwin target (macos-13 deprecated) by @userFRM in #81
Full Changelog: v0.7.0...v0.8.0
v0.7.0
What's Changed
- feat: implement rpg_analyze_health tool - Code Health Meter by @VooDisss in #59
- PR: Add detect_cycles MCP Tool for Circular Dependency Detection by @VooDisss in #61
- refactor: clean up cycles.rs code quality by @userFRM in #65
- feat: add workspaceFolder variable expansion to MCP server by @VooDisss in #63
- feat: autonomous LLM-driven lifting (rpg-lift crate) by @userFRM in #67
Full Changelog: v0.6.7...v0.7.0
v0.6.7
Full Changelog: v0.6.6...v0.6.7
v0.6.6
Full Changelog: v0.6.5...v0.6.6
v0.6.5
What's Changed
Full Changelog: v0.6.4...v0.6.5