v0.1.18 — reactive-completion roadmap complete
反应式完成路线图 — 全部 ship 完了
watch → RFC-0105 ✅
push → RFC-0106 ✅
subscribe → RFC-0107 ✅ (this release)
salsa → RFC-0108 ✅ (this release)
Added
RFC-0107 SUBSCRIBE — mycelium/subscriptionDelta scoped per-batch delta notifications
Agents register an Interest (Files / Symbols / Hyphae Selector) and receive only the slice of each batch that matches them. Three new MCP tools:
mycelium_subscribemycelium_unsubscribe(idempotent)mycelium_subscription_status
CLI face: mycelium watch --subscribe '<SPEC>' where SPEC is files:<globs> / symbols:<globs> / selector:<hyphae>.
Frozen-v1 wire shape per RFC-0107 §4. TTL + per-client cap + selector cap + dead-peer GC. (ii-strict) Selector removal semantics — no phantom removals.
RFC-0108 Salsa Phase 2 — mycelium/queryResultChanged reactive query subscriptions
Agents subscribe to a query result and receive a notification only when the value actually changes — Salsa-style backdated equality via BLAKE3-128 hash of canonical-JSON.
5 query kinds: selector / callers / callees / impact / context. Hybrid result shape: summary{added,removed} for set-shaped, new_result only for tree-shaped. 2 s default quiet-period; 200 ms eval-budget pause.
Additively bolted onto RFC-0107's subscription store — Interest::Query { query, min_interval_seconds } variant.
Fixed
- RFC-0107 SUBSCRIBE P1 safety: replace
RwLock::blocking_read()withtry_read()in async watch paths. Watch loop no longer panics on subscribe-contention. - Rust extractor now captures
Type::method()andcrate::mod::func()call sites (dogfood-found correctness bug — every scoped-path call site was silently dropped including allWatchEngine::*,Arc::clone, etc.).
Install
cargo install mycelium-rcig-cli
# or
npm install -g @mycelium/cli
# or
pip install mycelium-rcigQuality gate
- 1095 tests passing across 5 OS matrices
- Line coverage 90.15% (Charter §5.6 SLA)
- clippy
-D warnings+ rustfmt + security all clean
Note on ceremony recovery
v0.1.17 was published to crates.io / npm / PyPI but the git-side ceremony (main merge + tag) was incomplete due to a release.yml workflow_dispatch bug. v0.1.18 ceremony folds v0.1.17 → main and includes a retro-tag for v0.1.17 at the published commit.