{"record":{"id":"504dc12ff87454c6","repo":"HKUDS/Vibe-Trading","slug":"artifact-artifact-name-already-exists-in-unive","errorCode":null,"errorMessage":"artifact '{artifact.name}' already exists in universe '{artifact.universe}'","messagePattern":"artifact '(.+?)' already exists in universe '(.+?)'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/strategy_store/sqlite_store.py","lineNumber":435,"sourceCode":"                        now,\n                        artifact.disabled_at,\n                        artifact.disabled_reason,\n                        artifact.developer,\n                        artifact.owner,\n                        artifact.validator,\n                        artifact.approver,\n                        artifact.model_version,\n                        artifact.artifact_version,\n                        artifact.model_tier.value if artifact.model_tier else None,\n                        artifact.intended_use,\n                        artifact.limitations,\n                        artifact.validation_status.value,\n                        artifact.validation_date,\n                    ),\n                )\n        except sqlite3.IntegrityError as exc:\n            if \"artifacts.name\" in str(exc):\n                raise ValueError(\n                    f\"artifact '{artifact.name}' already exists in \"\n                    f\"universe '{artifact.universe}'\"\n                ) from exc\n            raise\n        return artifact_id\n\n    @_synchronized\n    def get_artifact(self, artifact_id: str) -> Artifact | None:\n        \"\"\"Get a single artifact by ID.  Returns ``None`` if not found.\"\"\"\n        row = self._conn.execute(\n            \"SELECT * FROM artifacts WHERE id = ?\", (artifact_id,)\n        ).fetchone()\n        return self._row_to_artifact(row) if row else None\n\n    @_synchronized\n    def list_artifacts(\n        self,\n        *,","sourceCodeStart":417,"sourceCodeEnd":453,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/strategy_store/sqlite_store.py#L417-L453","documentation":"The SQLite-backed strategy store maps a UNIQUE constraint on (artifacts.name, universe). register_artifact catches sqlite3.IntegrityError, and when the message mentions 'artifacts.name' it re-raises as this ValueError: the same artifact name is already registered for that universe.","triggerScenarios":"Calling register_artifact twice with the same name and universe, possibly from parallel workers or after a retry that already committed.","commonSituations":"Idempotency issues in batch registration scripts; retried HTTP handlers registering twice; re-running an import that partially succeeded before.","solutions":["Check existence / use an upsert-style update path before registering","Make batch jobs idempotent: skip or update when the (name, universe) pair already exists","Serialize registrations per (name, universe) to avoid races"],"exampleFix":"# before\nstore.register_artifact(artifact)  # second time -> ValueError\n# after\nif store.get_artifact(artifact.name, artifact.universe) is None:\n    store.register_artifact(artifact)\nelse:\n    store.update_artifact(artifact.name, artifact)","handlingStrategy":"try-catch","validationCode":"existing = store.get_artifact(artifact.name, artifact.universe)\nif existing is not None:\n    store.update_artifact(artifact.name, artifact)  # or skip\nelse:\n    store.register_artifact(artifact)","typeGuard":null,"tryCatchPattern":"try:\n    store.register_artifact(artifact)\nexcept ValueError as e:\n    if 'already exists' in str(e): store.update_artifact(artifact.name, artifact)\n    else: raise","preventionTips":["Make registration idempotent (check-then-register or upsert)","Deduplicate batch inputs on (name, universe)","Wrap retried network handlers in idempotency checks"],"tags":["python","sqlite","duplicate-key","model-registry"],"backgroundTag":"unique-constraint-violation","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}