Anatomy of an entry
An entry's database row is the source of truth; a human-readable file is a mirror of it. This page lists every field, then the actual allowed values and the exact rule that sets each one.
Every field on a knowledge entry
| Field | What it is | Source (one line) |
|---|---|---|
id |
Stable id like KE-0001 |
Auto-assigned sequentially at insert. |
type |
One of the 5 knowledge types | LLM-judged during extraction, validated against the closed list. |
topic |
What the entry is about (the title) | LLM-generated. Must match the position (no self-contradiction). |
position |
The actual stance or claim (the WHAT) | LLM-generated. |
reasoning |
The WHY behind the position | LLM-generated. Mandatory — no WHY means the entry is rejected. |
reasoning_pattern |
Slug of the thinking-move this entry exemplifies | Resolved by the patterns engine; can be null. |
confidence |
Reliability: high / medium / low | LLM-judged, and can be auto-promoted. |
stability |
Durability ("joints vs welds"): evergreen / stable / evolving | LLM-judged per entry; drives ranking decay. |
tier |
public / private visibility | All entries are public in v1 (private is a v2 concept). |
tags |
Free-form topic tags | LLM-generated list, unioned on merge. |
source_type |
Where it came from (chat / meeting) | Set by the ingesting path. |
source_channel |
The specific channel or meeting | Can be null. |
source_date |
Date of the source conversation | Set at ingest, refreshed on merge. |
source_url |
Permalink back to the source | The chat or meeting link, when available. |
corroboration_count |
How many times this position has recurred | Counter, starts at 1. |
last_corroborated_at |
When it was last re-seen | Timestamp written on each merge. |
superseded_by |
Points to the newer entry that replaced this one | Set when a contradiction is detected, else null. |
created_at |
When the row was first written | Timestamp at insert. |
The values themselves, and how each is computed
type — the 5 knowledge types
Set by the extraction LLM, then checked against a closed list. Anything off-list is dropped, never coerced. The five, and nothing else:
- framework — a repeatable, transferable mental model applied across situations. The most valuable type, because it helps reason about brand-new topics.
- decision — a specific choice together with its reasoning. Rejected if the WHY is missing — a decision without its rationale is worthless for extrapolation.
- standard — an enforceable bar phrased as "do this" or "don't do this". Distinct from a philosophy in that breaking a standard triggers pushback.
- philosophy — a genuine worldview belief phrased as "I believe...". Deeper than a standard and rare, so high signal. It informs reasoning but does not by itself trigger pushback.
- reaction — the principal evaluating someone's work, praise or criticism. Teaches the quality bar: what gets commended versus called out.
confidence — reliability, and auto-promotion
LLM-judged from how firmly the position is held (reliability — not merely whether it was said out loud). The three levels:
- high — stated explicitly and unambiguously as a held position.
- medium — stated clearly once, or a confident inference from explicit context. Also the default when the model leaves it unspecified.
- low — inferred, implied, or one-off.
How it can change without a human: once corroboration_count reaches 3, confidence is forced to high regardless of the original judgment — a position seen three separate times is, by definition, reliably held.
stability — durability, and how the decay is calculated
The "joints vs welds" idea, judged per entry (durability is independent of type — a philosophy can be an evergreen principle OR a shifting prior). The three levels, with the freshness half-life each maps to:
- evergreen — a core principle or identity that essentially never changes. Half-life is none; it never decays (a weld).
- stable — holds for a long time, revisited only on a real change. Half-life ~730 days (≈2 years). The default when unspecified.
- evolving — a current take or priority likely to shift within weeks. Half-life ~21 days.
The exact calculation (used only at read time, in the reranker):
freshness = exp( -days_old / half_life )
So an evolving entry loses about half its freshness weight every 3 weeks, a stable entry fades over years, and an evergreen entry keeps a freshness weight of 1.0 forever. An unparseable or future date returns 1.0 rather than being penalized.
Why not infer stability from type: an earlier design mapped all philosophy to "drifting", which would have decayed the core principles fastest — exactly backwards. It was rejected.
reasoning_pattern — how the slug is resolved
Not just copied from the model — it is resolved by the patterns engine (full detail in Reasoning patterns):
- If the extractor tagged a known slug, trust it and accumulate the observation onto that pattern. The field is that slug.
- If it tagged an unknown slug or gave free-text, that text is embedded and matched to the nearest existing pattern (cosine ≥ 0.72). If it matches, the field becomes the matched slug; otherwise a new provisional pattern is minted and the field becomes that new slug.
- If nothing applies (no signal, or the observation was rejected as pure communication style), the field is null.
tags — free-form, unioned on merge
An LLM-generated list of short topic keywords. There is no fixed vocabulary. On a merge, the surviving entry's tags become the union of both entries' tags — so a recurring position accumulates the labels people used across occurrences.
source_date — set at ingest, refreshed to the newer date
Initial value is the date of the source conversation. On every merge it is bumped to the newer of the two dates. Why: if the principal restates a position in a recent meeting, that position should count as fresh in ranking even though the entry was first created months ago.
corroboration_count — a plain counter that drives promotion
Not judged, just counted. Starts at 1 on insert, and gets +1 every time a near-duplicate is merged into this entry. It is the single input to the confidence auto-promotion above: reaching 3 promotes the entry to high confidence.
superseded_by — set only on a detected contradiction
Null while the entry is active. When a newer entry is judged to contradict this one (the principal changed their mind), this field is set to the new entry's id, and the row immediately drops out of all retrieval — search filters on superseded_by IS NULL. The old row is kept, not deleted, so the history of what was previously believed survives.
The read-time scores (computed, never stored)
Two numbers are computed on each /retrieve call and never written to the DB:
- relevance_score — cosine similarity of the question to the entry, clamped to [0,1] (1.0 = identical).
- final ranking score —
0.6 × relevance + 0.15 × type_weight + 0.15 × confidence_weight + 0.10 × freshness
- type_weight: framework 1.0, philosophy 0.9, standard 0.8, decision 0.7, reaction 0.5.
- confidence_weight: high 1.0, medium 0.7, low 0.4.
- freshness: the stability decay above.
Relevance leads at 0.6 so type and confidence act as tie-breakers among comparably-relevant entries — not overrides that let a generic-but-confident entry leapfrog a more-relevant one.