HKUDS/Vibe-Trading · error · ValueError
missing audit row for criterion {criterion.criterion_id}
Error message
missing audit row for criterion {criterion.criterion_id} What it means
When moving a goal to a completed status, update_status runs _validate_completion_audit, which requires an audit row for every required criterion. This error means a required criterion had no row in the audit list.
Source
Thrown at agent/src/goal/store.py:911
(goal_id, claim_id),
).fetchone()
if row is None:
raise ValueError(f"unknown claim_id: {claim_id}")
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:View on GitHub (pinned to 80ffdda44c)
Solutions
- Rebuild the audit from the goal's current criteria so every required criterion has a row
- If the criterion is genuinely out of scope, mark it not_applicable_user_accepted with notes instead of omitting it
- Double-check criterion.required flags when constructing the audit
Example fix
// before audit = [AuditRow(criterion_id="c1", ...)] # goal also requires c2 store.update_status(..., status="completed", audit=audit) // after audit = [AuditRow(criterion_id=c.criterion_id, ...) for c in store.list_criteria(goal_id) if c.required] store.update_status(..., status="completed", audit=audit)
Defensive patterns
Strategy: validation
Validate before calling
required = [c.criterion_id for c in store.list_criteria(goal_id) if c.required]
audit_by_id = {r.criterion_id: r for r in audit}
missing = [cid for cid in required if cid not in audit_by_id]
assert not missing, f"audit missing: {missing}" Type guard
def audit_covers_required(store, goal_id: str, audit: list) -> bool:
required = {c.criterion_id for c in store.list_criteria(goal_id) if c.required}
return required <= {r.criterion_id for r in audit} Try / catch
except ValueError as e: if 'missing audit row' in str(e): rebuild audit from current criteria and retry update_status once
Prevention
- Build the audit programmatically from the store's criteria list
- Re-pull criteria right before completion
- For out-of-scope criteria use not_applicable rows, not omission
When it happens
Trigger: Calling update_status(goal_id, status=completed-ish, audit=[...]) where the audit list omits one or more required criteria of the goal.
Common situations: New required criteria added after the audit was assembled; audit built from a stale criteria snapshot; optional/required flags misunderstood.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- {field_name} cannot be empty
- at least one goal criterion is required
- criterion {criterion.criterion_id} is not satisfied
- complete goals require verified evidence
- not-applicable criteria require acceptance notes
AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28).
Data as JSON: /api/errors/3233f0ccad33bfdd.
Report an issue: GitHub.