Skip to content

MNEMOS 6.1.7

Latest

Choose a tag to compare

@perlowja perlowja released this 18 Aug 04:42
· 87 commits to master since this release

MNEMOS 6.1.7 is the current release of the 6.1 line. Pin :6.1 on container images to keep a fleet on identical code.

ghcr.io/ncz-os/mnemos:6.1              # amd64 + arm64
ghcr.io/ncz-os/mnemos-enterprise:6.1   # amd64, adds Oracle/Db2/MySQL drivers

Why upgrade

Nearly every fix in 6.1 belongs to one family: a guard existed, was correct, and never ran on the path that failed. Several were total outages that presented as healthy services.

Availability

  • A dead rate-limit store no longer takes the API down. The server profile defaults its limiter to Redis; an image without one raised ConnectionError on every request, which slowapi routed to its rate-limit-exceeded handler, which reads exc.detail. The handler itself then raised — HTTP 500 on every route including /health, from a container that logged "Application startup complete". Now fails open at the limiter and logs loudly. Losing rate limiting degrades to unlimited, never to broken.
  • The published image no longer requires AVX512. llama-cpp-python was compiled -march=native against the CI runner. import llama_cpp succeeded, so containers started and reported healthy; the illegal instruction fired on the first write. The build now pins a portable AVX2 baseline; arm64 keeps NEON.

Federation

  • Compatibility is decided on the major version. A 6.0 node refused a 6.1 peer outright, so every minor release broke federation until an operator set compat_mode=permissive on each peer.
  • The feed no longer silently returns nothing. create_memory writes permission_mode 600 while the world-read gate required % 10 >= 4, so peers pulled successfully, reported {"pulled": 0}, and logged no error.
  • LAN peers are registrable. The SSRF guard was split rather than loosened: link-local, multicast, reserved and unspecified addresses are refused on every network regardless of configuration; RFC1918 and loopback are what the flag gates.
  • Peer vectors we cannot verify are declined. Adoption requires both sides' embedding fingerprints to be known and agree; previously a node that could not resolve its own embedder accepted anything. Content still replicates; only the vector is declined and re-embedded locally.

Backends other than PostgreSQL

Each of these prevented startup or work on a supported backend:

  • Oracle — deletion workers could not claim work (ORA-02014); a migration replay made the service startable exactly once (ORA-01451).
  • Db2 — migration blocked by reorg-pending state (SQL0668N), now reorganised and retried on that specific error; and the backend no longer depends on DB2_COMPATIBILITY_VECTOR=ORA (native FETCH FIRST instead of Oracle-compatibility ROWNUM).
  • MariaDB — two tables could not be created (foreign-key charset mismatch, errno 150); federation peers could not be created at all (CAST(x AS JSON) is not implemented on MariaDB); federation sync raised AttributeError because the MySQL family never defined the audit_chain property the guard reads.

Security

  • Startup refuses an unauthenticated bind on a reachable interface. Override with MNEMOS_ALLOW_UNAUTHENTICATED_NETWORK_BIND=1 when a trusted network really is intended.
  • MCP no longer serves authorization decisions from a stale principal cache after an ACL change.
  • The secret-detection denylist is stored as digests, not plaintext.
  • The GRAEAE consultation audit chain now verifies — writers, verifier and fetch previously disagreed about what was hashed, so every row ever written was rejected.

Performance and correctness

  • Bulk create batches embeddings and commits once; webhook delivery batches inserts and publishes post-commit.
  • NATS: circuit-breaker failures reset on success, concurrency leases renew while a call is in flight, visibility epoch moved to JetStream KV.
  • Migrations are replayable — three statements raised "already exists" against a real database, and a failed statement aborts the surrounding transaction, silently skipping everything after it.
  • Architecture is enforced: all import-linter contracts pass.
  • Container images build on native runners per architecture instead of under emulation.

Operator notes

  • Embeddings. A model name is not a fingerprint. Engine, quantisation and pooling all move the vector: two nodes reporting the same model at the same width measured 0.778 cosine apart because one used mean pooling on a CLS model. Changing quantisation on the same model moved vectors by 0.0064. Keep one artifact, pinned by hash, across a fleet.
  • Upgrading on Oracle. Take a backup first. 6.1.0 and 6.1.1 start once and cannot restart; go straight to 6.1.7.
  • MNEMOS_EMBED_BACKEND=llamacpp on a CPU without AVX512. Affected by the image defect above on 6.1.0–6.1.2; 6.1.3 and later are fine.

Full detail, including the defects found and how each was verified, is in CHANGELOG.md.