{"record":{"id":"912f477d83913477","repo":"HKUDS/Vibe-Trading","slug":"unknown-claim-id-claim-id","errorCode":null,"errorMessage":"unknown claim_id: {claim_id}","messagePattern":"unknown claim_id: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/goal/store.py","lineNumber":896,"sourceCode":"            SELECT * FROM goal_criteria\n            WHERE goal_id = ? AND criterion_id = ?\n            \"\"\",\n            (goal_id, criterion_id),\n        ).fetchone()\n        if row is None:\n            raise ValueError(f\"unknown criterion_id: {criterion_id}\")\n        return self._criterion_from_row(row)\n\n    def _require_claim(self, goal_id: str, claim_id: str) -> GoalClaim:\n        row = self._conn.execute(\n            \"\"\"\n            SELECT * FROM goal_claims\n            WHERE goal_id = ? AND claim_id = ?\n            \"\"\",\n            (goal_id, claim_id),\n        ).fetchone()\n        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:","sourceCodeStart":878,"sourceCodeEnd":914,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/goal/store.py#L878-L914","documentation":"append_evidence referenced a claim_id with no matching row in goal_claims for that goal. Claims must be registered on the goal before evidence can reference them.","triggerScenarios":"Calling append_evidence with a claim_id from another goal, deleted, or never created via the claim-adding API.","commonSituations":"Claim ids generated client-side instead of via the store; stale claim references after goal recreation; cross-goal id mixups in logs.","solutions":["Create the claim through the store first and use the returned claim_id","Verify the claim exists for this goal before appending evidence","Regenerate goals/claims together in tests to keep ids consistent"],"exampleFix":"// before\nstore.append_evidence(..., claim_id=\"claim-99\")\n// after\nclaim = store.add_claim(goal_id, ...)\nstore.append_evidence(..., claim_id=claim.claim_id)","handlingStrategy":"validation","validationCode":"claims = {c.claim_id for c in store.list_claims(goal_id)}\nif claim_id not in claims:\n    claim = store.add_claim(goal_id, ...)\n    claim_id = claim.claim_id","typeGuard":"def claim_exists(store, goal_id: str, claim_id: str) -> bool:\n    return any(c.claim_id == claim_id for c in store.list_claims(goal_id))","tryCatchPattern":"except ValueError as e: if str(e).startswith('unknown claim_id'): create the claim or correct the id, then retry the append","preventionTips":["Only use claim ids returned by the store","Never fabricate claim ids client-side","Keep claim creation and evidence append adjacent in code"],"tags":["goal-store","claim","foreign-key","python"],"backgroundTag":"unknown-foreign-key-reference","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}