Emergent discovery
The synthesis pipeline maintains and grows the corpus from what is already written. Discovery goes one step further: it surfaces facts nobody wrote down, by inference — both forward (new consequences) and backward (unstated keystones).
Why retrieval can’t find them
Section titled “Why retrieval can’t find them”The most load-bearing facts are the least likely to be written down — precisely because they are so foundational that everyone assumes them. Retrieval finds what is similar to your query, but a keystone underwrites facts that are dissimilar to each other, so similarity can never surface it. That is not a tuning problem; it is structural. knomit reads the shape of the graph instead: a tag shared across two otherwise-unrelated clusters is the seam where an unwritten premise hides.
synthesis hypothesis, ranked by blast radius A bridge is two facts that share a domain or entity yet live in different similarity clusters (distinct Louvain communities over the embedding graph). That cross-cluster shared token is the signal similarity missed. Discovery seeds from bridges and runs them in two directions.
The communities come from the cluster cache, whose Louvain parameters are
[cluster_cache] resolution (default 4.0 — higher γ yields more, smaller
communities) and min_community_size (default 2, below which a community is
relabelled as noise). Both have KNOMIT_CLUSTER_CACHE_* overrides; see
Configuration.
The two directions
Section titled “The two directions”| Direction | Shape | Operation | Produces |
|---|---|---|---|
| Forward | consequence — E follows from {A,B,…} but no single fact states it | knomit_review | synthesis fact |
| Backward | keystone — unstated premise E that, if false, invalidates {A,B,…} | knomit_hypothesize | hypothesis fact, ranked by blast radius |
Both write origin: discovered. The boundary is deliberate: synthesis emits
synthesis facts, hypothesize emits hypothesis facts — discovery only adds a
direction to each, never a new fact type.
The effort dial
Section titled “The effort dial”effort (normal · medium · high) is a dial on the existing review /
hypothesize operations rather than a separate tool — and it doubles as a budget.
normal is the default and reproduces pre-discovery behaviour byte-for-byte (a
hard invariant); medium / high engage the structural-bridge engine. Between
those two levels effort changes exactly one thing: the candidate budget — the
bridge pool is capped at 12 seed sets at medium and 48 at high. The cap
applies to scoped and unscoped runs alike, so a high run never attempts the
whole corpus.
A call that omits effort falls back to
KNOMIT_DISCOVERY_EFFORT_DEFAULT (or [discovery] effort_default), default
normal. Set it to medium or high to make discovery the standing behaviour
of an endpoint rather than a per-call opt-in.
An optional scope filter (domain / entities args) bounds the seed pool;
empty = whole corpus. A scoped run is exempt from the synthesis watermark, so
you can re-target discovery at one area without disturbing unscoped runs.
Discovery never feeds on its own output — origin: discovered facts are excluded
as bridge seeds.
The bridge quality gate
Section titled “The bridge quality gate”Not every bridge is worth spending a work item on. Before a seed set reaches the model, the scorer rejects it outright unless all three hold:
- Cohesion ≥
coh_floor(default0.5) — the fraction of member pairs joined by aSIMILAR_TOedge. A set whose members are unrelated to each other is noise, not a seam. - Separation ≥ 2 distinct communities — a set inside one cluster is not a bridge. This is fixed in code, not configurable.
- Members ≤
max_members(default5) — larger sets are gated out rather than scored.
Sets that pass are scored
Q = w_coh·cohesion + w_gap·derivation_gap + w_spec·specificity (weights all
default 1.0) and kept when Q ≥ quality_floor (default 0.0, which keeps
every gate-passing set). The three components measure different things:
cohesion is how tightly the members hang together, derivation gap is the
fraction of member pairs not already linked by DERIVED_FROM (a set whose
members already derive from one another states nothing new), and
specificity is the rarity of the shared token, 1/df, so a token appearing
on half the corpus contributes almost nothing.
Tune it when discovery is spending its budget on candidates you keep rejecting.
Raising quality_floor above 0 is the blunt lever; the weights let you say
why — raise w_spec if the run keeps bridging on generic tags, raise w_gap
if it keeps re-stating things already derived. The scored components are
exposed by the calibrate tool, so a floor can be picked against a real corpus
rather than guessed.
These six keys are TOML-only — they have no KNOMIT_* environment
override, so a purely env-configured deployment cannot reach them. Defaults and
placement are in Configuration.
Verification is model-less
Section titled “Verification is model-less”There is no second adversarial model — the connected MCP agent is the sole reasoner. Quality is enforced by a strict default-skip prompt plus an ingest gate chain:
KNOMIT_DISCOVERY_CONFIDENCE_THRESHOLD(default0.5) — minimum confidence to write a proposal.KNOMIT_DISCOVERY_BLAST_RADIUS_THRESHOLD(default1,0disables) — a backward keystone’s anchor must transitively reach at least this many live dependents (transitive reverse-DERIVED_FROMcount, live at HEAD).- Embedding dedup against the corpus rejects a proposal already stated elsewhere.
Bridge behaviour is per-repo configurable via KNOMIT_DISCOVERY_BRIDGE
(domain · entity · both, default both). It is honoured on unscoped
runs only; a scoped run uses the filtered bridge generator, which always bridges
on both axes.
The origin axis
Section titled “The origin axis”Discovery is one value of a fact’s origin — the record of how it came to
exist, orthogonal to type and kind: