Skip to main content

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:

  1. Fans out - dispatches the query to every active store in parallel, each via its adapter, with a per-store timeout.
  2. Floors - discards hits whose base_relevance is below the store's configured floor before ranking.
  3. Ranks - sorts each store's survivors by native score descending, assigns rank order.
  4. Fuses - applies RRF across all stores: Σ weight / (k + rank_in_store).
  5. 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.
  6. 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.

  1. 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), budget satellite_budget shared 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.json overlay 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 2.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for seren-corpus-callosum 2.3.0
File Size Uploaded
seren_corpus_callosum-2.3.0.tar.gz 101.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for seren-corpus-callosum 2.3.0
File Interpreter ABI Platform
seren_corpus_callosum-2.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 184.0 kB

Release files / seren_corpus_callosum-2.3.0.tar.gz

Download URL seren_corpus_callosum-2.3.0.tar.gz
Size 101.9 kB
Tags Source
SHA-256 checksum
How to use checksums
893ade2a97c458e5470284e42d91cd047b663e9d42003ecea97b0c8ea6348af8
BLAKE2b-256 checksum
How to use checksums
3c87f184f33fa94e45893cd19354ce4124f545f0992145ec4e54ed103214e24c
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 3, 2026.

Transparency log

Release files / seren_corpus_callosum-2.3.0-py3-none-any.whl

Download URL seren_corpus_callosum-2.3.0-py3-none-any.whl
Size 82.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
22af3b61cb5a1001305f98c3f7c1299f8de5844d5ee6c5f6a372ee79f980ff21
BLAKE2b-256 checksum
How to use checksums
66699345f8f3a3674227191028ebc049f032fc9ab9f09e0718c5d15c16aa2c5c
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 3, 2026.

Transparency log

Release history Release notifications | RSS feed

5.1.3

2 release files

5.1.2

2 release files

5.0.5

2 release files

5.0.1

2 release files

5.0.0

2 release files

This release

2.3.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page