Breakthrough bloomnet|rusty-bloomnet

Stella + Peon Rust migration: 6,452 lines across 4 crates in one session

Three separate Node/Python projects (context-curator, PeonNotify, hooks) with no shared infrastructure -> 4 unified Rust crates (events 2,110 LOC, hooks 1,838 LOC, stella 1,075 LOC, peon 1,429 LOC), 132 new tests, 411 total, zero clippy warnings

breakthroughrustmigration
Key Metric
Before
Three separate Node/Python projects (context-curator, Peo...
After
4 unified Rust crates (events 2,110 LOC, hooks 1,838 LOC,...

Changelog

DateSummary
2026-04-17Expanded to full breakthrough spec (Context, Impact, Source)
2026-04-04Original migration work

Context

Stella (context curation) and Peon (hooks: sound dispatch, CodeGuard, watchdog, DocGuard) were living as three separate codebases across Node and Python. Each had its own event schema, test harness, and deploy path. The shared hook infrastructure was duplicated three ways. Every change required edits in multiple repos, and drift showed up the first time a session fired events from two of them at once.

The migration goal: consolidate into a single Rust workspace with one event schema, one hook runtime, and one test surface. No new features. Same behavior, same hook contract, one codebase.

What Changed

Complete port of three independent projects into rusty-bloomnet as 4 new crates, written in a single session across 7 phases:

  1. rusty-bloomnet-events (2,110 LOC): the unified BloomEvent schema, JSONL writer/reader, aggregation, migration helpers.
  2. rusty-bloomnet-hooks (1,838 LOC): shared infra for I/O, config, state, cooldowns, API calls, audio, linter, process spawning.
  3. rusty-bloomnet-stella (1,075 LOC): classify, evaluate, compact-guard, plan-guard, skill-sync hooks.
  4. rusty-bloomnet-peon (1,429 LOC): dispatch, codeguard, docguard, watchdog, obsidian companions.

Every hook still reads the same stdin JSON and writes the same BloomEvent output. The Claude Code config points to the new binaries, nothing else changes upstream.

Impact

  • Single source of truth for the BloomEvent schema. No more drift between Stella and Peon on event field semantics.
  • Typed hook I/O catches missing required fields at compile time. Python/Node versions masked these at runtime.
  • Shared state layer (cooldowns, config loading) stops duplicated logic across five hook binaries.
  • 411 workspace tests, 132 net new. Zero clippy warnings. Reproducible cargo build replaces three different pip install / npm install procedures.
  • The migration unblocked vault-core and vault-cli, which depend on the event schema to attribute work to sessions.

Source

Migration work happened during a focused single-session sprint (PR #1 on rusty-bloomnet). Prior design was scoped in experiments/rusty-bloomnet/2026-03-28-stella-peon-consolidation-plan and validated against the event-schema contract before coding started.