use super::super::run_prompt::ResultDelivery;
use crate::store::Store;
use crate::types::{DeliveryAssessment, EventKind, TaskEvent, TaskId, TaskStatus};
pub(crate) fn record_missing_report(
store: &Store,
task_id: &TaskId,
delivery: ResultDelivery,
required: bool,
) {
if !required || !matches!(delivery, ResultDelivery::MissingFile { .. }) {
return;
}
if let Err(err) = store.update_delivery_assessment(
task_id.as_str(),
Some(DeliveryAssessment::MissingFinalDelivery),
) {
aid_warn!("[aid] Failed to record missing delivery: {err}");
}
if suppress_missing_report_event(store, task_id) {
return;
}
if let Err(err) = crate::task_lifecycle::mark_failed(store, task_id) {
aid_warn!("[aid] Failed to mark missing required result file: {err}");
}
let _ = store.insert_event(&TaskEvent {
task_id: task_id.clone(),
timestamp: chrono::Local::now(),
event_kind: EventKind::Error,
detail: "Missing final delivery: the explicitly required result file was not written"
.to_string(),
metadata: Some(serde_json::json!({
"delivery_guard": "missing_final_delivery",
"source": "result_file_fallback",
})),
});
}
fn suppress_missing_report_event(store: &Store, task_id: &TaskId) -> bool {
let Ok(Some(task)) = store.get_task(task_id.as_str()) else {
return false;
};
task.status == TaskStatus::Failed && store.latest_error(task_id.as_str()).is_some()
}