1const R3_VERBS: &[&str] = &[
7 "self-evolve",
8 "self-improve",
9 "self-grade",
10 "self-optimize",
11 "self-tune",
12 "self-evaluate",
13];
14const R5_OPS: &[&str] = &["auto-close", "auto-prune", "self-stop", "auto-inherit"];
15
16fn hits(text: &str, words: &[&str]) -> Vec<String> {
17 let lower = text.to_lowercase();
18 words
19 .iter()
20 .filter(|w| lower.contains(*w))
21 .map(|w| w.to_string())
22 .collect()
23}
24
25pub fn r3_self_evolve(text: &str) -> Vec<String> {
27 hits(text, R3_VERBS)
28}
29
30pub fn r5_forbidden_op(text: &str) -> Vec<String> {
32 hits(text, R5_OPS)
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38 #[test]
39 fn r3_should_return_the_verb_when_the_system_is_a_self_evolve_subject() {
40 let text = "the retrieval system will self-evolve its schema";
42
43 let hits = r3_self_evolve(text);
45
46 assert_eq!(hits, vec!["self-evolve".to_string()]);
48 }
49
50 #[test]
51 fn r3_should_return_no_hits_when_text_is_ordinary() {
52 let text = "build our own retrieval; reject pgvector";
54
55 let hits = r3_self_evolve(text);
57
58 assert!(hits.is_empty());
60 }
61
62 #[test]
63 fn r5_should_return_the_op_when_text_describes_an_auto_close() {
64 let text = "the system will auto-close stale grounds";
66
67 let hits = r5_forbidden_op(text);
69
70 assert_eq!(hits, vec!["auto-close".to_string()]);
72 }
73}