pub struct Trace {Show 15 fields
pub id: String,
pub kind: TraceKind,
pub content: String,
pub tags: Vec<String>,
pub created_at_ms: u64,
pub deadline_ms: Option<u64>,
pub salience: f32,
pub confidence: f32,
pub privacy: PrivacyClass,
pub provenance: Provenance,
pub claim_key: Option<String>,
pub claim_value: Option<String>,
pub supersedes: Option<String>,
pub prediction: Option<PredictionRecord>,
pub outcome: Option<OutcomeRecord>,
}Fields§
§id: String§kind: TraceKind§content: String§created_at_ms: u64§deadline_ms: Option<u64>§salience: f32§confidence: f32§privacy: PrivacyClass§provenance: Provenance§claim_key: Option<String>§claim_value: Option<String>§supersedes: Option<String>§prediction: Option<PredictionRecord>Structured payload of a Prediction trace (typed decision port).
outcome: Option<OutcomeRecord>Structured payload of an Outcome trace that resolves a prediction.
Implementations§
Source§impl Trace
impl Trace
Sourcepub fn new(
kind: TraceKind,
content: impl Into<String>,
source: impl Into<String>,
) -> Self
pub fn new( kind: TraceKind, content: impl Into<String>, source: impl Into<String>, ) -> Self
Examples found in repository?
More examples
True when a decision engine, not a person or tool, wrote this trace.
Sourcepub fn is_from_agent_session(&self) -> bool
pub fn is_from_agent_session(&self) -> bool
True when the trace was written from a detected AI agent session (see
crate::principal). source stays whatever the caller claimed.
Sourcepub fn validate(&self) -> Result<()>
pub fn validate(&self) -> Result<()>
Examples found in repository?
examples/retrieval_bench.rs (line 167)
144fn retrieve(corpus: &Path, queries: &Path, dir: &Path, dataset: &str, k: usize) -> Result<()> {
145 if !(1..=100).contains(&k) || dataset.trim().is_empty() {
146 return Err("k must be 1..100 and dataset must be nonempty".into());
147 }
148 let policy = KernelPolicy {
149 recall_limit: k,
150 ..KernelPolicy::default()
151 };
152 let path = fresh(dir)?;
153 let source = format!("beir:{dataset}");
154 let mut store = MemoryStore::open(&path, policy.clone())?;
155 let mut baseline = Bm25::default();
156 let mut ids = HashSet::new();
157 let mut rejected = Vec::new();
158 let mut batch = Vec::new();
159 let mut baseline_index_ms = 0.0;
160 let ingest = Instant::now();
161 for line in BufReader::new(File::open(corpus)?).lines() {
162 let doc: Document = serde_json::from_str(&line?)?;
163 if doc.id.trim().is_empty() || !ids.insert(doc.id.clone()) {
164 return Err("empty or duplicate document id".into());
165 }
166 let trace = make_trace(&doc.id, &doc.content, &source, TraceKind::Observation);
167 if let Err(reason) = trace.validate() {
168 rejected.push(json!({"id": doc.id, "reason": reason.to_string()}));
169 continue;
170 }
171 let timer = Instant::now();
172 baseline.add(&doc);
173 baseline_index_ms += ms(timer);
174 batch.push(trace);
175 if batch.len() == 1000 {
176 store.remember_many(std::mem::take(&mut batch))?;
177 }
178 }
179 if !batch.is_empty() {
180 store.remember_many(batch)?;
181 }
182 let ingest_ms = ms(ingest);
183 store.verify()?;
184 let head_before = serde_json::to_value(store.head())?;
185 drop(store);
186 let start = Instant::now();
187 let store = MemoryStore::open_existing(&path, policy)?;
188 let reopen_ms = ms(start);
189 store.verify()?;
190 let provenance_retained = store
191 .all()
192 .filter(|entry| {
193 let t = &entry.trace;
194 t.provenance.source == source
195 && !t.provenance.verified
196 && t.created_at_ms == CLOCK
197 && t.provenance.observed_at_ms == CLOCK
198 && t.provenance.locator.as_deref() == Some(format!("{source}:{}", t.id).as_str())
199 })
200 .count();
201 if store.record_count() != baseline.ids.len()
202 || provenance_retained != baseline.ids.len()
203 || serde_json::to_value(store.head())? != head_before
204 {
205 return Err("replay, head or provenance invariant failed".into());
206 }
207 emit(
208 json!({"kind": "loaded", "corpus_total": ids.len(), "admitted": baseline.ids.len(),
209 "rejected": rejected, "provenance_retained": provenance_retained,
210 "ingest_both_ms": ingest_ms, "bm25_index_ms": baseline_index_ms, "reopen_ms": reopen_ms,
211 "policy": store.policy(), "bm25": {"k1": 1.2, "b": 0.75}, "query_clock_ms": CLOCK}),
212 )?;
213 let mut query_ids = HashSet::new();
214 for line in BufReader::new(File::open(queries)?).lines() {
215 let q: Query = serde_json::from_str(&line?)?;
216 if q.id.trim().is_empty() || !query_ids.insert(q.id.clone()) {
217 return Err("invalid query id".into());
218 }
219 let mut query = RecallQuery::new(&q.text);
220 query.now_ms = CLOCK;
221 query.limit = k;
222 let start = Instant::now();
223 let recalled = store.recall(&query);
224 let hikmah_ms = ms(start);
225 let start = Instant::now();
226 let bm25 = baseline.search(&q.text, k);
227 let bm25_ms = ms(start);
228 let hikmah: Vec<_> = recalled.into_iter().map(|r| json!({
229 "id": r.trace.id, "score": r.score, "duplicates_folded": r.duplicates,
230 "provenance_source": r.trace.provenance.source, "verified": r.trace.provenance.verified,
231 })).collect();
232 emit(
233 json!({"kind": "query", "id": q.id, "hikmah": hikmah, "bm25": bm25,
234 "hikmah_ms": hikmah_ms, "bm25_ms": bm25_ms}),
235 )?;
236 }
237 emit(json!({"kind": "finished", "queries": query_ids.len()}))
238}Trait Implementations§
Source§impl<'de> Deserialize<'de> for Trace
impl<'de> Deserialize<'de> for Trace
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl StructuralPartialEq for Trace
Auto Trait Implementations§
impl Freeze for Trace
impl RefUnwindSafe for Trace
impl Send for Trace
impl Sync for Trace
impl Unpin for Trace
impl UnsafeUnpin for Trace
impl UnwindSafe for Trace
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more