KeiSeiKit-1.0/_primitives/_rust/kei-frustration-loop/tests/nightly_smoke.rs
Parfii-bot 0be354a920 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

100 lines
3.3 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! Nightly-scan smoke test. Build a tiny traces dir with three JSONL files,
//! one of which contains an `опять` user line that the regex SSoT
//! `repeat-signal` category must match. Assert ScanReport.hits >= 1 and
//! the queue file has at least one row.
use frustration_matrix::firmware::Firmware;
use kei_frustration_loop::nightly::{nightly_scan, QueuedHit};
use std::fs;
use tempfile::TempDir;
fn write_trace(dir: &std::path::Path, name: &str, lines: &[&str]) {
let path = dir.join(name);
let body = lines.join("\n");
fs::write(&path, body).unwrap();
}
#[test]
fn three_files_one_hit() {
let dir = TempDir::new().unwrap();
let traces = dir.path().join("traces");
fs::create_dir_all(&traces).unwrap();
let queue = dir.path().join("queue.jsonl");
// File 1 — assistant only, must produce zero hits.
write_trace(
&traces,
"session-a.jsonl",
&[r#"{"type":"assistant","message":{"role":"assistant","content":"hello"}}"#],
);
// File 2 — user message that matches the `repeat-signal` regex
// (`\bопять\b` is in `categories.rs`). One hit expected.
write_trace(
&traces,
"session-b.jsonl",
&[
r#"{"type":"user","content":"стоп — ты опять полез не туда"}"#,
],
);
// File 3 — user message that's too short / no triggers, zero hits.
write_trace(
&traces,
"session-c.jsonl",
&[r#"{"type":"user","content":"ok thanks for the help"}"#],
);
// Firmware can be a trivial 4-char model — nightly_scan does not
// currently use the firmware for the regex path; we still must pass it.
let firmware = Firmware::train_from_text("hello world ", 1);
let report = nightly_scan(&traces, &firmware, "test-user", 0, &queue).unwrap();
assert_eq!(report.scanned, 3, "expected 3 files scanned, got {}", report.scanned);
assert!(report.hits >= 1, "expected ≥1 hit, got {}", report.hits);
assert!(
report.by_category.contains_key("repeat-signal"),
"expected repeat-signal in by_category, got {:?}",
report.by_category
);
// Queue file must exist + contain at least one parseable JSON row.
let body = fs::read_to_string(&queue).unwrap();
let mut count = 0usize;
for line in body.lines() {
if line.trim().is_empty() {
continue;
}
let _: QueuedHit = serde_json::from_str(line)
.unwrap_or_else(|e| panic!("queue line not parseable: {e}: {line}"));
count += 1;
}
assert!(count >= 1, "expected ≥1 queued hit, got {count}");
}
#[test]
fn since_filter_excludes_old_traces() {
let dir = TempDir::new().unwrap();
let traces = dir.path().join("traces");
fs::create_dir_all(&traces).unwrap();
let queue = dir.path().join("queue.jsonl");
write_trace(
&traces,
"old.jsonl",
&[r#"{"type":"user","content":"опять опять опять"}"#],
);
let firmware = Firmware::train_from_text("ab ab ab ", 1);
// Using a since_ts in the far future — every file's mtime is in the
// past, so collect_recent_traces should return nothing.
let report = nightly_scan(
&traces,
&firmware,
"u",
u64::MAX / 2,
&queue,
)
.unwrap();
assert_eq!(report.scanned, 0);
assert_eq!(report.hits, 0);
}