Skip to content

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).

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.

Embedding similarity only ever draws the dense within-cluster edges — it is structurally blind to the cross-cluster token. The bridge is that missed link; the keystone is the load-bearing fact it implies — the one nobody wrote down precisely because it underwrites things that look unrelated.
forward · knomit_review {A, B, C} → E a consequence that follows from the bridged facts but none states alone → new synthesis
backward · knomit_hypothesize E → {A, B, C} an unstated premise that, if false, breaks them → new 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.

DirectionShapeOperationProduces
Forwardconsequence — E follows from {A,B,…} but no single fact states itknomit_reviewsynthesis fact
Backwardkeystone — unstated premise E that, if false, invalidates {A,B,…}knomit_hypothesizehypothesis 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.

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.

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:

  • Cohesioncoh_floor (default 0.5) — the fraction of member pairs joined by a SIMILAR_TO edge. 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.
  • Membersmax_members (default 5) — 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.

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 (default 0.5) — minimum confidence to write a proposal.
  • KNOMIT_DISCOVERY_BLAST_RADIUS_THRESHOLD (default 1, 0 disables) — a backward keystone’s anchor must transitively reach at least this many live dependents (transitive reverse-DERIVED_FROM count, 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.

Discovery is one value of a fact’s origin — the record of how it came to exist, orthogonal to type and kind: