platform
A document workspace
with a mind.
Put your material in — characters, chapters, rules, bills, history — and Liminalis reads it, connects it, and works alongside you inside it. It doesn't answer from a general model's guesses about your world. It answers from your documents, and it can tell you exactly which ones.
0.269 → 0.876
from 0.318
vs. the baseline
bench queries
Measured on an isolated copy of a real 135-document project. Pinned scaffold documents are excluded from rank positions, so recall@5 measures retrieval rather than padding. The full ablation ladder — and the findings that were retracted — are on Engineering.
One document engine.
Swappable domain lenses.
A project is viewed through a lens. The same document set means different things depending on what you're doing with it — and the lens changes the vocabulary, the interface, the generation stages, the validation rules, and the retrieval barriers, over one shared corpus.
Underneath, nothing is domain-specific. Chunking, extraction, association, recall and context assembly don't know what a chapter is, or a bill. That claim was tested: after the abstraction was factored out, a third lens was built over roughly ten thousand pieces of legislation, and it required no special case in ingestion, chunking, extraction, retrieval, assembly, the access barriers, the job model, or the agent API.
Long fiction
Series and book planning as a staged, dependency-ordered build. A weave board that puts plot threads and character arcs on a book × chapter grid, so a dropped thread is something you can see.
Explore the Novel lens → CampaignTabletop RPG
A revelation graph that validation actually walks. An AI narrator that takes one turn per lull rather than replying to everyone. A GM wall enforced at retrieval, not at render.
Explore the Campaign lens → LegislationLegislative corpora
A ~10,000-row corpus, staged ingest with real metered cost, cross-state bill families, a first-appearance escalation matrix, and charts that state their own denominators.
Explore the Legislation lens →The index isn't a black box.
It's a document you can correct.
Background workers read every document as it changes and derive a knowledge layer from it — incrementally, resumably, and never on the save path. What comes out is not an opaque embedding blob. It's readable, editable material that sits in your project alongside everything else.
Entities & relationships
A fixed ontology of around fifty categories and two hundred typed relations. Each relationship carries two directional summary sentences, so it reads back as memory prose rather than as a graph label.
Facts, atomic and sourced
Conservative statements about named things, each linked back to the passage it came from. Nothing floats free of its source.
Searchable summaries
Section-level and document-level, and themselves retrievable — so a long chapter can be recalled at the right altitude instead of all-or-nothing.
Motifs — retrieval by theme
Theme-language tags like debts-unpaid or made-not-born, so you can pull thematically-linked
material together regardless of where it sits in the folder tree. This is the piece nothing else in the category does.
A graph walk can miss an entity the extractor never found. A vector search can put a name far away in embedding space. String matching fails at neither. When a user names a thing, the reverse index guarantees its document is pinned into context — regardless of what the probabilistic layers thought.
A hybrid stack that was tuned against a bench, not against a vibe.
Content-defined chunking with sentence-window vectors. BM25 fused with dense retrieval by reciprocal rank, so the cross-encoder gets to see lexical-only matches too. A reranker over passages rather than whole documents. Contextual embeddings, where each chunk is embedded aware of its surrounding document — which matters enormously for prose full of pronouns and implicit referents.
Tiered context
Background documents render as a summary plus the passages that actually matched. Four guards stop it damaging the answer — including one that refuses to summarize a document if the summary would come out larger.
Context budget
Over budget, it degrades in order of least damage: weakest documents first, then clipping the largest. Pins are never dropped, and every clip is marked in the text so the model knows it holds a partial document.
Thinking levels
From a single deterministic pass, through plan-and-fan-out, to draft → self-critique → revise. Cost scales with the rung, and the cheap scaffolding work runs on a cheap model.
The dominant bottleneck was a config default, not an algorithm. — retrieval roadmap, twice over
A conversational default of five vector results, inherited unexamined, was starving a document corpus. Widening the candidate pool moved recall@5 from 0.269 to 0.439 on its own. The reranker in isolation was worth +0.011; paired with the widened pool it took the same metric to 0.871. Neither number is interesting alone. Together they're the whole story.
Search is stateless.
Memory isn't.
Everything above is machinery for “what best matches this query?” — and it gives the same answer forever. That is right for a search engine and wrong for something that is meant to know your material. So underneath the retrieval stack there is a second thing: a memory model that changes as you work.
A passage, an extracted fact, an entity, a summary and a conversation turn are all the same kind of object in one graph. Every one carries an activation level computed the way the ACT-R cognitive architecture computes it — recency and frequency in a single number. Connections strengthen when both ends are used together, weaken when they aren't, and are eventually pruned. The graph learns the shape of your project, and forgets the parts of itself nobody ever travels.
Recall with intuition
Because reach is gated by how warm a thing already is, the system can surface something that shares no keyword and sits in no obvious embedding neighbourhood — purely because in this project, over time, those two things became connected.
Agreement is the signal
The query gets one pass. Every entity named in it gets its own, independently. Material reached from two or more directions at once is promoted above material that merely scored well in one — so a hub connected to everything can't win by volume.
It forgets on purpose
Unreinforced associations decay and are removed. Without that, years of extraction give you a dense mesh where everything is faintly connected to everything and no signal survives. Forgetting is what keeps the graph usable.
This is the one part of the system with no benchmark number attached, and that's structural rather than evasive: a fixed-corpus, single-shot bench scores a cold graph, and the whole point of this layer is that it is history-dependent — it is supposed to get better in a specific project as that project gets worked in. Designing an evaluation that can actually see that is open work. Until it exists, no performance claim is made for it.
The full mechanism →The prompt has a shape,
and the shape is the point.
Every turn is assembled into a deliberate order: an unchanging system block, then the stable pinned knowledge artifacts, then the volatile query-dependent recall, then history, then the question. The first two segments are marked for provider-side caching. The rest churns freely without ever invalidating them.
Precomputed knowledge, always resident
The Project Overview and Project Structure documents are generated in the background and always pinned — so every reply carries the project's shape without retrieval having to go and find it. They live inside the cached half.
Cache-aware by construction
On-demand expansions are routed into the volatile half specifically so they cannot invalidate the prefix for every later turn in the conversation. That's a design constraint, not an accident.
Memory that persists between turns
A per-chat rolling context is serialized to disk: document scores, entity scores, section provenance and a hierarchical summary. Recent turns stay verbatim; older ones compress. A follow-up keeps its material without re-mentioning it.
Is this CAG?
Partly, and it's worth being precise. Liminalis is a cache-augmented prefix over a measured RAG stack: precomputed knowledge artifacts that live permanently in the window, inside an explicitly cached prompt segment, verified live to bill at roughly a tenth from the second turn onward.
What it is not is corpus-in-context. The whole tiering-and-budget effort exists because a real corpus does not fit in a window, and a long chat will walk itself out of one no matter how tight retrieval is. Anyone claiming otherwise at this corpus size is selling something.
The full mechanism →It is also a knowledge backend
that other applications can call.
A clean-room integration surface
A model-context-protocol server exposing eleven tools, and an HTTP agent API behind it. The MCP server holds zero project references — it speaks HTTP with an API key exactly like any third party would, which the build graph enforces. It therefore cannot bypass access control, the retrieval barriers, or the meter.
Developers → Pipeline graphKnowledge processing as data
The background analysis passes stopped being hardcoded workers and became a graph of typed nodes and edges walked by a generic executor — with topological ordering, cycle rejection, per-node tracing, and hard runaway caps on node executions, model calls and spend.
Engineering →Propose, don't write
Agents write into a draft queue as generated provenance. Direct write needs an explicit scope that is off by default, and scopes only ever narrow.
Barriers before assembly
Access control runs before context is assembled, not as an output filter. A prompt-injected agent cannot coax out material that never entered its context.
Never a silent clip
Truncation is declared both in-band and as a structured field. Retrieval that doesn't lie to you about what it showed you.
Read the parts that interest you.
There is a narrative explanation, a deep technical one with the bench attached, and three lens pages showing what the same engine looks like pointed at three different problems.