Stele

io.github.leocelisPublished by GitHub account leocelisv18.16.2Updated Nov 6, 2026

Governed agent memory: lessons stay out of search until another actor promotes them with evidence.

VerifiedSTDIODesktop onlyKnowledge & MemoryAI & ML

Overview

AI-generated overview

A local governed memory ledger for AI agents: log task lessons, promote only evidence-backed ones, and search them later.

What you can do
  • Add, batch-add, update and delete ledger entries, with new entries held in quarantine until promoted
  • Promote, supersede, pin and record outcomes for lessons, using external evidence supplied as JSON
  • Search promoted entries, query point-in-time beliefs, and explore links, related entries, timelines and lineage
  • Review contested pairs, stale entries, hygiene candidates and entangled suspects, and resolve conflicts by evidenced supersede
  • Run integrity and health checks, export or hydrate redacted packs, snapshot and diff stores, and purge by provenance
When to use it
Useful when you want an agent to accumulate durable, auditable lessons across sessions or across several agents, and you care that unverified self-reflection never reaches search results. Also fits teams that need staleness tracking, conflict review and erasure or provenance checks on stored experience.
Requirements
Runs as a local stdio process installed from the stele-mcp PyPI package (with stele-core), needing Python and the Model Context Protocol Python SDK 1.x. The store location is set by the STELE_STORE environment variable, defaulting to ./.stele-store. No authentication is declared for the local server.
Before you install
The tools write, promote, supersede and permanently delete stored entries, and purge or snapshot operations act on whole stores, so point STELE_STORE at a dedicated directory. Exports and packs are described as redacted, but review what leaves the store. The README also documents a hosted HTTP variant requiring a Bearer key; keep such keys and DSNs out of shared files.

Installation

In SourceWeft

  1. Open Stele in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Stele
The governed experiential-memory ledger for AI agents — log what worked and what failed, promote only oracle-verified lessons, and let any agent build solid context from real experience.


What is Stele?

A stele is a stone raised to record what happened — deeds, laws, warnings — for those who come after. Stele is the same idea for AI agents: a centralized ledger of task experience. Agents automatically log what worked and what failed on each task; a governance gate promotes only lessons backed by external evidence; and any agent — today's or a future one — retrieves the distilled experience through one protocol before its next task.

Status: v18.16.1. Design locked in stele_system_intent.yaml. Packages: stele-core (zero runtime deps; optional [mysql]) + stele-mcp (stdio + hosted HTTP) + stele CLI.

Why Stele (research-backed)

ProblemEvidenceStele answer
Recall wins ≠ better actionsMemoryArena (arXiv:2602.16313)Task-outcome harnesses, not recall@k marketing
Self-reflection poisons storesSurvey (arXiv:2603.07670)Quarantine + external oracle only
Every framework is a silomemorywire (arXiv:2606.01138)JSON Schema + projection helpers
Stale lessons misleadLongMemEval (arXiv:2410.10813)Bi-temporal supersede + stale_policy

Full research: docs/research/ · patterns: docs/patterns/.

Install

bash
pip install stele-core stele-mcp

From git (contributors):

bash
python3.11 -m venv .venvsource .venv/bin/activatepip install -r requirements-dev.txtpip install -e packages/stele-core -e packages/stele-mcpmake check   # ruff + mypy + pytestmake proof   # end-to-end PASS/FAIL proof

Quick path: docs/QUICKSTART.md · comparison: docs/COMPARISON.md.

Quick start (library)

python
from pathlib import Pathfrom stele_core import Stele
s = Stele.open(Path(".stele-store"), store_id="demo", now="2026-08-20T12:00:00Z")added = s.add({    "layer": "failure_lesson",    "title": "Pin cache keys to calendar buckets",    "body": "Day-scoped keys prevent stale cross-day reads.",    "scope": "project:demo",    "temporal": {"valid_from": "2026-08-20T12:00:00Z", "last_verified": "2026-08-20T12:00:00Z"},    "provenance": {        "agent": "agent-a", "task": "cache-fix", "environment": "local",        "subject_id": "subj-1", "source": "session:abc",        "written_at": "2026-08-20T12:00:00Z",    },})# → {"id": "se_…", "state": "quarantined"}  — not searchable yet
s.promote(added["id"], [{    "type": "test_result", "issuer": "ci", "ref": "tests/test_cache.py",    "observed_at": "2026-08-20T12:00:00Z", "verdict": "supports",    "command": "pytest -q", "exit_status": 0,}], actor="ci", ts="2026-08-20T12:00:00Z")
print(s.search("cache buckets", consumer_scope="project:demo"))print(s.doctor(now="2026-08-20T12:00:00Z")["ok"])

CLI

bash
stele init ./.stele-store --store-id demostele doctor ./.stele-store --now 2026-08-20T12:00:00Zstele hygiene ./.stele-store --now 2026-08-20T12:00:00Zstele entangled ./.stele-store --source web_page --now 2026-08-20T12:00:00Zstele forget-check ./.stele-store --scope project:demo --subject-id subj-x --probe-query secret --now 2026-08-20T12:00:00Zstele schema --out docs/schemas/entry.schema.jsonstele snapshot ./.stele-store /tmp/stele-backup --now 2026-08-20T12:00:00Z --actor ops

MCP (stdio)

Requires the Model Context Protocol Python SDK 1.x (mcp>=1.0,<2). mcp 2.x removed mcp.server.fastmcp and will not boot this server.

Default (stele-mcp): 35 governed-ledger tools — add, promote, search, doctor, export, …

bash
export STELE_STORE=./.stele-storestele-mcp

Full research library (~2000 PEFT/agent-pattern tools): stele-mcp-full.

MCP (hosted HTTP)

Same tools over HTTPS (SSE + streamable HTTP). Two independent tool surfaces, same process, same auth, same store:

SurfaceSSEStreamable HTTPTools
Full/sse/mcp2003 (ledger + PEFT/pattern research library)
Core (governed ledger only)/core/sse/core/mcp35 — see list below

Production:

Local run (dev):

bash
bash deploy/build.shSTELE_API_KEYS=stl_local_dev STELE_AUTH_DISABLED=false \  STELE_STORE=./.stele-store \  python deploy/wsgi.py --port 8080
  • GET /health — unauthenticated; reports tool_counts: {full, core}
  • /sse + /mcp (full) and /core/sse + /core/mcp (ledger-only) — both Bearer via STELE_API_KEYS
  • Hosted durable SoT: STELE_STORE_DSN + TLS CA (DSN wins over file path)
  • Never commit API keys, DSNs, or PEMs
json
{  "mcpServers": {    "stele": {      "url": "https://stele.leocelis.com/core/sse",      "headers": { "Authorization": "Bearer YOUR_KEY_HERE" }    }  }}

35 governed-ledger tools (TECH_SPEC §7.1-7.9 — everything create_core_app() exposes): add · update · promote · supersede · delete · search · reflect · link · list_contested · resolve_contested · verify · reviewer_corrections · hydrate · export · record_outcome · pin · stale_report · reverify · related · stats · timeline · verify_pack · attach · snapshot · doctor · entry_schema · purge_by_provenance · diff_stores · add_batch · entangled_suspects · hygiene_candidates · forget_compliance · lineage · belief_at · conflict_surface

Architecture

See docs/ARCHITECTURE.md. Planes: Contract · Tools · Governance · Retrieval · Export · Living ledger · Ops.

DocLink
OSS guide (start here)docs/OSS_GUIDE.md
Quickstartdocs/QUICKSTART.md
PRDdocs/PRD.md
TECH_SPEC v1.1docs/TECH_SPEC.md
Entry JSON Schemadocs/schemas/entry.schema.json
Intent (C1–C8)stele_system_intent.yaml

License

MIT · Copyright (c) 2026 Stele contributors

Source: README.md at commit e9aa604

Tools

35

stele_add

ADD a distilled structured entry into quarantine. Pass entry as JSON object string.

Parameterstsentry_jsonrequired

stele_add_batch

Atomic multi-ADD under one lock.

Parameterstsactorentries_jsonrequired

stele_attach

Content-address bytes (base64); optionally LINK to an entry (FF-6).

Parameterstskindactorrequiredentry_iddata_base64required

stele_belief_at

Bi-temporal point-in-time belief inventory or SEARCH.

Parametersas_ofrequiredquerybudgetconsumer_scoperequiredprincipal_scopes_json

stele_conflict_surface

Conflict-preserving contested pairs — no auto-collapse.

Parametersbody_max_chars

stele_delete

DELETE by entry_id or subject_id (true erase + index rebuild).

Parameterstsactorrequiredreasonentry_idsubject_id

stele_diff_stores

Diff this store vs another root (e.g. snapshot) by entry id sets.

Parametersother_rootrequired

stele_doctor

Operator health report: verify + stats + contested + stale.

Parametersnow

stele_entangled_suspects

Human-review queue for LINK-entangled poison (report only).

Parameterslimitseed_ids_jsonuntrusted_agents_jsonuntrusted_sources_json

stele_entry_schema

JSON Schema 2020-12 for Stele entries (interop).

Takes no parameters.

stele_export

Export a redacted, audience-tiered pack (storage ≠ pack).

Parametersdestrequiredscoperequiredexpiryrequiredpurposerequiredaudiencerequiredcreated_atsubject_allowlist_json

stele_forget_compliance

Post-erasure active-forgetting probe (GateMem-shaped).

Parameterssubject_idprobe_queryconsumer_scoperequiredentry_ids_jsonforbidden_substrings_json

stele_hydrate

Import a redacted pack (ADD; optional promote with external evidence).

Parameterstsactorrequiredpromotepack_dirrequiredevidence_json

stele_hygiene_candidates

Zombie / net-harm hygiene report — no auto-delete.

Parametersnowlimitunused_before

stele_lineage

Supersede chain + journal audit lineage (TOKI-shaped).

Parametersentry_idrequired

stele_list_contested

List contested entries awaiting evidenced resolution (TECH_SPEC Q5).

Takes no parameters.

stele_pin

Pin or unpin a promoted lesson for SEARCH priority.

Parameterstsactorrequiredpinnedentry_idrequired

stele_promote

PROMOTE a quarantined entry with external-oracle evidence (JSON array).

Parameterstsactorrequiredentry_idrequiredevidence_jsonrequiredblock_injection_suspects

stele_purge_by_provenance

Provenance recovery: dry-run or purge entries from untrusted source/agent.

Parameterstsactorrequireddry_rununtrusted_agents_jsonuntrusted_sources_json

stele_record_outcome

Record helpful/harmful/ignored after using a lesson; helpful refreshes last_verified.

Parameterstsnoteactorrequiredoutcomerequiredentry_idrequired

stele_reflect

REFLECT: dedupe, expire, surface conflicts (no auto-resolve).

Parameterstsactorrequiredstale_before

stele_resolve_contested

Resolve a contested pair by evidenced supersede — never auto-merge.

Parameterstsactorrequiredloser_idrequiredwinner_idrequiredevidence_jsonrequired

stele_reverify

Batch-refresh last_verified with external oracle evidence.

Parameterstsactorrequiredevidence_jsonrequiredentry_ids_jsonrequired

stele_reviewer_corrections

Bounded contested-first correction slice for reviewer roles.

Parameterslimitinclude_contested

stele_snapshot

Cold-copy SoT (manifest, journal, entries, attachments) to dest.

Parameterstsdestrequiredactorrequired

stele_stale_report

List promoted entries past the staleness horizon.

Parametersnow

stele_stats

Store health dashboard: counts by state/layer/scope.

Parametersnow

stele_supersede

SUPERSEDE an old lesson with a new quarantined entry (history kept).

Parameterstsactorrequiredold_idrequirednew_entry_jsonrequired

stele_timeline

Journal history for one entry.

Parametersentry_idrequired

stele_update

UPDATE non-state fields on an existing entry.

Parameterstsactorrequiredentry_idrequiredpatch_jsonrequired

stele_verify

C4 integrity report: dual-location, schema, journal parse.

Takes no parameters.

stele_verify_pack

Offline pack integrity: stamps + secret scan.

Parameterspack_dirrequired

Version history

1
  1. v18.16.2LatestNov 6, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts