feat(decide): memory rerank and paper triage on the decision tier
deploy / test (push) Successful in 5m23s
deploy / build (push) Successful in 5m27s

mission_memory::recall is two stages when a key is set: BM25 proposes 8
candidates, one Noul per candidate ('this earlier verdict is relevant to
the task') reorders them and drops those under 0.3, three are kept. BM25
measures keyword overlap, and a verdict about MICROVM.md shares words
with every task that names a file. Without a key the BM25 order stands.

continuous_research: topic_tags was written as [] on every manifest line
since the manifest existed. triage_papers asks, per harvested paper, a
Choice over the mission's topics (readable names, the arXiv query as the
description, 'none' offered) and a four-level relevance Score; the tags
(every topic ≥ 0.3) and {score, confidence} land on the line the agents
already read. Probe on PORTICO's abstract: relevance 3.0 at 1.0; topic
'none' 0.59 / verification 0.41 — true, the topic list has no
authority/sandboxing entry. Untriaged papers write the old empty line.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Omar Sobh
2026-09-21 14:09:28 -05:00
co-authored by Claude Opus 5
parent 2656d73def
commit 33560c7fe6
4 changed files with 255 additions and 17 deletions
+6 -1
View File
@@ -129,7 +129,12 @@ pub async fn on_launch(
// rightly refuses the branch. See `write_manifest`.
if mission.template_kind == crate::continuous_research::TEMPLATE_KIND {
let date = crate::continuous_research::today();
match crate::continuous_research::write_manifest(&path, &harvested, &date) {
// Tag and score each paper before the agents see the list;
// an untriaged manifest (no key) is the old, empty-tags one.
let topics = crate::continuous_research::topics_for(&mission.config);
let triage =
crate::continuous_research::triage_papers(&harvested, &topics).await;
match crate::continuous_research::write_manifest(&path, &harvested, &date, &triage) {
Ok(at) => eprintln!(
"mission_orchestrator: wrote {} paper(s) to {}",
harvested.len(),