Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
792ce89
feat: 1.5.0 release — schema 11, governed recall recovery, embedding …
Coding-Dev-Tools Aug 5, 2026
919aae9
feat: release-stamped context-savings telemetry across store, service…
Coding-Dev-Tools Aug 5, 2026
391cb6f
fix: receipt telemetry accounting, empty-filter read semantics, vec0 …
Coding-Dev-Tools Aug 5, 2026
1fdf500
feat: add fast retrieval profile for small-vault / latency-sensitive …
Coding-Dev-Tools Aug 5, 2026
90945e8
feat: add hosted connection preflight
Coding-Dev-Tools Aug 2, 2026
26a88ed
fix: handle Path.home() failures in cloud session resolution
Coding-Dev-Tools Aug 5, 2026
e28eccd
fix: resolve CI failures — CodeQL, pyright, consolidation logic, shor…
Coding-Dev-Tools Aug 5, 2026
cc7eeb0
fix: use os.chmod() instead of Path.chmod() in Linux shortcut installer
Coding-Dev-Tools Aug 5, 2026
ab53bc3
chore: add MCP directory metadata (glama.json, server.json) and submi…
Coding-Dev-Tools Aug 5, 2026
9611f64
Potential fix for pull request finding 'CodeQL / Use of a broken or w…
Coding-Dev-Tools Aug 5, 2026
dd1f4af
fix: address all Codex review findings for 1.5.0 release
Coding-Dev-Tools Aug 5, 2026
243b9de
fix: add CodeQL config to exclude SHA1 feature-hashing false positive
Coding-Dev-Tools Aug 5, 2026
969556e
fix: refine CodeQL config to query-level exclusion instead of paths-i…
Coding-Dev-Tools Aug 5, 2026
4f32960
fix: use paths-ignore for CodeQL SHA1 false positive exclusion
Coding-Dev-Tools Aug 5, 2026
86f74f0
revert: remove MCP directory metadata files (added without permission)
Coding-Dev-Tools Aug 5, 2026
122ec33
chore: normalize version to 1.5 (drop trailing .0)
Coding-Dev-Tools Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "engraphis-memory",
"source": "./",
"description": "Discipline for giving agents durable, scoped, explainable memory across sessions and repos with the Engraphis MCP tools.",
"version": "1.4.5"
"version": "1.5"
}
]
}
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "engraphis-memory",
"version": "1.4.5",
"version": "1.5",
"description": "Give agents durable, scoped, explainable memory across sessions and repos via the Engraphis MCP tools. Use when you learn something worth keeping, need prior context before acting, or ask why/how a fact changed. Covers remember/recall, why/timeline, forget/pin/correct, sessions, and code search.",
"author": {
"name": "The Engraphis Authors",
Expand Down
8 changes: 4 additions & 4 deletions .claude-plugin/skill-assets.sha256
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
e7e4ecd111d9b04c290ddd60e0fadb90e3afd8c67e39dcb8fbce0b50b5e3ce42 .claude-plugin/marketplace.json
65bff1596f3db2bc75b74c6970d87e806d46ef1cb3e612cd2002f19c3a8f6acb .claude-plugin/plugin.json
56be8d078a2a8fc6e6cd1c2be5716605d8621dab953caa8cfcd20e2dce474305 skills/engraphis-memory/SKILL.md
d30ad152dcc4c82ce10e7167fdfe67e709358e5f435293939125f2d6cffc5b7e .claude-plugin/marketplace.json
28dcd15a7a186f8cb8a15705f1bd7734086167991c4acc28ec2cfea59a2374ab .claude-plugin/plugin.json
45dd73ca6afdd9e12ecd38c48e4a612b7646c25a07a75a80ca0e68d0e0b85f0e skills/engraphis-memory/references/CONVENTIONS.md
529fff3bdbe73f83209087fd10055fad77c5e5224ad8a9e6b0254052aa50e109 skills/engraphis-memory/references/SCOPING.md
eecd861f0f8cc2a9def07a53387ca66d8cb68d8b62d9b048dcd1b0b250fa3fee skills/engraphis-memory/references/TOOLS.md
b2489b60159655e7e564e234d5aff24ba4d8df7cb82626edeaaaf89264007f85 skills/engraphis-memory/references/TOOLS.md
56be8d078a2a8fc6e6cd1c2be5716605d8621dab953caa8cfcd20e2dce474305 skills/engraphis-memory/SKILL.md
19 changes: 14 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,17 @@ ENGRAPHIS_API_TOKEN=
# ── Embeddings ──────────────────────────────────────────────────────────────
# Local sentence-transformers model (downloaded on first run, ~80-400 MB).
ENGRAPHIS_EMBED_MODEL=sentence-transformers/all-MiniLM-L6-v2
# Optional immutable Hugging Face commit for the embedding model. Required for remote
# models when ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=1; local:/paths remain permitted.
# ENGRAPHIS_EMBED_REVISION=<lowercase 40-character model commit>
# Reject mutable remote embedding, reranker, and chunk-tokenizer tags before loading. Off by default.
# ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=0
# Embedding dimension is auto-detected from the model. Override only if needed.
# ENGRAPHIS_EMBED_DIM=384
# Vector index backend for the v2 engine: "numpy" (default, deterministic reference
# index), "sqlite-vec" (require the accelerated ANN backend; needs the sqlite-vec
# package), or "auto" (use sqlite-vec when available, fall back to NumPy).
# ENGRAPHIS_VECTOR_BACKEND=numpy
# Vector index backend for server entrypoints: "auto" (default; use sqlite-vec when
# engraphis[vector] is installed and compatible, otherwise NumPy), "sqlite-vec"
# (require native exact-KNN acceleration), or "numpy" (force the reference index).
# ENGRAPHIS_VECTOR_BACKEND=auto

# ── LLM (external, you choose the provider) ─────────────────────────────────
# Provider: openai | anthropic | google | openrouter | custom
Expand Down Expand Up @@ -130,7 +135,7 @@ ENGRAPHIS_RETENTION_SUPERVISOR=none
# Standalone MCP-over-HTTP server (`engraphis-mcp-http`). Loopback-only by default;
# any non-loopback bind (via these or ENGRAPHIS_HOST) requires ENGRAPHIS_API_TOKEN.
# ENGRAPHIS_HTTP_HOST=127.0.0.1
# ENGRAPHIS_HTTP_PORT=8080
# ENGRAPHIS_HTTP_PORT=8711
# ENGRAPHIS_HTTP_TRANSPORT=streamable-http

# When running under Docker (auto-detected via /.dockerenv), the self-updater skips
Expand Down Expand Up @@ -195,6 +200,7 @@ ENGRAPHIS_LLM_MODEL=gpt-4o-mini

# Prefer the owner-only ~/.engraphis/cloud_session.json written by `engraphis connect`:
#
# engraphis connect --preflight # validate endpoints/storage; never reads or sends a token
# engraphis connect --token engr_ct_... # the command your account portal shows
# printf %s "$TOKEN" | engraphis connect --token - # keep the token out of shell history
#
Expand Down Expand Up @@ -310,6 +316,9 @@ ENGRAPHIS_LLM_MODEL=gpt-4o-mini
# decayed transients, and distills recurring episodic memories into semantic digests.
# ENGRAPHIS_LOOP_CONSOLIDATE=0
# ENGRAPHIS_RERANK_MODEL=cross-encoder/ms-marco-MiniLM-L-6-v2
# Optional immutable Hugging Face commit for the reranker. Required for remote
# rerankers when ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=1.
# ENGRAPHIS_RERANK_REVISION=<lowercase 40-character model commit>

# Workspace allow-list: comma-separated names. Empty = all allowed.
# ENGRAPHIS_WORKSPACES=acme,personal
Expand Down
14 changes: 14 additions & 0 deletions .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# CodeQL configuration for Engraphis
#
# The deterministic embedder uses SHA-1 solely for feature hashing (the
# "hashing trick") to map tokens to vector dimensions. This is not a security
# primitive: the output is never used for passwords, signatures, integrity
# checks, or any cryptographic purpose. The code sets usedforsecurity=False.
#
# Changing to SHA-256 would invalidate all existing local vectors and break
# the documented compatibility invariant in regression tests.

name: "Engraphis CodeQL config"

paths-ignore:
- engraphis/backends/embedder_deterministic.py
8 changes: 8 additions & 0 deletions .github/release-constraints.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Artifact-affecting release tooling. PIP_CONSTRAINT is exported by release.yml so
# PEP 517 build-isolation subprocesses use this exact backend/frontend toolchain.
pip==26.2
setuptools==83.0.0
wheel==0.47.0
build==1.5.0
twine==6.2.0
pip-audit==2.10.1
87 changes: 80 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,34 @@ jobs:
- name: Unit tests (full suite — extras-gated tests included)
run: |
python -c "import fastapi, httpx, mcp, multipart, pydantic, uvicorn"
python -m pytest -o addopts="" tests/ -q -rs
ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest"
- name: Retrieval eval gate
run: python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5
- name: Retrieval eval gate — CodeMem (coding-agent wedge, incl. conflict resolution)
run: python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5
- name: Ablation (vector-only vs hybrid)
run: python -m eval.ablation
- name: Reinforcement state-transition gate
run: python -m eval.reinforcement
- name: Adversarial memory prompt-boundary gate
run: python -m eval.adversarial_memory_security

typecheck:
name: core + backends typecheck (Python 3.11)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
cache: pip
cache-dependency-path: pyproject.toml
- name: Install typecheck dependencies
run: |
python -m pip install --upgrade pip
pip install -e ".[test]"
- name: Typecheck core and backends (Pyright)
run: pyright

encryption:
name: encryption driver gate (Python ${{ matrix.python-version }})
Expand All @@ -66,7 +87,9 @@ jobs:
# extension during the long general suite. Keep its real driver contract in
# this dedicated, short-lived process rather than skipping encryption coverage.
- name: Encryption at-rest integration tests
run: python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs
run: |
python -c "import sqlcipher3; print(sqlcipher3.__file__)"
ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest"

core-py39:
name: core floor (numpy-only, Python 3.9)
Expand All @@ -81,13 +104,59 @@ jobs:
- name: Install (numpy-only core — the minimum supported runtime)
run: |
python -m pip install --upgrade pip
pip install numpy pytest
pip install numpy "pytest<9"
- name: Unit tests (extras-gated tests skip; the core must pass)
run: python -m pytest -o addopts="" tests/ -q -rs
run: ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest"
- name: Retrieval eval gate
run: python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5
- name: Ablation
run: python -m eval.ablation
- name: Reinforcement state-transition gate
run: python -m eval.reinforcement
- name: Adversarial memory prompt-boundary gate
run: python -m eval.adversarial_memory_security
- name: Build and smoke installed core artifacts
shell: bash
run: |
set -euo pipefail
python -m pip install --disable-pip-version-check "build==1.2.2"
dist_dir="$RUNNER_TEMP/engraphis-py39-dist"
export SOURCE_DATE_EPOCH="$(git show -s --format=%ct "$GITHUB_SHA")"
python -m build --outdir "$dist_dir"
index=0
for artifact in "$dist_dir"/*.whl "$dist_dir"/*.tar.gz; do
index=$((index + 1))
venv="$RUNNER_TEMP/engraphis-py39-artifact-$index"
python -m venv "$venv"
"$venv/bin/python" -m pip install --disable-pip-version-check "$artifact"
"$venv/bin/python" -m pip check
(
cd "$RUNNER_TEMP"
"$venv/bin/python" - <<'PY'
import pathlib
import sys

import engraphis
from engraphis.core.engine import MemoryEngine

package = pathlib.Path(engraphis.__file__).resolve()
assert pathlib.Path(sys.prefix).resolve() in package.parents, package
engine = MemoryEngine.create(":memory:")
workspace_id = engine.store.get_or_create_workspace("py39-artifact")
memory_id = engine.remember(
"The Python 3.9 artifact marker is indigo.",
workspace_id=workspace_id,
resolve_conflicts=False,
)
result = engine.recall("Python 3.9 artifact marker", workspace_id=workspace_id, k=3)
assert any(chunk["id"] == memory_id for chunk in result.chunks)
engine.store.close()
PY
"$venv/bin/engraphis" --help
"$venv/bin/engraphis" --version
"$venv/bin/engraphis-cli" --help
)
done

coverage:
name: coverage gate (Python 3.11)
Expand All @@ -104,7 +173,7 @@ jobs:
python -m pip install --upgrade pip
pip install -e ".[test]" pytest-cov
- name: Coverage run (all extras-gated tests, tracked modules)
run: python -m pytest -o addopts="" tests/ -q -rs --cov=engraphis --cov-report=term-missing --cov-fail-under=60
run: ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" --cov=engraphis --cov-report=term-missing --cov-fail-under=60

hygiene:
name: repo hygiene gate (no stray DBs/logs)
Expand Down Expand Up @@ -239,7 +308,7 @@ jobs:
rm -rf "$audit_dir"
}
trap cleanup EXIT
python -m pip install --disable-pip-version-check --no-cache-dir pip-audit
python -m pip install --disable-pip-version-check --no-cache-dir pip-audit==2.10.1
docker create --name "$container" engraphis:ci >/dev/null
docker cp "$container":/usr/local/lib/python3.11/site-packages/. "$audit_dir"
python -m pip_audit --path "$audit_dir"
Expand Down Expand Up @@ -277,9 +346,13 @@ jobs:
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
- name: Install pinned build and audit tooling
run: >-
python -m pip install --disable-pip-version-check
"build==1.5.0" "pip-audit==2.10.1"
- name: Build sdist + wheel and verify a clean install
run: |
python -m pip install --upgrade pip build pip-audit
export SOURCE_DATE_EPOCH="$(git show -s --format=%ct "$GITHUB_SHA")"
python -m build
python scripts/verify_distribution_contents.py dist/*
python -m venv .audit-venv
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ jobs:
with:
languages: ${{ matrix.language }}
build-mode: none
config-file: ./.github/codeql/codeql-config.yml
- name: Analyze
id: analyze
uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4
Expand Down
Loading