Repository navigation
A patch for the first contact with the project: the published images run on arm64, the PyPI packages carry their license and links, a Scribe worker keeps all its slots when the database fails while it records a job and gets a liveness check, the console scripts answer --help, and the quickstart commands point at the Keeper they started. No migration and no breaking change. Three new settings, all optional: scribe.worker.outcome_retry_delay_s, scribe.worker.liveness_file and scribe.worker.liveness_interval_s. The lines link the documentation of each change: the work landed directly on main, without pull requests to link.
Added
- Scribe liveness (Scribe): with
scribe.worker.liveness_fileset, the job loop rewrites that file everyscribe.worker.liveness_interval_s(10 s) with its live slots, the jobs running and the time it last reached the store, andpython -m lorebase_scribe.liveness FILEreads it, with the standard library only, and exits 1 with the reason (no file, a stale file, no live slot or, with--max-store-age, a store not reached). The composescribeservice writes/tmp/scribe-liveness.jsonand runs that command as its healthcheck; thescribevalues of the chart show the exec probe - Metric
lorebase.scribe.worker.slots(gauge,stateliveorlost) and the statusunrecordedoflorebase.scribe.jobs(metrics) lorebase-herald --helpprints the variables an MCP host sets (LOREBASE_URL,LOREBASE_API_KEY,LOREBASE_DOMAIN,LOREBASE_BRANCH,LOREBASE__HERALD__TRANSPORT) and the documentation link,--versionthe version; at start Herald logs the transport, the Keeper it calls and the default Domain to stderr, so a host pointed at the wrong Keeper sees it before the first call (MCP)make upprints theexport LOREBASE_URL=... LOREBASE_DOMAIN=supplyline for the CLI and theenventry for an MCP host over stdio, with the port set in.env;make shell-envprints the export line again, foreval "$(make shell-env)"(quickstart)make upchecks every host port the chosen profiles publish before it starts anything and names the variable to change, and refuses to start while a*_BINDvalue in.envwould publish the Keeper of the stack, which runs with authentication off, beyond this machine;KEEPER_PUBLISH_INSECURE=true, in.envor the shell, starts it anyway with a warning (quickstart)make envsetsHERALD_DOMAIN=supplywhile it is unset, so the first call of an MCP host againstmake up PROFILES=mcpneeds no Domain of its ownserver.jsonat the repository root describes Herald for the official MCP registry asio.github.aantenore/lorebase-herald, with the PyPI packagelorebase-herald(run withuvx) and the imageghcr.io/aantenore/lorebase, which now carries theio.modelcontextprotocol.server.namelabel the registry checks; the entry is submitted after a release (releasing)- MCP server: host configurations that run Herald from PyPI with
uvx lorebase-herald, as oneclaude mcp addcommand, a Cursor.cursor/mcp.jsonentry and a VS Codecode --add-mcpcommand - Comparison: DataHub, the Fabric IQ ontology MCP server, Semantica, Doltgres with the Dolt MCP server, TypeDB, mnem and RDF triple stores, each with a linked source checked on 2026-11-06, and a Standards section: LinkML import and export are supported; RDF, OWL, SHACL and JSON-LD are not native and are reached through LinkML's generators
- Images
ghcr.io/aantenore/lorebase,lorebase-mlandlorebase-webforlinux/arm64as well aslinux/amd64: each platform is built on a runner of its own architecture, and the release joins them into one multi-arch index, which it signs and attests with the SBOM (releasing) - PyPI metadata of the ten packages: license
Apache-2.0with the license text in every sdist and wheel, a README, author, keywords, classifiers and links to the repository, documentation, changelog and issues;scripts/release_tool.py checkfails when a package lacks them, and also checksserver.json(its versions, its name and the image label)
Changed
- Scribe: an outcome the store refuses to take (a dropped connection, a statement timeout) is written once more after
scribe.worker.outcome_retry_delay_s(1 s); when that fails too the run countsunrecordedand the job runs again once its lock goes stale, as a lost job does (Scribe) - README and the documentation home open with who Lorebase is for and one MCP call with the JSON answer and its Revision; the status note follows, and the 30-second demo stays the second screen
- Quickstart: the commands take the Keeper URL from the line
make upprints (eval "$(make shell-env)") instead of a fixedhttp://localhost:8080; the port table and the port troubleshooting row listGUIDE_HOST_PORT(8095),HERALD_HOST_PORT(8091) and thescale-outports; the MCP section setsHERALD_DOMAINnext toHERALD_ALLOW_ANONYMOUS; the semantic search example writesquery.jsonunder${TMPDIR:-/tmp} - CONTRIBUTING.md, the README and the validation and demo pages state the CI policy as it is: the checks run on demand and for release tags, not on every pull request
- Kubernetes and deployment say that the 0.3.0 images are
linux/amd64only and that 0.3.1 and later are published forlinux/amd64andlinux/arm64 - Releasing: a section's heading reads
X.Y.Z - unreleaseduntil the tag, whose date then replacesunreleased; the page follows the workflow's jobs and adds the MCP registry step - The Release workflow runs the CI workflow on the tagged commit first; images, the GitHub release and PyPI wait for it, so a tag whose checks fail publishes nothing. After the release it publishes the documentation site built from the tag (the
github-pagesenvironment must allowv*tags to deploy) - The compose defaults of Postgres (
pgvector/pgvector:0.8.7-pg16), Ollama, LiteLLM, the OpenTelemetry collector, Jaeger, Prometheus, Grafana and the OIDC mock, and the Helm default of Ollama, are pinned by version and digest instead oflatest,main-stableorpg16; the*_IMAGEvariables still override them, andtests/tooling/test_dockerfile_pins.pychecks the pins - CI: the integration job may run 35 minutes instead of 20, and the BM25 integration job is part of the aggregate
CIcheck - The release jobs no longer keep the checkout token on the runner
.env.examplesetsPOSTGRES_IMAGE,OLLAMA_IMAGE,LITELLM_IMAGE,OTEL_COLLECTOR_IMAGE,JAEGER_IMAGE,PROMETHEUS_IMAGEandGRAFANA_IMAGEto the version and digest pins ofdeploy/compose/docker-compose.yamlinstead of floating tags, so a.envcreated bymake envkeeps the pinned images.
Fixed
- A Scribe worker slot ended for good, and nothing reported it, when the database failed while the worker recorded a job's outcome: with the default concurrency the process stayed up with one slot, or none, while the queue grew. The slot now stays on, a slot task that ends with an error is logged and started again after
scribe.worker.poll_interval_s, andlorebase.scribe.worker.slotsshows it (Scribe) lorebasewith no server configured saidpass base_url or set LOREBASE_URL, an argument of the Python client the command line does not have; it now names the three ways a person has (--url,LOREBASE_URL, orurlin a profile of the config file) and the path of that filelorebase-herald --helpand--versionstarted the stdio server, printed nothing and exited 0 when the host closed the pipe- The audit chain heads and the merge attempts queries used a
DISTINCT ONspelling that SQLAlchemy 2.1 deprecates (anSADeprecationWarningin every integration run); they use the dialect'sdistinct_on, and the test suite fails on any such warning from now on - The 30-second demo excerpts in the README, the documentation home and manual setup quoted Revision ids that
examples/merge_demo.pyno longer prints; they are regenerated, andtests/tooling/test_merge_demo.pynow fails when a quoted line differs from the output - Stale documentation: the comparison listed LinkML import and export as roadmap work, the FAQ named the 1M-Record baseline as missing and left out the MySQL/MariaDB and SQL Server Sources, and
examples/README.mdlinked a quickstart anchor that moved;tests/tooling/test_docs_links.pynow checks the links and anchors of the README, CONTRIBUTING.md, SECURITY.md andexamples/README.md scripts/quickstart.sh upresolves the variables of its exposure and port checks the way docker compose does: a variable set in the shell wins over the environment file, then the default.KEEPER_BIND=0.0.0.0 KEEPER_ALLOW_INSECURE=true make upwith a loopback.envno longer starts an exposed Keeper with authentication off, andKEEPER_PUBLISH_INSECUREset in the shell (true or false) wins over the file.
Not done yet
- The chart wires no probe for Scribe by default; the
scribevalues show the exec probe to set. - The MCP registry entry (
server.json) is submitted by hand after the release; the registry lists nothing until then.
Upgrade notes
No migration. Rebuild or pull the images: the compose scribe service gains a healthcheck that reads the liveness file, with nothing to configure. The new settings have defaults; set scribe.worker.liveness_file and an exec probe to give another deployment the same check.