{"record":{"id":"01e49369ae006164","repo":"HKUDS/Vibe-Trading","slug":"criterion-criterion-criterion-id-is-not-satisfie","errorCode":null,"errorMessage":"criterion {criterion.criterion_id} is not satisfied","messagePattern":"criterion (.+?) is not satisfied","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/goal/store.py","lineNumber":913,"sourceCode":"        if row is None:\n            raise ValueError(f\"unknown claim_id: {claim_id}\")\n        return self._claim_from_row(row)\n\n    def _validate_completion_audit(\n        self,\n        goal: GoalRecord,\n        audit: list[AuditRow],\n    ) -> None:\n        criteria = self.list_criteria(goal.goal_id)\n        rows_by_criterion = {row.criterion_id: row for row in audit}\n        for criterion in criteria:\n            if not criterion.required:\n                continue\n            row = rows_by_criterion.get(criterion.criterion_id)\n            if row is None:\n                raise ValueError(f\"missing audit row for criterion {criterion.criterion_id}\")\n            if row.result not in _COMPLETION_RESULTS:\n                raise ValueError(f\"criterion {criterion.criterion_id} is not satisfied\")\n            if row.result in {\"satisfied\", \"satisfied_with_caveat\"} and not row.evidence_ids:\n                raise ValueError(\"complete goals require verified evidence\")\n            if row.result == \"not_applicable_user_accepted\" and not row.notes.strip():\n                raise ValueError(\"not-applicable criteria require acceptance notes\")\n            has_verified_evidence = False\n            for evidence_id in row.evidence_ids:\n                evidence = self._get_evidence(evidence_id)\n                if evidence is None or evidence.goal_id != goal.goal_id:\n                    raise ValueError(f\"unknown evidence_id: {evidence_id}\")\n                if evidence.criterion_id != criterion.criterion_id:\n                    raise ValueError(\n                        f\"evidence {evidence_id} does not match criterion {criterion.criterion_id}\"\n                    )\n                if evidence.verification_status == \"verified\":\n                    has_verified_evidence = True\n            if row.result in {\"satisfied\", \"satisfied_with_caveat\"} and not has_verified_evidence:\n                raise ValueError(\"complete goals require verified evidence\")\n","sourceCodeStart":895,"sourceCodeEnd":931,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/goal/store.py#L895-L931","documentation":"A completion audit row carried a result value outside _COMPLETION_RESULTS (the allowed satisfied/satisfied_with_caveat/not_applicable set), so the criterion counts as unsatisfied and completion is refused.","triggerScenarios":"update_status with an audit row whose result is e.g. \"unsatisfied\", \"pending\", or a typo like \"satisifed\".","commonSituations":"Result strings built by LLM output or dynamic code; enum/str mismatch after a version change renaming result values.","solutions":["Use only the allowed result literals: satisfied, satisfied_with_caveat, not_applicable_user_accepted (check _COMPLETION_RESULTS in your version)","Validate/normalize LLM-produced result strings against the allowed set before building audit rows","If a criterion truly is unsatisfied, the goal cannot be completed yet — gather evidence first"],"exampleFix":"// before\nAuditRow(criterion_id=\"c1\", result=\"done\", evidence_ids=[...])\n// after\n_ALLOWED = {\"satisfied\", \"satisfied_with_caveat\", \"not_applicable_user_accepted\"}\nresult = result if result in _ALLOWED else \"satisfied\"\nAuditRow(criterion_id=\"c1\", result=result, evidence_ids=[...])","handlingStrategy":"validation","validationCode":"ALLOWED = {\"satisfied\", \"satisfied_with_caveat\", \"not_applicable_user_accepted\"}\nassert all(row.result in ALLOWED for row in audit), [r.result for r in audit if r.result not in ALLOWED]","typeGuard":"def is_valid_result(result: str) -> bool:\n    return result in {\"satisfied\", \"satisfied_with_caveat\", \"not_applicable_user_accepted\"}","tryCatchPattern":"except ValueError as e: if 'not satisfied' in str(e): normalize result strings and re-validate before retrying","preventionTips":["Centralize the allowed-result constants","Constrain LLM outputs to an enum/choice set","Pin the library version when result literals matter"],"tags":["goal-store","completion-audit","invalid-result","python"],"backgroundTag":"enum-value-invalid","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}