fix(memory): verdict lines carry the brief and a distinguishing mission id
deploy / test (push) Successful in 4m50s
deploy / build (push) Successful in 5m45s

The first self_audit run on a planted brief/condition mismatch found the
pattern and quoted it, then diagnosed "the agent skipped the section": the
record held the condition but not the brief, and working agents never see the
condition. It also read two missions as one — a UUIDv7's first 8 chars are a
timestamp, and missions 34 s apart both rendered as 01a0cb38.

- verdict_line records the phase brief (config.task) beside the condition
- the short mission id is the uuid tail
- self_audit copies the record into the checkout (the judge cannot read
  /mission/memory) and compares brief with condition

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Omar Sobh
2026-09-22 17:42:37 -05:00
co-authored by Claude Opus 5.5
parent fca828b5a1
commit 9ca71e5fa4
4 changed files with 96 additions and 15 deletions
+5 -2
View File
@@ -2622,7 +2622,7 @@ async fn evaluate_finished_phases(
) -> Result<(), String> {
let rows = sqlx::query(
"SELECT mp.id, mp.mission_id, mp.kind, mp.done_when, mp.max_iterations, mp.iteration,
m.runtime_kind, m.repo_id
mp.config->>'task' AS task, m.runtime_kind, m.repo_id
FROM mission_phases mp
JOIN missions m ON m.id = mp.mission_id
WHERE mp.status = 'evaluating' AND m.status = 'running'
@@ -2692,7 +2692,10 @@ async fn evaluate_finished_phases(
// The project remembers the verdict. Only a repo-backed mission has a
// project to remember into; a repo-less one leaves no trace here.
if let Some(repo) = repo_id {
crate::mission_memory::remember_verdict(repo, mission_id, &kind, &condition, &verdict);
let brief = row.get::<Option<String>, _>("task").unwrap_or_default();
crate::mission_memory::remember_verdict(
repo, mission_id, &kind, &brief, &condition, &verdict,
);
}
// A judge that could not be REACHED has not judged. `Verdict.error` is