use super::*;
#[cfg(feature = "bundled-embedder")]
fn seed_corpus(db: &YantrikDB) {
let texts = [
"The postgres migration finished on the platform team's staging cluster",
"Alice Chen prefers dark mode in the editor and a 14 inch laptop",
"Encryption at rest uses AES-256-GCM with per-database keys",
"The quarterly revenue forecast was revised upward by the finance group",
"Sourdough starter needs feeding every twelve hours at room temperature",
"The flight to Lisbon leaves from terminal two on Sunday morning",
"Rust borrow checker errors usually mean a lifetime is too short",
"The dentist appointment moved to the second Tuesday of next month",
"Kubernetes ingress routes traffic by hostname and path prefix",
"My grandmother's piano was tuned by a shop on Fillmore Street",
"We agreed AT the standup that the analytics dashboard needs a rewrite.",
"The vendor renewed AT the last minute after finance objected twice.",
"She left AT dawn to catch the ferry across the estuary.",
"The kettle whistles AT precisely the wrong moment every morning.",
"He proposed AT the summit of a hill above the reservoir.",
"The bells ring AT noon in the village below the monastery.",
"The nightly build did NOT pass because a certificate expired quietly.",
"The archive was NOT indexed before the storage tier was rotated.",
];
let inputs: Vec<RecordInput> = texts
.iter()
.map(|t| RecordInput {
text: (*t).into(),
memory_type: "semantic".into(),
importance: 0.5,
valence: 0.0,
half_life: 604800.0,
metadata: empty_meta(),
embedding: db.embed(t).expect("embed"),
namespace: "default".into(),
certainty: 0.8,
domain: "general".into(),
source: "user".into(),
emotional_state: None,
idempotency_key: None,
created_at: None,
})
.collect();
db.record_batch(&inputs).expect("record_batch");
}
#[cfg(feature = "bundled-embedder")]
fn top_rids(db: &YantrikDB, query: &str, k: usize) -> Vec<String> {
let embedding = db.embed(query).expect("embed");
db.recall(
&embedding,
k,
None, None, false, true, Some(query), true, None,
None,
None,
None,
None,
false,
None, None, )
.expect("recall")
.into_iter()
.map(|r| r.rid)
.collect()
}
#[cfg(feature = "bundled-embedder")]
fn overlap(a: &[String], b: &[String]) -> usize {
a.iter().filter(|r| b.contains(r)).count()
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn appending_a_stopword_does_not_change_what_is_retrieved() {
let db = YantrikDB::with_default(":memory:").unwrap();
seed_corpus(&db);
for query in [
"postgres migration staging",
"what does Alice prefer",
"encryption keys",
"revenue forecast",
] {
let base = top_rids(&db, query, 5);
for stopword in ["at", "the", "did", "not"] {
let perturbed = top_rids(&db, &format!("{query} {stopword}"), 5);
let shared = overlap(&base, &perturbed);
assert!(
shared >= 3,
"appending {stopword:?} to {query:?} changed retrieval: \
only {shared}/5 shared.\n base = {base:?}\n perturbed = {perturbed:?}\n\
A function word became a join key — check entity extraction \
and the graph lane."
);
assert!(
base.first().map_or(false, |t| perturbed.contains(t)),
"appending {stopword:?} to {query:?} evicted the top hit entirely.\n \
base = {base:?}\n perturbed = {perturbed:?}"
);
}
}
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn query_casing_does_not_change_what_is_retrieved() {
let db = YantrikDB::with_default(":memory:").unwrap();
seed_corpus(&db);
for query in [
"Alice Chen dark mode",
"encryption at rest",
"postgres migration",
] {
let base = top_rids(&db, query, 5);
for variant in [query.to_lowercase(), query.to_uppercase()] {
let perturbed = top_rids(&db, &variant, 5);
let shared = overlap(&base, &perturbed);
assert!(
shared >= 4,
"casing changed retrieval for {query:?} -> {variant:?}: \
{shared}/5 shared.\n base = {base:?}\n perturbed = {perturbed:?}"
);
}
}
}
#[cfg(feature = "bundled-embedder")]
#[test]
#[ignore]
fn an_all_caps_heading_does_not_outrank_its_sentence_case_twin() {
let db = YantrikDB::with_default(":memory:").unwrap();
seed_corpus(&db);
let body = "The staging cluster reboots on Fridays and the runbook lives in the wiki.";
let shouty = db
.record_text(
&format!("IMPORTANT NOTE ABOUT THE DEPLOYMENT PROCESS AND WHAT USERS MUST DO. {body}"),
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
let calm = db
.record_text(
&format!(
"Important note about the release process and what operators should do. {body}"
),
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
let unrelated = [
"sourdough starter feeding",
"piano tuning Fillmore",
"dentist appointment",
"flight to Lisbon terminal",
"borrow checker lifetime",
"quarterly revenue forecast",
"dark mode editor preference",
"ingress hostname routing",
];
let mut shouty_hits = 0;
let mut calm_hits = 0;
for query in unrelated {
let hits = top_rids(&db, query, 5);
if hits.contains(&shouty) {
shouty_hits += 1;
}
if hits.contains(&calm) {
calm_hits += 1;
}
}
assert!(
shouty_hits <= calm_hits,
"CAPITALISATION ALONE made a record more retrievable by unrelated queries: the ALL-CAPS variant surfaced for {shouty_hits}/{} unrelated queries against {calm_hits}/{} for its sentence-case twin with the same body and length. Check entity extraction — a heading is becoming a join key.",
unrelated.len(),
unrelated.len()
);
}
#[cfg(feature = "bundled-embedder")]
#[test]
#[ignore]
fn diag_what_entities_exist() {
let db = YantrikDB::with_default(":memory:").unwrap();
seed_corpus(&db);
let conn = db.conn();
let mut stmt = conn
.prepare("SELECT name, mention_count FROM entities ORDER BY mention_count DESC")
.unwrap();
let rows: Vec<(String, i64)> = stmt
.query_map([], |r| Ok((r.get(0)?, r.get(1)?)))
.unwrap()
.filter_map(|r| r.ok())
.collect();
drop(stmt);
drop(conn);
println!("ENTITIES ({}):", rows.len());
for (n, c) in &rows {
println!(" {n:?} x{c}");
}
let a = top_rids(&db, "postgres migration staging", 5);
let b = top_rids(&db, "postgres migration staging at", 5);
println!("base = {a:?}");
println!("perturbed = {b:?}");
println!("shared = {}", overlap(&a, &b));
}
#[cfg(feature = "bundled-embedder")]
#[test]
#[ignore]
fn diag_which_write_paths_populate_the_graph() {
let count = |db: &YantrikDB| -> i64 {
let conn = db.conn();
let n: i64 = conn
.query_row("SELECT COUNT(*) FROM entities", [], |r| r.get(0))
.unwrap();
let l: i64 = conn
.query_row("SELECT COUNT(*) FROM memory_entities", [], |r| r.get(0))
.unwrap();
drop(conn);
println!(" entities={n} links={l}");
n
};
let text = "Alice Chen met Bob Smith at Yantrik Systems in San Francisco";
println!("record_text (single):");
let db1 = YantrikDB::with_default(":memory:").unwrap();
db1.record_text(
text,
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
let a = count(&db1);
println!("record (single, explicit embedding):");
let db2 = YantrikDB::with_default(":memory:").unwrap();
let e = db2.embed(text).unwrap();
db2.record(
text,
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
&e,
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
let b = count(&db2);
println!("record_batch (one input):");
let db3 = YantrikDB::with_default(":memory:").unwrap();
let e3 = db3.embed(text).unwrap();
db3.record_batch(&[RecordInput {
text: text.into(),
memory_type: "semantic".into(),
importance: 0.5,
valence: 0.0,
half_life: 604800.0,
metadata: empty_meta(),
embedding: e3,
namespace: "default".into(),
certainty: 0.8,
domain: "general".into(),
source: "user".into(),
emotional_state: None,
idempotency_key: None,
created_at: None,
}])
.unwrap();
let c = count(&db3);
println!("\nSUMMARY: record_text={a} record={b} record_batch={c}");
}
#[cfg(feature = "bundled-embedder")]
#[test]
#[ignore]
fn diag_does_think_backfill_the_graph() {
let text = "Alice Chen met Bob Smith at Yantrik Systems in San Francisco";
let db = YantrikDB::with_default(":memory:").unwrap();
db.record_text(
text,
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
let n0: i64 = db
.conn()
.query_row("SELECT COUNT(*) FROM entities", [], |r| r.get(0))
.unwrap();
println!("after record_text: entities={n0}");
let cfg = ThinkConfig::default();
let _ = db.think(&cfg);
let n1: i64 = db
.conn()
.query_row("SELECT COUNT(*) FROM entities", [], |r| r.get(0))
.unwrap();
println!("after think(default): entities={n1}");
}
#[cfg(feature = "bundled-embedder")]
#[test]
#[ignore]
fn diag_materializer_drains_single_write_entities() {
let text = "Alice Chen met Bob Smith at Yantrik Systems in San Francisco";
let db = YantrikDB::with_default(":memory:").unwrap();
db.record_text(
text,
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
let n0: i64 = db
.conn()
.query_row("SELECT COUNT(*) FROM entities", [], |r| r.get(0))
.unwrap();
let pend: i64 = db
.conn()
.query_row("SELECT COUNT(*) FROM oplog WHERE applied = 0", [], |r| {
r.get(0)
})
.unwrap();
println!("after record_text: entities={n0} pending_ops={pend}");
let applied = db.apply_pending_ops_once(256);
println!("apply_pending_ops_once -> {applied:?}");
let n1: i64 = db
.conn()
.query_row("SELECT COUNT(*) FROM entities", [], |r| r.get(0))
.unwrap();
println!("after drain: entities={n1}");
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn lane_agreement_breaks_ties_between_near_equals() {
let db = YantrikDB::with_default(":memory:").unwrap();
let rec = |t: &str| {
db.record_text(
t,
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap()
};
let both_lanes = rec("the deploy pipeline pushes to the staging cluster nightly");
let _vector_only =
rec("the release automation ships builds to the test environment each evening");
let hits = db.recall_text("deploy pipeline staging", 2).unwrap();
assert_eq!(
hits[0].rid,
both_lanes,
"the record surfaced by BOTH vector and lexical lanes must outrank a \
vector-only near-equal; got {:?}",
hits.iter().map(|h| (&h.rid, h.score)).collect::<Vec<_>>()
);
assert!(
hits[0]
.why_retrieved
.iter()
.any(|w| w.contains("multi-lane agreement")),
"the boost must be explainable in why_retrieved; got {:?}",
hits[0].why_retrieved
);
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn lane_agreement_cannot_promote_an_irrelevant_record() {
use crate::base::scoring::{agreement_mult, POLICY_BUDGET_LN, PW_AGREEMENT};
assert!((agreement_mult(0) - 1.0).abs() < 1e-12);
assert!(
(agreement_mult(2) - (POLICY_BUDGET_LN * PW_AGREEMENT).exp()).abs() < 1e-12,
"agreement must spend exactly its budget share, no more"
);
assert_eq!(
agreement_mult(2),
agreement_mult(9),
"cap at two extra lanes"
);
assert!(
agreement_mult(9) < POLICY_BUDGET_LN.exp(),
"one prior alone must never consume the whole budget"
);
let db = YantrikDB::with_default(":memory:").unwrap();
let rec = |t: &str| {
db.record_text(
t,
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap()
};
let on_topic = rec("the quarterly budget review moved to the first Monday of the month");
let _bait = rec("deploy staging deploy staging unrelated grocery list apples");
let hits = db
.recall_text("when is the quarterly budget review", 2)
.unwrap();
assert_eq!(
hits[0].rid,
on_topic,
"keyword bait with no semantic relevance must not overtake the on-topic \
record, whatever lanes it matched; got {:?}",
hits.iter().map(|h| (&h.rid, h.score)).collect::<Vec<_>>()
);
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn domain_filter_holds_across_every_lane() {
let db = YantrikDB::with_default(":memory:").unwrap();
let rec = |text: &str, domain: &str| {
db.record_text(
text,
"semantic",
0.6,
0.0,
604800.0,
&empty_meta(),
"default",
0.9,
domain,
"user",
None,
)
.unwrap()
};
let _work = rec("the postgres migration runs on the staging cluster", "work");
let health = rec(
"the postgres migration runs on the staging cluster nightly",
"health",
);
let hits = db
.recall_text_filtered("postgres migration staging cluster", 20, Some("work"), None)
.unwrap();
assert!(
!hits.iter().any(|h| h.rid == health),
"a domain='work' recall returned a domain='health' record — the caller's \
filter was bypassed by a secondary lane; got {:?}",
hits.iter().map(|h| (&h.rid, &h.domain)).collect::<Vec<_>>()
);
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn certainty_floor_holds_across_every_lane() {
let db = YantrikDB::with_default(":memory:").unwrap();
let low = db
.record_text(
"the postgres migration runs on the staging cluster",
"semantic",
0.9,
0.0,
604800.0,
&empty_meta(),
"default",
0.2,
"general",
"user",
None,
)
.unwrap();
db.record_text(
"unrelated grocery list apples bananas",
"semantic",
0.6,
0.0,
604800.0,
&empty_meta(),
"default",
0.95,
"general",
"user",
None,
)
.unwrap();
let emb = db.embed("postgres migration staging cluster").unwrap();
let hits = db
.recall(
&emb,
20,
None,
None,
false,
false,
Some("postgres migration staging cluster"),
true,
None,
None,
None,
Some(0.8),
None,
false,
None, None, )
.unwrap();
assert!(
!hits.iter().any(|h| h.rid == low),
"a certainty_min=0.8 recall returned a certainty=0.2 record; got {:?}",
hits.iter()
.map(|h| (&h.rid, h.certainty, &h.why_retrieved))
.collect::<Vec<_>>()
);
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn quotas_are_unlimited_by_default() {
let t = crate::base::tuning::Tuning::default();
assert_eq!(t.quota_vector, 1.0);
assert_eq!(t.quota_lexical, 1.0);
assert_eq!(t.quota_claims, 1.0);
assert_eq!(t.quota_graph, 1.0);
assert_eq!(t.quota_exploration, 1.0);
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn a_quota_actually_removes_over_quota_candidates() {
use crate::engine::recall::apply_lane_quotas;
let db = YantrikDB::with_default(":memory:").unwrap();
for i in 0..30 {
db.record_text(
&format!("deploy pipeline staging cluster note number {i}"),
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
}
let hits = db.recall_text("deploy pipeline staging", 20).unwrap();
assert!(hits.len() >= 10, "sanity: need a pool, got {}", hits.len());
let empty = std::collections::HashMap::new();
let mut pool = hits.clone();
apply_lane_quotas(&mut pool, &empty, 20);
assert_eq!(
pool.len(),
hits.len(),
"unlimited quotas must not change the pool"
);
}
#[cfg(feature = "bundled-embedder")]
#[test]
fn a_quota_preserves_relative_order_within_a_lane() {
use crate::engine::recall::apply_lane_quotas;
let db = YantrikDB::with_default(":memory:").unwrap();
for i in 0..20 {
db.record_text(
&format!("release checklist item {i} for the deployment runbook"),
"semantic",
0.5,
0.0,
604800.0,
&empty_meta(),
"default",
0.8,
"general",
"user",
None,
)
.unwrap();
}
let hits = db.recall_text("release checklist deployment", 15).unwrap();
let before: Vec<String> = hits.iter().map(|h| h.rid.clone()).collect();
let mut pool = hits.clone();
let empty = std::collections::HashMap::new();
apply_lane_quotas(&mut pool, &empty, 15);
let after: Vec<String> = pool.iter().map(|h| h.rid.clone()).collect();
assert_eq!(before, after, "quotas must not reorder within a lane");
}