Concepts
RememberStack has two deliberately separate truth layers. Claims are
immutable source testimony (“what was asserted, by whom, when”);
facts—relations and observations—are the adjudicated worldview (“what the
system holds or held true”): supersession-adjudicated, clocked on two time
axes (when a fact held in the world, and when the system learned it),
evidence-counted per distinct source—repetition is not corroboration—and
contradiction-tracked. The fact_claim_evidence association is the auditable
bridge between the layers, recording which claims support or contradict each
fact. Query claims to inspect testimony; query facts to answer current or
historical truth questions, then follow the bridge to see why the system
believes or believed the fact.
(Internally these guarantees are decisions D41 and D54.)
One distinction carries the whole system: what a source said is not the same as what is currently true. Sources go stale, contradict each other, and get corrected. Memory that conflates testimony with truth either serves outdated statements as facts or silently rewrites history.
This page is the vocabulary every other page assumes.
TL;DR for agents
| Term | Use it for | Never use it for |
|---|---|---|
| claim | Audit: who asserted what | Answering “is it true now?” |
| relation / observation (facts) | Current belief | Pretending sources never disagreed |
| compiled page | Orientation | Load-bearing action without verify |
| evidence_count | Independent corroboration | “How many times extraction ran” |
Default motion: orient → verify → audit.

Terminology ladder

| Term | What it is | Can it change? |
|---|---|---|
| claim | What one source said — permanent record of one assertion, grounded to a span | Never (immutable) |
| relation | A fact linking two entities — (Alice, works_for, Acme) | Validity window closes when superseded |
| observation | A fact stating a value about one entity — “Acme headcount: 600” | Same rules; lives beside relations (not projected to the graph) |
| fact | Umbrella for relation or observation — what the system currently holds | Revisable; full history kept |
| core principle | Chosen personal/org stance — authored K2 content | Only its author changes it; evidence changes raise review flags, never rewrite it |
Example: “the roster says Bob is CFO” enters as a claim, adjudicates into a relation (Bob works_for Acme or a role relation), and may appear in a compiled K page. A principle like “we never promote on rumor alone” is authored knowledge that may cite that history — it is never inferred from it.
Grains — typed answers
Every assured response is labeled with the grain of what it contains:
| Grain | Payload | Agent reading |
|---|---|---|
fact | Relations + observations under validity filters | Default for “is it true now?” |
evidence | Claims (and typed chunks as source-text fallback) | “Who said what”; may be stale or contradictory |
compiled | K pages with compiled_at / staleness | Orientation; verify before acting |
composite | One operation's cohesive mixed typed result | Independent complete responses |
When an agent needs both testimony and facts, combined_context returns
ContextBundle/v2 with complete claims_and_sources and facts envelopes. It is not a
composite envelope and does not blend or re-rank the two authorities.
Contract: current-fact answers may be assembled only from validity-filtered facts. Claim asserted-validity intervals are testimony, never verdict. The registry linter rejects operations that would smuggle claims into current_facts intent.
Evidence-grain defaults to current testimony: re-extracted or living-version-superseded claims are excluded unless you opt into historical/superseded modes. See Lifecycle.
Two clocks

Facts carry two independent axes:
| Axis | Parameter | Question |
|---|---|---|
| World time | valid_at | When was this true in the world? |
| System time | believed_at | When did we hold this belief? |
Compose multi-step temporal questions from ordinary calls: resolve an event time from one result, feed it as valid_at to the next. No special “timeline engine” is required.
Media locator is a third coordinate (offset in a recording / region in an image). Do not mix it with validity or belief time.
Supersession, not overwrite
New information closes a validity window on the old fact. Nothing is silently erased. You can still ask what was believed before the close.
Contradictions are loud
When sources disagree, both positions stay. They form a contradiction group. Retrieval must return co-members (bounded inline + continuation). Returning one side alone is a contract violation, not a ranking preference.
Evidence counting
Support count = distinct document lineages with current testimony supporting the fact.
Does not inflate from:
- re-extraction with a new model generation
- version churn on one lineage
- repeated sentences inside one document
When sole current support disappears:
- Living document removal → fact closed (
retracted_source_removal) — recorded, reversible - Toolchain re-extraction that fails to re-derive → support may show
withdrawnand needs caveat + audit (not silent vanish)
Identity
Entities live in a canonical registry with aliases and tiered resolution.
| When | What ships today |
|---|---|
| Write-time resolution | Full cascade: exact/fuzzy/phonetic candidates → profile embedding → gated LLM residue |
Query-time resolve_entity | T0 exact alias match; ranked candidates on ambiguity — never a silent single guess |
An entity profile is orientation, not identity or a type. It is a disposable projection of current supported observations and relations. Write-time T3 compares the mention name plus its claim context with the candidate name plus profile and salient facts; it never compares two name-only vectors. An entity with no evidence has no T3 vector and reaches T4 instead. T4 receives every candidate in the bounded snapshot with aliases, current profile description, salient statements, and its T3 score or gate.
At write time, an exact name is normally only a T0 candidate signal. It never
silently accepts or merges an entity across documents. There is one bounded
exception: after T4 has matched that exact canonical name to one entity in a
document, later exact repeats in the same document may replay that match at T0.
The replay is disabled if the binding is absent, ambiguous, stale, or not built
at the current document-t0-v1 generation; fuzzy T1/T2 candidates never gain
this authority. One candidate with a current profile may otherwise be accepted
by T3. Empty or conflicting evidence, and every multiple-candidate case,
reaches one binary, match-biased T4 call on the configured simple model.
It selects one supplied candidate id or new. Compatible evidence favors the
existing entity; missing overlap and different topics are not evidence of a
different referent. new requires positive distinction from every supplied
candidate. Confidence remains in the audit but never routes to a frontier
model, and candidate truncation remains visible without creating a third
decision state.
Profile refreshes are evidence-change debounced. If evidence is withdrawn, the cached summary and vector rebuild or clear. Hard-forgetting one source of a shared entity rebuilds from the surviving sources, so forgotten phrases do not remain in the summary or semantic vector.
A successful evidence-backed profile publication nominates that entity's alias neighborhood for bounded convergence. Automatic merging remains off until its profile-space threshold is calibrated; equivalent open review proposals are deduplicated, and every accepted merge remains a reversible redirect.
Merges follow survivor chains with redirects disclosed. For nickname/misspelling recall at read time, use evidence search (claims_and_sources_context) rather than assuming fuzzy resolve. There is no deployment-wide exact-name auto-accept switch in the shipped cascade.
Document identity (write path)
Three IDs stay distinct:
| ID | Role |
|---|---|
| content_hash | Immutable bytes (store once) |
| doc_id (lineage) | Logical document over time (connector-native source_ref) |
| version_id | One observed snapshot of a lineage |
Versioning mode per lineage: snapshot (archival successive reports) vs living (standing statement / wiki). Details: Lifecycle.
Progressive disclosure of knowledge (Plane K)
K pages are prose syntheses over the fact layer:
- Compiled pages regenerate when routing rules say evidence changed.
- Authored pages (plans, principles) are never machine-rewritten; evidence drift raises flags.
K is orientation. Facts are verification. Claims are audit.
Next
- Architecture — planes, stores, end-to-end flow
- Ingestion — how claims and facts are produced
- Retrieval — how agents consume them