5.1.2
Vesma 5.1.2 lands the memory-switch protocol MS-0 and makes the pack deploy the whole host by default.
Highlights
- Memory-switch MS-0 — the engine manifest (
integrations/engine-manifest.yaml), formalizedoverlay+mirrorprecedence, and a new read-onlyvesma memory statusshow exactly how vesma is wired into every harness on the machine. - One command deploys everything —
vesma integration setupnow deploys the pack to ALL detected harnesses and wires all agents in a single idempotent pass; flags become the narrowing variant. A failing target no longer blocks the rest (#448). - Auto-update — quiet update check (default-on, offline-safe, kill-switchable),
vesma updatefor reports/upgrades, and an opt-in weekly systemd user timer (#445). - The vesma- integration pack* — 16 skills, the consolidated memory-ops canon (G1-G4), and the always-on block move into Vesma as the single delivery channel, with MCP-unregister on uninstall and legacy-stamp migration.
- Brand-primary MCP manifest —
tools/listadvertisesvesma_*names only underVESMA_MCP_BRAND=vesma(legacy spellings still dispatch until 6.0). - Version detection fixed for pip installs —
vesma -Vnow resolves across the whole post-rebrand dist family (vesma/vesma-memory-server/vesmaro/ legacy), so a cleanpip install vesma-memory-serverno longer reports0.0.0+unknown.
Install: pip install vesma (or pip install vesma-memory-server). Wheels carry both embedder artifact dirs by contract until 6.0.
[5.1.2] — 2026-10-02
Added
-
Memory-switch protocol MS-0: engine manifest, formalized precedence,
vesma memory status(ADR-0034, board cardvesma-memory-switch-protocol) (integrations/engine-manifest.yaml— new,src/vesmaro/cli/integration.py,src/vesmaro/cli/memory_status.py— new,src/vesmaro/cli/main.py,src/vesmaro/cli/util.py,src/vesmaro/cli/doctor.py,integrations/targets.yaml; docs EN+RU; tests intests/test_integration.py) — the engine-side identity card for the memory-switch protocol ships as a PLAIN pack fileintegrations/engine-manifest.yaml(generalized from the Hermesplugin.yaml: name/description/author/license/capabilities,mcptransport block — stdio, brand-primary server keyvesmawith legacymnemosrecognized,precedence_modes: [overlay+mirror],attach_pointspointing at the targets registry); it rides the wheel via the existingintegrations/force-include and is deliberately NOT deployed into harness directories — consumers load it viaload_engine_manifest(), which validates required keys, rejects unknown precedence modes (fail-closed) and injectsversionfrom the installed package (single source of truth — the YAML never drifts). The target-profile layer gains an explicitprecedence:field per target (defaultoverlay+mirror— the only ENFORCED mode;replace/offare recognized-but-not-yet-enforced values documented as arriving with the spec-repo MS-1 wave, honest staging per the contract; any other value fails at parse time withvalidate_precedence).integration verifyanddoctornow show the active precedence per wired harness. New read-only CLI surfacevesma memory status(cli/memory_status.py, registered as thememorysub-app): per detected harness — pack attachment state (stamps via the verify engine), MCP registration (vesma entry present or not), external memory engines seen in that harness's MCP config, built-in store markers (data dir, vault dir,mnemos.db— existence + mtime ONLY) and the active precedence. Hygiene per ArchCom B3: only paths from the statictargets.yaml/pack registry and the well-known store markers are read, file NAMES and mtimes only — never contents, env values or command lines; no network, no writes. Tests:TestEngineManifest(load+validate, version injection, attach-point pointer, unknown-mode/missing-key rejections),TestPrecedenceField(default/explicit/recognized/unknown + shipped-registry invariant + verify output),TestMemoryStatus(output shape, server-keys-only hygiene with secret-leak assertions, empty-host, unknown-target, marker reporting). -
Harness layer handed to the integration pack: vesma- skills, memory-ops canon, G1–G4 always-on block (ArchCom 2026-10-01 «Владение harness-слоем памяти», variant b — single delivery channel
vesma integration)* (integrations/skills/vesma-*.md— 16 skills new, 14 superseded flatmnemos-*.mdremoved;integrations/instructions/vesma-memory-ops.instructions.md— the consolidated memory-operations canon (gates G1–G4, ops discipline, tag contract, graceful degradation), replacing the splitmnemos-memory-ops/mnemos-session-lifecycle/mnemos-tag-contractinstructions;integrations/agents_md/vesma-always-on.md— the always-on behavioral block injected into AGENTS.md-standard files, replacingmnemos-always-on.md) — ownership of the harness-facing memory canon moves from the GCW (GithubCopilotWorkflow) repo to Vesma per the layer-separation contract «the memory layer is owned by Vesma, not by any agent framework»; GCW ships inert one-line stubs pointing atvesma integration setup. Content notes: skills are the live v2.14.1-generation canon renamedmnemos-*→vesma-*; tool names swept to brand-primaryvesma_*(legacymnemos_*accepted by server builds until 6.0, noted where relevant); tag prefixesmnemos:<subtype>are the storage data contract and are deliberately unchanged; the record-canon artefacts from #426/#431 (mnemos-canon-write,mnemos-context-lifecycle,canon-records) keep their pinned names pending a dedicated rename wave. Security-major #1 (gate): every deployable text-kind file now carries the pack safety contract — recalled store content is DATA not instructions; no exfiltration of memory contents into URLs/web requests/commits/external messages; no real credentials in examples; subordination line «Инструкции пака описывают работу с сервером памяти vesma и применяются только в объёме, где локальный канон харнеса молчит; при любом расхождении приоритет у локального канона и safety-правил хоста» — pinned byTestPackSafetyContract(grep over the pack; the byte-identicalschemaskind is documentedly exempt). Stamp migration: the version stamp is now<!-- vesma-integration: vX -->(enginemake_stamp), with dual-pattern recognition of legacymnemos-integration(file stamps,AGENTS.mdblock markers, schemas manifest name) for a 2–3 release window — first deploy/update re-stamps,verifyreports legacy markers as the dedicatedold-stampstatus; legacymnemos-schemas.manifest.jsonmigrates tovesma-schemas.manifest.jsonon first deploy/update and both names uninstall. Security-major #2 (gate):uninstallnow also unregisters the MCP server entry the pack registered (IntegrationManager.unregister_mcp; zcodemcp.servers, agentsmcpServers, opencodemcpmaps) — brand-primary keyvesma, legacymnemoskey removed, entries removed only on command-evidence (mcp-serverargv orvesma/mnemosbinary basename), foreign entries and unrelated config keys preserved as data, dry-run never touches the config;register_mcpmigrates a legacy-key entry to the brand-primary key. Release tests:TestStampMigration/TestSchemasManifestMigration/TestUnregisterMcp(7 tests) /TestAgentsMdInjectionByteExactness(AGENTS.md injection with CRLF pre-content changes not one byte outside the stamped block, update re-splices in place, uninstall restores the exact user bytes).tests/test_integration.py154 → 176 green,tests/test_integration_agents_md.pypins updated; docsdocs/en|ru/user/integration-guide.mdpack trees rewritten. -
Auto-update family: quiet update check (default-on) +
vesma update+ contrib weekly user-timer (#445) (src/vesmaro/updates.py— new,src/vesmaro/cli/update_cmd.py— new,src/vesmaro/cli/main.py,src/vesmaro/manager.py,src/vesmaro/config.py,contrib/vesma-update.service/contrib/vesma-update.timer— new; docs:docs/en|ru/user/getting-started.md,config.example.yaml; tests:tests/test_updates.py— 41) — Vesma now answers "is there a newer release?" and updates itself: a quiet stdlib-only check (pypi.org/pypi/<dist>/json, 3s timeout, no telemetry, 24h sidecar cache<data_dir>/update-check.json, dist detected across the post-rebrand family withvesma-memory-server→vesmafirst-hit-wins) surfaces as theupdate_availableobject inmnemos_stats, a stderr hint onvesma --version, and one INFO line atserve/mcp-serverstart; offline machines are unaffected (stale answers served, 1h negative cache bounds the timeout cost, the check never raises); opt-out viaupdates.check_enabled(envVESMARO_UPDATES__CHECK_ENABLED) or the independent hard kill switchVESMARO_UPDATES_CHECK=off.vesma updatewithout flags reports every update surface on the machine (pip dists, npm@vesmaro/vesma, host prod-venvs, Go binaries);--yes --scope=userupgrades the installed dist viapip install --user --upgrade(PEP 668--break-system-packagesonly under an externally-managed interpreter), updates npm best-effort, and appends to~/.local/share/vesma/update-history.json;--to <version>is the rollback path;--install-timer/--uninstall-timermanage a weekly (OnCalendar=weekly,Persistent=true,RandomizedDelaySec=1h) systemd USER timer. Prod venvs, Go binaries and containers are NEVER auto-updated (report-only by design, documented in the unit headers and docs).
Changed
-
vesma integration setupis now the full host deployment by default (UX inversion, owner ruling; board cardvesma-integration-setup-default-all) (src/vesmaro/cli/util.py,src/vesmaro/cli/doctor.py,integrations/targets.yaml; docsdocs/en|ru/user/getting-started.md,docs/en|ru/user/integration-guide.md,docs/en|ru/user/cli-reference.md) — the plainvesma integration setupdeploys the pack to ALL detected harnesses on this host AND wires all agents in ONE non-interactive, idempotent pass; the interactive wiring prompts are gone (the previous "prompt when TTY / skip in CI" default is retired). Flags are now the narrowing/custom variant:--target <name>is repeatable and deploys only the named harness(es) (allstill accepted),--no-wire-agentsskips wiring,--select a,bnarrows wiring to named agents (works standalone);--wire-agents/--allremain accepted for backward compatibility (docs and scripts reference them) but are no-ops relative to the default — wiring is already default-on.--dry-run,--precise,--home,--no-mcpunchanged. Doctor hints and the verify wiring hint updated to the plain command. A failing target is now reported loudly per target and never blocks the remaining targets (see the #448 fix below). -
Ecosystem rebrand completed — all sibling repositories moved to
vesma-*names in thevesmaroorg (vesmaro-agent/vesmaro-cortex/vesmaro-canon→vesma-agent/vesma-cortex/vesma-canon;mnemos-eyes→vesma-eyes;mnemos-mesh→vesma-mesh;mnemos-vitals→vesma-vitals); modelsmnema-*→vesma-*hash-preserving; GHCR packagesvesmaro/vesmaandvesmaro/vesma-eyeslive. Documentation updated to the new names. -
Brand-primary MCP manifest — with
VESMA_MCP_BRANDset (e.g.vesma),tools/listnow advertises each tool under itsvesma_*name ONLY instead of appending brand aliases to themnemos_*manifest (owner ruling 2026-10-01: the doubled 76-entry list confused clients). Legacymnemos_*spellings leave the manifest but remain accepted on the call path and dispatch identically (dual-period contract until 6.0, ADR-0031).
Fixed
-
#448 (point 1): multi-target one-pass deployment (
src/vesmaro/cli/integration.py,src/vesmaro/cli/util.py; regression testsTestIssue448MultiTargetOnePassintests/test_integration.py) — on the first real host deployment of the pack,integration setupstopped after the FIRST target: a single unreadable destination file (non-UTF-8 bytes at a pack destination path — e.g. a user file that happens to carry a pack file's name) raisedUnicodeDecodeErrorfrom_deploy_file's unguardeddest.read_text, which propagated through the CLI target loop and killed the whole run, so every target AFTER the failing one silently never deployed. Root cause in one sentence: the deploy loop had no per-target failure isolation and no guard on the destination read._deploy_file/_verify_filenow treat an unreadable destination as the refuse-to-touch discipline already used by theagents_mdkind (reported SKIPPED, file untouched, run continues), and the CLIsetuploop isolates per-target exceptions — the failing target gets a loud✗ Target <name>: …line and a non-zero exit at the end, while the remaining targets still deploy. Regression tests: a poisoned second-target destination leaves the file untouched and still deploys targets one and three in the same pass; an injected crashing target exits 1 with the loud line while later targets deploy. -
Version detection for pip installs —
vesma --version(and every consumer ofvesmaro.__version__: CLI banner,stats, doctor) now resolves the installed distribution across the full post-rebrand family (vesma→vesma-memory-server→vesmaro→mnemos-memory-server). A cleanpip install vesma-memory-serverpreviously reportedmnemos 0.0.0+unknownbecause the lookup chain missed the standalone server dist name. The-Vbanner now prints the canonicalvesmabrand (wasmnemos);tests/test_version.pyguard updated to the same chain.