SerenCorpusCallosum
The callosum. A read-only fan that federates N memory stores into one ranked recall surface. Left brain (SerenLoci - structured facts) plus right brain (SerenMemory - episodic memory) plus however many more you hook in - merged into a single ordered list you can hand to a model.
It owns no store of its own. It remembers nothing. It only fans, floors, and merges what the hemispheres hand back. That read-only-by-construction shape is the whole point: the callosum is glue, not a place data lives.
Why Reciprocal Rank Fusion (and not "just sort by score")
Every store in this family can change its embedder independently - both SerenMemory and SerenLoci ship embedder-migration. The moment two stores run different embedders, their raw distances and scores live in different, incomparable number spaces. Sorting a merged list by those scores is comparing apples to a slightly different apple every time someone migrates a model.
So the callosum never reads magnitudes. It reads only each store's rank ordering - position 1, 2, 3 within its own results - and merges with Reciprocal Rank Fusion:
score(hit) = weight_of_store / (k + rank_in_store) # k = 60
That's embedder-agnostic by construction: rescale any store's scores however you like, the order is untouched, so the merge is untouched. There's a test that proves exactly this (test_embedder_change_does_not_perturb_order) - multiply one store's magnitudes by an arbitrary factor and the fused ranking comes out byte-identical.
Two per-store knobs decide how much a store is trusted (the federation has fifteen more; GET /stores lists the ones POST /configure honours as supported_knobs):
weight(per store) - the one cross-store trust lever. Trust facts more than episodes? Give Loci a higher weight.floor(per store) - a relevance floor applied before fusion, so "rank 1 of a bag of garbage" can't sneak to the top. Default 0 (trust the store's own ordering); raise toward ~0.3 if a store is noisy.
Implementation architecture
Federation engine
The Federation class owns the fan-out. On a search request it:
- Fans out - dispatches the query to every active store in parallel, each via its adapter, with a per-store timeout.
- Floors - discards hits whose
base_relevanceis below the store's configured floor before ranking. - Ranks - sorts each store's survivors by native score descending, assigns rank order.
- Fuses - applies RRF across all stores:
Σ weight / (k + rank_in_store). - Applies authority margin - if
authority_margin > 0, an exact-key hit (native_score = 1.0) gets boosted above the #1 RRF-ranked result by that margin. - Truncates - returns the top
n_results.
A slow or down store degrades the result but never takes the call down with it - and the response says so: stores_searched is the stores that answered (an empty answer counts), failed names each store that was fanned and did not answer with why (timeout, refused, an HTTP error), and skipped is a store that was never bound (a config error). A timeout and "knows nothing" are different facts.
- Satellite edges - a SerenMemory core hit carries
metadata.surroundings(satellite count, what it superseded); its newest satellites and the superseded core are appended after the packet as marked edges (source: satellite-edge/supersedes-edge,edge_of= the core, score 0.0), budgetsatellite_budgetshared round-robin across the packet's cores, before the topic edges. The over-fetch each store is asked for is clamped to what its contract accepts (Memory: 50).
Adapter layer
Each store type has a corresponding adapter class. Adapters translate the store's native response shape into a uniform StoreHit:
| Adapter | Store type | What it does |
|---|---|---|
SerenMemoryAdapter |
seren_memory |
Calls POST /search on the memory service, maps content/score/metadata into hits |
SerenLociAdapter |
seren_loci |
Calls POST /search on the loci service, maps content/score/metadata from the fact's value and why |
One adapter covers every store that speaks the same protocol - adding a SerenMemory-speaking store is a config entry, not a code change.
Overlay system
Stores come from two sources merged at startup:
- Base stores - declared in the hand-authored yaml config. Config-owned; the Bridge UI won't delete them (it points you back at the file instead).
- Managed stores - added via the Bridge viewer's + Add store form, persisted in a separate
runtime-stores.jsonoverlay file. Removable from the UI with the ✕ button.
Base always wins a name collision, so the overlay can never quietly shadow something you hand-wrote. The overlay path defaults to a sibling of the config file; override with SEREN_SCC_RUNTIME_STORES env var.
Edges system (optional)
When edges_enabled: true, the federation appends topic-association edges after fusion. For each hit in the fused list, the edges system looks up topically related entries from other stores and appends them as additional results (up to edge_budget). This surfaces cross-store connections - a Loci fact about a project's coding convention might pull in a Memory entry about a related discussion.
Edges are purely additive: they never replace or re-rank the fused list, only extend it. A disabled edges config or a store that doesn't support topic queries degrades gracefully.
Dynamic runtime configuration
Federation parameters can be tuned at runtime without a restart via POST /configure:
POST /configure
{
"k": 30,
"fusion_mode": "rrf_pct",
"authority_margin": 0.1,
"min_per_store": 3,
"edges_enabled": false,
"edge_budget": 0,
"n_results": 25,
"fetch_multiplier": 4,
"per_store_timeout_s": 10.0,
"stores": [
{"name": "facts", "weight": 2.0, "floor": 0.1}
]
}
All fields are optional - only supplied fields are changed. The live Federation is rebuilt immediately so the next /search picks up the new values. Per-store overrides mutate weight/floor on matching stores; an unknown store name returns 404, an invalid fusion_mode returns 422.
Tests
| Test file | What it covers |
|---|---|
tests/test_app.py |
5 tests - HTTP search route, health/root, bearer auth, unknown-store survival, config loading from defaults/env |
tests/test_federation.py |
9 tests - fan across stores, dead/slow store graceful degradation, per-store floor, weight-based ranking, unknown-store skip, empty config |
tests/test_fusion.py |
28 tests - RRF fusion, embedder-agnostic ranking, percentile/rrf_pct modes, authority margin, exact-key promotion, per-store quota/min_per_store |
tests/test_edges.py |
7 tests - topic-association edges appended after fusion, edge budget cap, disabled mode, Loci skipped (no topics), failure degrades gracefully |
tests/test_adapters.py |
6 tests - SerenMemory + SerenLoci adapter response mapping, search-path override, dispatch by type, empty/missing hits safe |
tests/test_stores.py |
10 tests - stores endpoint, bridge viewer, add/delete managed stores, unknown-type rejection, duplicate rejection, blank-field rejection, base-store delete refused, missing 404 |
tests/test_overlay.py |
5 tests - runtime overlay load/add/remove, corrupt overlay degrades to empty, env override |
tests/test_mcp_mount.py |
2 tests - MCP mount requires federation, succeeds and exposes session manager |
tests/test_mcp_tools.py |
4 tests - MCP search tool returns full provenance, surfaces skipped stores, default n_results |
tests/test_honest_fan.py |
13 tests - the over-fetch clamped to what a store accepts; stores_searched = answered and failed with why (route and MCP tool); the health record survives /configure and store changes; a new timeout reaches the transport; satellite and superseded-core edges |
tests/test_exposure_is_wired.py |
3 tests - a host beyond loopback with no bearer refuses to start |
tests/test_configure.py |
9 tests - federation-level knobs (k, fusion_mode, authority, edges, n_results, fetch, timeout), per-store weight/floor overrides, unknown store → 404, invalid fusion_mode → 422, empty body, partial updates keep untouched fields, bearer auth enforced |
pytest tests/
The family
| Service | Role | Port |
|---|---|---|
| SerenMemory | right brain - episodic, consolidated memory | 7420 |
| SerenMargin | private notes-to-self (opt-in) | 7421 |
| SerenLoci | left brain - keyed, deterministic facts | 7422 |
| SerenCorpusCallosum | the fan over all of them | 7423 |
License
AGPL-3.0-or-later.
Metadata
Release files for seren-corpus-callosum 5.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| seren_corpus_callosum-5.0.0.tar.gz | 101.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| seren_corpus_callosum-5.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 184.0 kB
Release files / seren_corpus_callosum-5.0.0.tar.gz
| Download URL | seren_corpus_callosum-5.0.0.tar.gz |
|---|---|
| Size | 101.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
de4f36c70790c0eb9cead39c6278eaddd19d5e181d1da3121d5f9d738f5cc271
|
|
BLAKE2b-256 checksum How to use checksums |
59bf6cf5eeadb1970b08ed4328330b897960cf113c8441b9386fa87b68ff77d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logRelease files / seren_corpus_callosum-5.0.0-py3-none-any.whl
| Download URL | seren_corpus_callosum-5.0.0-py3-none-any.whl |
|---|---|
| Size | 82.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9129e1f7b8e11dd10597d6f05faf5d2085b34371feeb6494f892256c837f732a
|
|
BLAKE2b-256 checksum How to use checksums |
d77a6845bc8e9d864702901dee743545e690b5c50cb715a060a65c7512546f3d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency log