Repository navigation
Releases: Trivyn/moosedev
Release list
v0.11.1
MOOSEDev v0.11.1
v0.11.1 is a distribution fix: release archives now ship the embedding model they have always required.
The problem
Every release through v0.11.0 shipped the embedding backend compiled into the binary but not the weights. ontologies/, skills/, and templates/ were bundled; models/ was not. On a fresh install the engine therefore fell through to downloading Snowflake Arctic-Embed-S (~133 MB) from Hugging Face on the first cold start.
That failed quietly. A backbone that cannot load is non-fatal by design — the server still starts, align_concepts and suggest_mappings report unavailable per call, and get_relevant_context falls back to lexical-only seeding. The one log line naming the cause was emitted on the moose target, which the default log filter excluded. An offline, air-gapped, or proxied install got degraded retrieval and no explanation.
On macOS it was worse: even a bundled models/ directory would not have been found. std::env::current_exe() there does not resolve symlinks, and both install channels put a symlink on PATH (Homebrew's bin/ shim, the install script's ~/.local/bin link), so the engine looked for the bundle beside the link rather than the real binary.
Fixes
- Release archives bundle the weights.
models/snowflake-arctic-embed-s/now ships beside the binary, packaged in CI from the engine's git-LFS copy. Nothing is downloaded on first run; embeddings are computed locally and MOOSEDev works fully offline. The download grows from roughly 19 MB to roughly 78 MB — a one-time cost that replaces a ~133 MB fetch from Hugging Face on first use. - Symlink-safe model resolution. The engine canonicalizes the executable path before looking for a bundled model, and honours a new
MOOSE_MODEL_DIR. MOOSEDev resolves its own install layout and hands the directory over, the same contract already used forMOOSE_ONTOLOGY_DIR. MOOSEDEV_MODEL_DIRpoints MOOSEDev at a directory containingmodels/, for source builds and custom layouts.- Backbone failures are visible. The default log filter is now
moosedev=info,moose=warn,rmcp=warn, so a model that fails to load says so instead of degrading in silence. - The release workflow asserts what it packaged. Checkout fetches LFS objects, and packaging fails if
model.safetensorsis missing, undersized, or still a git-LFS pointer stub — the failure mode that would otherwise ship a 133-byte text file as a model.
Upgrading
No MCP tools, HTTP routes, or record semantics changed.
The bundled weights are stored at half precision, where earlier installs embedded with full-precision weights downloaded from Hugging Face. The vector-store stamp records model identity and dimension (Snowflake/snowflake-arctic-embed-s, 384), both unchanged, so existing vector stores are not invalidated and will not rebuild. An installed store therefore keeps document vectors built at full precision while new queries are embedded at half precision.
That mixture was measured rather than assumed. Building the ontology vector store both ways and pairing all 37 vectors: cosine agreement is at worst 1 - 4.6e-7, with a largest per-component difference of 1.8e-4. No vector is bit-identical, so the difference is real, but it is far below the separation between ranked neighbours — and the dense channel only seeds a bounded symbolic expansion. Ranking is unaffected in practice.
To rebuild cleanly instead, delete the derived caches and restart — they regenerate from the graph:
rm -f .moosedev/ontology-vectors.db .moosedev/instance-vectors.dbWhat's Changed
Full Changelog: v0.11.0...v0.11.1
v0.11.0
MOOSEDev v0.11.0
v0.11.0 makes knowledge supersession more explicit and reviewable, while simplifying the Story page's asynchronous operation ownership.
Highlights
Explicit relation-aware supersession
supersede_decision can now reassert selected semantic relations on the replacement in the same atomic operation. Relations are never inherited automatically: the caller chooses every carried link, and the result reports semantic links from the superseded record that were not carried forward.
Ontology-declared inverse links are resolved and materialized with the selected relation, so replacements remain reachable from both sides of the graph without requiring separate relate calls. Lifecycle, provenance, and rationale relations are excluded from the omission report.
Ratification for high-stakes replacements
Constraint and AntiPattern replacements now default to proposed. Until a human accepts the proposal, the previous record remains authoritative and the replacement stays outside the current working set.
Pending supersessions include the old and new claims, a bounded structured diff, and an optional reason: later-decision, record-was-inaccurate, code-diverged, or scope-narrowed. Accepting a proposal atomically activates the replacement and retires the old record; rejecting it leaves the old record authoritative.
Default MCP recall and natural-language query paths exclude proposed and rejected records together with every semantic or inferred inverse edge incident to them. Superseded and deprecated records remain available to query for questions about project evolution, while sparql and get_relevant_context(include_history=true) retain explicit access to the complete audit history.
Rejecting a record proposal also rejects its rationale and pending link proposals in the same lifecycle transaction, so no orphaned inbox item can later resurrect a declined replacement.
ArchitecturalDecision, Lesson, Pattern, and Requirement replacements retain immediate acceptance by default. Rust callers may explicitly override replacement status where the API permits it.
Story operation ownership
Story generation and editor operations now share an internal useStoryGeneration hook. The refactor centralizes cancellation tokens, stale-operation ownership, duplicate-action guards, busy and assisting state, saves, publication, and reload behavior while preserving the existing Story UI and HTTP surface.
Deep-link navigation continues to disown stale work immediately, and late responses cannot overwrite a newly selected Story or leave controls permanently disabled.
Compatibility
No MCP tools or HTTP routes were removed.
The MCP supersede_decision input gained optional relations and reason fields. Existing calls remain valid. The legacy Rust supersede_decision API keeps its transaction-only behavior and does not trigger whole-graph semantic enrichment; relation omission reporting is opt-in through the relation-aware API.
The principal behavior change is intentional: superseding a Constraint or AntiPattern without an explicit status now creates a pending proposal instead of an immediately authoritative replacement. Other record classes keep the v0.10 behavior.
Story recipe formats and public Story endpoints are unchanged; the hook extraction is internal to the web client.
Upgrading
No manual data migration is required. The committed knowledge graph remains authoritative, and pending supersessions appear in the existing ratification inbox.
Agents that supersede records should inspect the reported links that were not carried and pass the desired subset through relations. Clients should also handle the proposed result for Constraint and AntiPattern replacements and direct a human to the inbox for acceptance or rejection.
When code diverges from an accepted Constraint or AntiPattern, do not assume that the running code supersedes the record. Unless a recorded decision supports the divergence, treat the record as authoritative and the code as the defect to investigate.
What's Changed
Full Changelog: v0.10.0...v0.11.0
v0.10.0
MOOSEDev v0.10.0
v0.10.0 introduces Story mode, trusted CodeEntity source views, and LLM narration safeguards.
Highlights
Story mode
The workbench can now turn an entity or topic's connected project knowledge into a cohesive, evidence-backed Story. Stories include deterministic chronology, lifecycle-aware evidence, code anchors, explicit knowledge gaps, and symbolic comprehension checks.
Story works without an LLM. A configured OpenAI-compatible model can polish the narration, while the graph-selected evidence, chronology, gaps, and checks remain under symbolic control. Generated Stories can be saved as draft or published recipes; recipes contain presentation metadata and references, not authoritative project claims.
Trusted CodeEntity context
CodeEntity record pages now show indexed signatures, locations, and bounded source previews, with links from knowledge-bearing editor hovers into the exact entity's Story.
Source text is served only when the current index can prove its file and definition location. Stale, changed, out-of-repository, or otherwise unverifiable source is withheld with a reindex explanation rather than approximated.
Code-knowledge hygiene
Batch minting and comprehension-debt coverage now exclude public struct fields, whose rationale normally belongs to their containing type. moosedev mint also reports live but out-of-scope CodeEntities explicitly.
A conservative offline pruning example is included for removing only out-of-scope entities that are both unannotated and unreferenced.
Ontology-vector storage now matches the current MOOSE layout. Derived vector caches carry an explicit schema stamp and rebuild automatically when stale, unstamped, incompatible, or based on different ontology/model inputs.
Compatibility
No MCP tools or existing HTTP routes were removed. Story and trusted-source HTTP routes are additive, and existing record and debt responses gained additive fields.
Rust code embedding the moosedev crate should note:
LlmConfig::from_env()now returnsanyhow::Result<LlmConfig>.LlmConfiggainedcontext_window_tokensandstructured_output.MintPlangainedout_of_scope.- Invalid
MOOSEDEV_LLM_CONTEXT_WINDOW_TOKENSorMOOSEDEV_LLM_STRUCTURED_OUTPUTvalues now fail startup. - Parsers that consume the human-readable mint summary must tolerate its appended
out-of-scope=field.
Upgrading
Re-run the code index to enable trusted source previews and current Story line anchors:
moosedev indexOntology-vector caches require no manual migration; MOOSEDev rebuilds incompatible caches automatically.
Story recipe schemas v1 and v2 remain readable without modifying their files. The next successful save migrates a recipe to schema v3.
Source maintainers with the private MOOSE sibling checkout can optionally clean up CodeEntities left by an older mint scope. Stop the daemon and review the supplied dry run before applying any deletion:
cargo run --release --locked --example prune_out_of_scope_code_entities
cargo run --release --locked --example prune_out_of_scope_code_entities -- --applyThe prune retains every referenced or annotated entity.
What's Changed
- New approve-spec skill and such. by @rhinoman in #20
- NeSy 2026 paper benchmark support by @rhinoman in #21
- Updates to work with MOOSE 0.8.0 changes by @rhinoman in #22
- Story mode by @rhinoman in #26
Full Changelog: v0.9.0...v0.10.0