HKUDS/Vibe-Trading · error · ValueError
complete goals require verified evidence
Error message
complete goals require verified evidence
What it means
A completion audit row for a required criterion used result satisfied/satisfied_with_caveat but supplied no evidence_ids. Completed goals must cite evidence for every satisfied criterion.
Source
Thrown at agent/src/goal/store.py:915
return self._claim_from_row(row)
def _validate_completion_audit(
self,
goal: GoalRecord,
audit: list[AuditRow],
) -> None:
criteria = self.list_criteria(goal.goal_id)
rows_by_criterion = {row.criterion_id: row for row in audit}
for criterion in criteria:
if not criterion.required:
continue
row = rows_by_criterion.get(criterion.criterion_id)
if row is None:
raise ValueError(f"missing audit row for criterion {criterion.criterion_id}")
if row.result not in _COMPLETION_RESULTS:
raise ValueError(f"criterion {criterion.criterion_id} is not satisfied")
if row.result in {"satisfied", "satisfied_with_caveat"} and not row.evidence_ids:
raise ValueError("complete goals require verified evidence")
if row.result == "not_applicable_user_accepted" and not row.notes.strip():
raise ValueError("not-applicable criteria require acceptance notes")
has_verified_evidence = False
for evidence_id in row.evidence_ids:
evidence = self._get_evidence(evidence_id)
if evidence is None or evidence.goal_id != goal.goal_id:
raise ValueError(f"unknown evidence_id: {evidence_id}")
if evidence.criterion_id != criterion.criterion_id:
raise ValueError(
f"evidence {evidence_id} does not match criterion {criterion.criterion_id}"
)
if evidence.verification_status == "verified":
has_verified_evidence = True
if row.result in {"satisfied", "satisfied_with_caveat"} and not has_verified_evidence:
raise ValueError("complete goals require verified evidence")
def _get_evidence(self, evidence_id: str) -> EvidenceRecord | None:
row = self._conn.execute(View on GitHub (pinned to 80ffdda44c)
Solutions
- append_evidence for the criterion first and put the returned evidence_id(s) in the audit row
- If no artifact backs the criterion, it cannot be marked satisfied — either produce evidence or mark it not_applicable_user_accepted with notes
- Add a builder check that every satisfied row has non-empty evidence_ids
Example fix
// before AuditRow(criterion_id="c1", result="satisfied", evidence_ids=[]) // after ev = store.append_evidence(session_id, goal_id, criterion_id="c1", ...) AuditRow(criterion_id="c1", result="satisfied", evidence_ids=[ev.evidence_id])
Defensive patterns
Strategy: validation
Validate before calling
for row in audit:
if row.result in {"satisfied", "satisfied_with_caveat"}:
assert row.evidence_ids, f"{row.criterion_id} satisfied without evidence" Type guard
def satisfied_rows_have_evidence(audit: list) -> bool:
return all(r.evidence_ids for r in audit if r.result in {"satisfied", "satisfied_with_caveat"}) Try / catch
except ValueError as e: if 'require verified evidence' in str(e): append evidence, rebuild audit, retry once
Prevention
- Make evidence append a prerequisite step in the completion workflow
- Never hand-write audit rows without evidence ids
- Assert non-empty evidence_ids in audit builders
When it happens
Trigger: update_status with an audit row where result is satisfied (or satisfied_with_caveat) and evidence_ids is empty or None.
Common situations: Agent declares success narratively without having appended evidence rows; evidence appended to a different goal or criterion; evidence_ids dropped during serialization.
Related errors
- missing audit row for criterion {criterion.criterion_id}
- criterion {criterion.criterion_id} is not satisfied
- not-applicable criteria require acceptance notes
- unknown evidence_id: {evidence_id}
- evidence {evidence_id} does not match criterion {criterion.c
AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28).
Data as JSON: /api/errors/ea074f55e83ecd57.
Report an issue: GitHub.