chore(release): v2.0.6 "Composer" — rebuild + version bump + CHANGELOG
Bumps vestige-core + vestige-mcp + @vestige/dashboard +
vestige-mcp-server + @vestige/init from 2.0.5 → 2.0.6, regenerates the
Cargo.lock, rebuilds the dashboard with the new events.ts handlers +
intentions page fix baked in, and writes the v2.0.6 "Composer" entry
to CHANGELOG.md.
Release contents:
- fix(dashboard): intentions page priority + trigger rendering
(commit 9df63de)
- feat(dashboard): wire 6 graph event handlers — suppress, unsuppress,
Rac1 cascade, Connected, ConsolidationStarted, ImportanceScored
(commit f085cfd)
- feat(mcp): opt-in VESTIGE_SYSTEM_PROMPT_MODE=full composition mandate
(commit 7d7a7c2)
- docs(readme): v2.0.6 header + Intel Mac / Windows build-from-source
honesty (commit ede0a02)
Pre-push gates green: cargo test --workspace --release, cargo clippy
--all-targets -D warnings, svelte-check (580 files 0 errors), vitest
(171/171). No regressions of merged PRs #18/20/22/24/26/28/29/30/32/33.
2026-04-18 18:33:04 -05:00
|
|
|
import"../chunks/Bzak7iHL.js";import{o as Te}from"../chunks/DeTA_5mp.js";import{f as xe,d as n,e as a,r as t,t as A,p as qe,a as Ie,h as c,g as s,s as U,u as X,O as Ne}from"../chunks/nyjtQ1Ok.js";import{s as v,d as je,a as $}from"../chunks/C4L78yoI.js";import{i as N}from"../chunks/B17metm1.js";import{e as Y,i as Z}from"../chunks/BilMa3tw.js";import{c as De,a as b,f as g}from"../chunks/B0IenmM-.js";import{s as ze}from"../chunks/Ckx7gB9J.js";import{s as P,r as Ge}from"../chunks/BBOOwRwQ.js";import{s as ee}from"../chunks/BgOFZ9jq.js";import{b as Re}from"../chunks/BOVu8he9.js";import{b as He}from"../chunks/DAhpUNCK.js";import{a as k,s as be}from"../chunks/C3ZC25l2.js";import{s as Oe,g as me}from"../chunks/D1EqE5Bq.js";import{b as _}from"../chunks/BAlzCWFX.js";import{s as ge,w as fe,a as Ve,i as We,m as Qe}from"../chunks/B6fk3AxI.js";import"../chunks/D_N1HvA5.js";const Be=()=>{const m=Oe;return{page:{subscribe:m.page.subscribe},navigating:{subscribe:m.navigating.subscribe},updated:m.updated}},Je={subscribe(m){return Be().page.subscribe(m)}};var Ue=g('<div class="flex items-center gap-2 rounded-full border border-[#A33FFF]/40 bg-[#A33FFF]/10 px-3 py-1.5 text-xs shadow-[0_0_12px_rgba(163,63,255,0.15)]" title="Memories currently under top-down suppression (Anderson 2025 SIF)"><div class="relative flex h-2 w-2 items-center justify-center"><span class="absolute inline-flex h-full w-full animate-ping rounded-full bg-[#A33FFF] opacity-75"></span> <span class="relative inline-flex h-2 w-2 rounded-full bg-[#A33FFF]"></span></div> <span class="font-medium text-[#E4C8FF]"> </span></div>');function Xe(m){const h=()=>k(ge,"$suppressedCount",M),[M,K]=be();var L=De(),j=xe(L);{var D=f=>{var F=Ue(),d=n(a(F),2),u=a(d);t(d),t(F),A(()=>v(u,`Actively forgetting ${h()??""} ${h()===1?"memory":"memories"}`)),b(f,F)};N(j,f=>{h()>0&&f(D)})}b(m,L),K()}var Ye=g('<a><span class="text-base w-5 text-center"> </span> <span class="hidden lg:block"> </span> <span class="hidden lg:block ml-auto text-[10px] text-muted/50 font-mono"> </span></a>'),Ze=g('<div class="hidden lg:block pt-1"><!></div>'),Pe=g('<a><span class="text-lg"> </span> <span class="text-[9px]"> </span></a>'),et=g('<button class="w-full flex items-center gap-3 px-4 py-2.5 text-sm text-dim hover:text-text hover:bg-white/[0.04] transition"><span class="text-base w-5 text-center"> </span> <span> </span> <span class="ml-auto text-[10px] text-muted/50 font-mono hidden md:block"> </span></button>'),tt=g('<div class="px-4 py-6 text-center text-sm text-muted">No matches</div>'),at=g('<div class="fixed inset-0 z-50 flex items-start justify-center pt-[10vh] md:pt-[15vh] px-4 bg-void/60 backdrop-blur-sm"><div class="w-full max-w-lg glass-panel rounded-xl shadow-2xl shadow-synapse/10 overflow-hidden"><div class="flex items-center gap-3 px-4 py-3 border-b border-synapse/10"><span class="text-synapse text-sm">◎</span> <input type="text" placeholder="Navigate to..." class="flex-1 bg-transparent text-text text-sm placeholder:text-muted focus:outline-none"/> <span class="text-[10px] text-muted font-mono bg-white/[0.04] px-1.5 py-0.5 rounded">esc</span></div> <div class="max-h-72 overflow-y-auto py-1"><!> <!></div></div></div>'),st=g('<div class="ambient-orb ambient-orb-1" aria-hidden="true"></div> <div class="ambient-orb ambient-orb-2" aria-hidden="true"></div> <div class="ambient-orb ambient-orb-3" aria-hidden="true"></div> <div class="flex flex-col md:flex-row h-screen overflow-hidden bg-void relative z-[1]"><nav class="hidden md:flex w-16 lg:w-56 flex-shrink-0 glass-sidebar flex-col"><a class="flex items-center gap-3 px-4 py-5 border-b border-synapse/10"><div class="w-8 h-8 rounded-lg bg-gradient-to-br from-dream to-synapse flex items-center justify-center text-bright text-sm font-bold shadow-lg shadow-synapse/20">V</div> <span class="hidden lg:block text-sm font-semibold text-bright tracking-wide">VESTIGE</span></a> <div class="flex-1 py-3 flex flex-col gap-1 px-2"></div> <div class="px-2 pb-2"><button class="w-full flex items-center gap-2 px-3 py-2 rounded-lg text-xs text-muted hover:text-dim hover:bg-
|
feat(v2.0.5): Intentional Amnesia — active forgetting via top-down inhibitory control
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
2026-04-14 17:30:30 -05:00
|
|
|
${s(p)?"bg-synapse/15 text-synapse-glow border border-synapse/30 shadow-[0_0_12px_rgba(99,102,241,0.15)] nav-active-border":"text-dim hover:text-text hover:bg-white/[0.03] border border-transparent"}`),v(y,s(e).icon),v(E,s(e).label),v(l,s(e).shortcut)}),b(r,i)}),t(R);var H=n(R,2),_e=a(H);t(H);var ne=n(H,2),O=a(ne),oe=a(O),ie=n(oe,2),ye=a(ie,!0);t(ie),t(O);var V=n(O,2),W=a(V),we=a(W);t(W);var le=n(W,2),$e=a(le);t(le),t(V);var ke=n(V,2);{var Fe=r=>{var e=Ze(),p=a(e);Xe(p),t(e),b(r,e)};N(ke,r=>{D()>0&&r(Fe)})}t(ne),t(G);var Q=n(G,2),de=a(Q),Ce=a(de);ze(Ce,()=>h.children),t(de),t(Q);var pe=n(Q,2),ce=a(pe),ve=a(ce);Y(ve,17,()=>he,Z,(r,e)=>{const p=X(()=>te(s(e).href,M().url.pathname));var i=Pe(),o=a(i),y=a(o,!0);t(o);var x=n(o,2),E=a(x,!0);t(x),t(i),A(()=>{P(i,"href",`${_??""}${s(e).href??""}`),ee(i,1,`flex flex-col items-center gap-0.5 px-3 py-2 rounded-lg transition-all min-w-[3.5rem]
|
|
|
|
|
${s(p)?"text-synapse-glow":"text-muted"}`),v(y,s(e).icon),v(E,s(e).label)}),b(r,i)});var Ee=n(ve,2);t(ce),t(pe),t(z);var Ae=n(z,2);{var Me=r=>{var e=at(),p=a(e),i=a(p),o=n(a(i),2);Ge(o),He(o,l=>c(C,l),()=>s(C)),Ne(2),t(i);var y=n(i,2),x=a(y);Y(x,17,()=>s(T),Z,(l,w)=>{var I=et(),B=a(I),Ke=a(B,!0);t(B);var J=n(B,2),Le=a(J,!0);t(J);var ue=n(J,2),Se=a(ue,!0);t(ue),t(I),A(()=>{v(Ke,s(w).icon),v(Le,s(w).label),v(Se,s(w).shortcut)}),$("click",I,()=>ae(s(w).href)),b(l,I)});var E=n(x,2);{var q=l=>{var w=tt();b(l,w)};N(E,l=>{s(T).length===0&&l(q)})}t(y),t(p),t(e),$("keydown",e,l=>{l.key==="Escape"&&c(d,!1)}),$("click",e,l=>{l.target===l.currentTarget&&c(d,!1)}),$("keydown",o,l=>{l.key==="Enter"&&s(T).length>0&&ae(s(T)[0].href)}),Re(o,()=>s(u),l=>c(u,l)),b(r,e)};N(Ae,r=>{s(d)&&r(Me)})}A(r=>{P(re,"href",`${_??""}/graph`),ee(oe,1,`w-2 h-2 rounded-full ${K()?"bg-recall animate-pulse-glow":"bg-decay"}`),v(ye,K()?"Connected":"Offline"),v(we,`${L()??""} memories`),v($e,`${r??""}% retention`)},[()=>(j()*100).toFixed(0)]),$("click",_e,()=>{c(d,!0),c(u,""),requestAnimationFrame(()=>{var r;return(r=s(C))==null?void 0:r.focus()})}),$("click",Ee,()=>{c(d,!0),c(u,""),requestAnimationFrame(()=>{var r;return(r=s(C))==null?void 0:r.focus()})}),b(m,se),Ie(),F()}je(["click","keydown"]);export{yt as component};
|