* fix: restore Intel Mac build via ort-dynamic + system libonnxruntime
Microsoft is discontinuing x86_64 macOS ONNX Runtime prebuilts after
v1.23.0, so ort-sys 2.0.0-rc.11 can't ship an Intel Mac binary and never
will. Previous Intel Mac attempts kept dying in the ort-sys build script
with "does not provide prebuilt binaries for the target x86_64-apple-darwin
with feature set (no features)." Issue #41 was the latest casualty.
Fix: route Intel Mac through the ort-dynamic feature path (runtime dlopen
against a system libonnxruntime installed via Homebrew). This sidesteps
ort-sys prebuilts entirely and works today.
Changes:
- crates/vestige-core/Cargo.toml: split `embeddings` into code-only vs
backend-choice. The embeddings feature now just pulls fastembed + hf-hub
+ image-models and activates the 27 #[cfg(feature = "embeddings")] gates
throughout the crate. New `ort-download` feature carries the
download-binaries-native-tls backend (the historical default). Existing
`ort-dynamic` feature now transitively enables `embeddings`, so the
cfg gates stay active when users swap backends.
Default feature set expands `["embeddings", ...]` -> `["embeddings",
"ort-download", ...]` so existing consumers see identical behavior.
- crates/vestige-mcp/Cargo.toml: mirrors the split. Adds `ort-download`
feature that chains to vestige-core/ort-download, keeps `ort-dynamic`
that chains to vestige-core/ort-dynamic. Both transitively pull
`embeddings`. Default adds `ort-download` so `cargo install vestige-mcp`
still picks the prebuilt-ort backend like before.
- .github/workflows/ci.yml: re-adds x86_64-apple-darwin to the
release-build matrix with `--no-default-features --features
ort-dynamic,vector-search`. Adds a `brew install onnxruntime` step that
sets ORT_DYLIB_PATH from `brew --prefix onnxruntime`.
- .github/workflows/release.yml: re-adds x86_64-apple-darwin to the
release matrix with the same flags + brew install step. The Intel Mac
tarball now also bundles docs/INSTALL-INTEL-MAC.md so binary consumers
get the `brew install onnxruntime` + ORT_DYLIB_PATH prereq out of the
box.
- docs/INSTALL-INTEL-MAC.md: new install guide covering the Homebrew
prereq, binary install, source build, troubleshooting, and the v2.1
ort-candle migration plan.
- README.md: replaces the "Intel Mac and Windows build from source only"
paragraph with the prebuilt Intel Mac install (brew + curl + env var)
and a link to the full guide. Platform table updated: Intel Mac back
on the "prebuilt" list.
Verified locally on aarch64-apple-darwin:
- `cargo check --release -p vestige-mcp` -> clean (default features)
- `cargo check --release -p vestige-mcp --no-default-features
--features ort-dynamic,vector-search` -> clean
Runtime path on Intel Mac (verified on CI):
brew install onnxruntime
export ORT_DYLIB_PATH=$(brew --prefix onnxruntime)/lib/libonnxruntime.dylib
vestige-mcp --version
Fixes#41. Long-term plan (v2.1): migrate to ort-candle pure-Rust backend
so no system ONNX Runtime dep is needed on any platform.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(ci): drop unused brew install + ORT_DYLIB_PATH from CI steps
Build is a cross-compile (macos-latest runner is Apple Silicon targeting
x86_64-apple-darwin) and ort-load-dynamic doesn't link libonnxruntime at
build time — only at runtime via dlopen. So the brew install step and
ORT_DYLIB_PATH export were ceremony without payload. Removed to cut CI
time. Runtime setup remains documented in docs/INSTALL-INTEL-MAC.md for
end users installing the tarball on their own Intel Mac.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ci: run release-build on PRs too — catch Intel Mac regressions pre-merge
Previously release-build was gated behind `github.ref == 'refs/heads/main'`,
so the Intel Mac, aarch64-apple-darwin, and Linux release targets were only
validated AFTER merge to main. If someone broke the Intel Mac cross-compile
by touching feature flags or Cargo dependencies, we'd only find out when
the release tag was cut and the job exploded on main. Extending the guard
to also fire on pull_request means regressions surface in the PR status
check instead of on a release branch.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two unrelated upstream issues were stopping two of our four release targets.
Root-caused and fixed both so v2.0.5 ships on 100% of supported platforms.
Windows MSVC (new regression in v2.0.5):
`usearch 2.24.0` introduced a `memory_mapping_allocator_gt` template
that references the POSIX `MAP_FAILED` macro from <sys/mman.h>, which
doesn't exist on MSVC. Confirmed upstream as unum-cloud/usearch#746
(open). The bump from 2.23.0 happened during the v2.0.5 Cargo.lock
refresh. Pinned `usearch = "=2.23.0"` in crates/vestige-core/Cargo.toml
with a comment linking the upstream issue. Unpin when the fix lands.
Intel Mac (latent bug exposed by the ci workaround):
Root cause was feature-propagation, not the release workflow.
crates/vestige-mcp/Cargo.toml hardcoded
`features = ["bundled-sqlite", "embeddings", "vector-search"]` on its
vestige-core dep, which forcibly enabled vestige-core's embeddings
feature regardless of whether vestige-mcp's own `embeddings` feature
flag was set. With `--no-default-features` at the top level (the old
Intel Mac ci workaround), vestige-mcp's feature flags turned off but
vestige-core's embeddings stayed on through the hardcoded list. That
pulled in fastembed -> ort-sys, but without any of the flags that
select ort-sys' backend binaries, so the ort-sys build script failed
with "does not provide prebuilt binaries for the target
x86_64-apple-darwin with feature set (no features)".
Fix:
- Drop `embeddings` and `vector-search` from the hardcoded features
list in crates/vestige-mcp/Cargo.toml. Leave only `bundled-sqlite`
as an always-on base feature. The existing
`embeddings = ["vestige-core/embeddings"]` /
`vector-search = ["vestige-core/vector-search"]` flag declarations
now actually gate those features as intended.
- Bump the vestige-core dep version ref 2.0.4 -> 2.0.5 (was stale).
- Drop `cargo_flags: "--no-default-features"` from the Intel Mac
target in .github/workflows/release.yml. The original reason for
that workaround was sidestepping the same ort-sys issue, but with
the feature-propagation bug fixed, Intel Mac now builds with full
default features the same way aarch64-darwin does on the same
macos-14 runner.
Verification:
- `cargo tree -p vestige-mcp --no-default-features -i fastembed`
-> "did not match any packages" (fastembed truly absent now)
- `cargo tree -p vestige-mcp --no-default-features -i ort-sys` -> same
- `cargo build --release -p vestige-mcp` -> clean, 1m 21s, usearch 2.23.0
Same v2.0.5 tag. Rust source code identical to 8178beb. Re-triggering
the release workflow via workflow_dispatch will rebuild all four
platforms and upload to the existing v2.0.5 release page.
First AI memory system to model forgetting as a neuroscience-grounded
PROCESS rather than passive decay. Adds the `suppress` MCP tool (#24),
Rac1 cascade worker, migration V10, and dashboard forgetting indicators.
Based on:
- Anderson, Hanslmayr & Quaegebeur (2025), Nat Rev Neurosci — right
lateral PFC as the domain-general inhibitory controller; SIF
compounds with each stopping attempt.
- Cervantes-Sandoval et al. (2020), Front Cell Neurosci PMC7477079 —
Rac1 GTPase as the active synaptic destabilization mechanism.
What's new:
* `suppress` MCP tool — each call compounds `suppression_count` and
subtracts a `0.15 × count` penalty (saturating at 80%) from
retrieval scores during hybrid search. Distinct from delete
(removes) and demote (one-shot).
* Rac1 cascade worker — background sweep piggybacks the 6h
consolidation loop, walks `memory_connections` edges from
recently-suppressed seeds, applies attenuated FSRS decay to
co-activated neighbors. You don't just forget Jake — you fade
the café, the roommate, the birthday.
* 24h labile window — reversible via `suppress({id, reverse: true})`
within 24 hours. Matches Nader reconsolidation semantics.
* Migration V10 — additive-only (`suppression_count`, `suppressed_at`
+ partial indices). All v2.0.x DBs upgrade seamlessly on first launch.
* Dashboard: `ForgettingIndicator.svelte` pulses when suppressions
are active. 3D graph nodes dim to 20% opacity when suppressed.
New WebSocket events: `MemorySuppressed`, `MemoryUnsuppressed`,
`Rac1CascadeSwept`. Heartbeat carries `suppressed_count`.
* Search pipeline: SIF penalty inserted into the accessibility stage
so it stacks on top of passive FSRS decay.
* Tool count bumped 23 → 24. Cognitive modules 29 → 30.
Memories persist — they are INHIBITED, not erased. `memory.get(id)`
returns full content through any number of suppressions. The 24h
labile window is a grace period for regret.
Also fixes issue #31 (dashboard graph view buggy) as a companion UI
bug discovered during the v2.0.5 audit cycle:
* Root cause: node glow `SpriteMaterial` had no `map`, so
`THREE.Sprite` rendered as a solid-coloured 1×1 plane. Additive
blending + `UnrealBloomPass(0.8, 0.4, 0.85)` amplified the square
edges into hard-edged glowing cubes.
* Fix: shared 128×128 radial-gradient `CanvasTexture` singleton used
as the sprite map. Retuned bloom to `(0.55, 0.6, 0.2)`. Halved fog
density (0.008 → 0.0035). Edges bumped from dark navy `0x4a4a7a`
to brand violet `0x8b5cf6` with higher opacity. Added explicit
`scene.background` and a 2000-point starfield for depth.
* 21 regression tests added in `ui-fixes.test.ts` locking every
invariant in (shared texture singleton, depthWrite:false, scale
×6, bloom magic numbers via source regex, starfield presence).
Tests: 1,284 Rust (+47) + 171 Vitest (+21) = 1,455 total, 0 failed
Clippy: clean across all targets, zero warnings
Release binary: 22.6MB, `cargo build --release -p vestige-mcp` green
Versions: workspace aligned at 2.0.5 across all 6 crates/packages
Closes#31
When memories are created, promoted, deleted, or dreamed via MCP tools,
the 3D graph now shows spectacular live animations:
- Rainbow particle burst + elastic scale-up on MemoryCreated
- Ripple wave cascading to nearby nodes
- Green pulse + node growth on MemoryPromoted
- Implosion + dissolution on MemoryDeleted
- Edge growth animation on ConnectionDiscovered
- Purple cascade on DreamStarted/DreamProgress/DreamCompleted
- FIFO eviction at 50 live nodes to guard performance
Also: graph center defaults to most-connected node, legacy HTML
redirects to SvelteKit dashboard, CSS height chain fix in layout.
Testing: 150 unit tests (vitest), 11 e2e tests (Playwright with
MCP Streamable HTTP client), 22 proof screenshots.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a second transport layer alongside stdio — Streamable HTTP on port
3928. Enables Claude.ai, remote clients, and web integrations to connect
to Vestige over HTTP with per-session McpServer instances.
- POST /mcp (JSON-RPC) + DELETE /mcp (session cleanup)
- Bearer token auth with constant-time comparison (subtle crate)
- Auto-generated UUID v4 token persisted with 0o600 permissions
- Per-session McpServer instances with 30-min idle reaper
- 100 max sessions, 50 concurrency limit, 256KB body limit
- --http-port flag + VESTIGE_HTTP_PORT / VESTIGE_HTTP_BIND env vars
- Module exports moved from binary to lib.rs for reusability
- vestige CLI gains `serve` subcommand via shared lib
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
P0 fixes:
- Add `vestige backup <path>` — full DB copy with WAL checkpoint flush
- Add `vestige export --format json|jsonl [--tags] [--since] <path>` —
paginated memory export with tag/date filtering
- Add `vestige gc --min-retention 0.1 [--max-age-days] [--dry-run] [--yes]`
— bulk cleanup of stale memories with safety prompts
- Fix apply_decay() scaling: batched pagination (500 rows/batch) with
explicit transactions instead of loading all nodes into memory
- Fix hidden MCP resources: memory://insights and memory://consolidation-log
now listed in resources/list (were implemented but undiscoverable)
P1 fixes:
- Add auto-consolidation on server startup: FSRS-6 decay runs in background
after 2s delay, only if last consolidation was >6 hours ago
- Add encryption at rest via SQLCipher feature flag: use --features encryption
with VESTIGE_ENCRYPTION_KEY env var (bundled-sqlite and encryption are
mutually exclusive)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two-pronged fix for cross-compilation:
1. git2 with vendored-openssl feature - compiles OpenSSL from source,
eliminating system dependency issues across all platforms
2. houseabsolute/actions-rust-cross@v1 - dedicated GitHub Action that
properly handles cross-compilation with Docker containers
Sources:
- https://github.com/rust-lang/git2-rs
- https://github.com/houseabsolute/actions-rust-cross
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace BGE-base-en-v1.5 with nomic-embed-text-v1.5
- 8192 token context window (vs 512 for BGE)
- Matryoshka representation learning support
- Fully open source with training data released
- Same 768 dimensions, no schema changes required
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
FSRS-6 spaced repetition, spreading activation, synaptic tagging,
hippocampal indexing, and 130 years of memory research.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>