{"record":{"id":"c52aa82023b0435c","repo":"cocoindex-io/cocoindex","slug":"iggy-does-not-support-kafka-style-tombstones-prov","errorCode":null,"errorMessage":"Iggy does not support Kafka-style tombstones. Provide deletion_value_fn or encode deletes in the payload.","messagePattern":"Iggy does not support Kafka-style tombstones\\. Provide deletion_value_fn or encode deletes in the payload\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/cocoindex/connectors/iggy/_target.py","lineNumber":128,"sourceCode":"            partitioning=self._partition,\n            messages=messages,\n        )\n\n    def reconcile(\n        self,\n        key: coco.StableKey,\n        desired_target_state: bytes | str | coco.NonExistenceType,\n        prev_possible_records: Collection[_MessageFingerprint],\n        prev_may_be_missing: bool,\n        /,\n    ) -> coco.TargetReconcileOutput[_MessageAction, _MessageFingerprint] | None:\n        assert isinstance(key, (bytes, str))\n\n        if coco.is_non_existence(desired_target_state):\n            if not prev_possible_records and not prev_may_be_missing:\n                return None\n            if self._deletion_value_fn is None:\n                raise ValueError(\n                    \"Iggy does not support Kafka-style tombstones. \"\n                    \"Provide deletion_value_fn or encode deletes in the payload.\"\n                )\n            deletion_value = self._deletion_value_fn(key)\n            return coco.TargetReconcileOutput(\n                action=_MessageAction(key=key, value=deletion_value),\n                sink=self._sink,\n                tracking_record=coco.NON_EXISTENCE,\n            )\n\n        # Upsert case\n        if isinstance(desired_target_state, bytes):\n            target_fp = fingerprint_bytes(desired_target_state)\n        else:\n            target_fp = fingerprint_str(desired_target_state)\n\n        if not prev_may_be_missing and all(\n            prev == target_fp for prev in prev_possible_records","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/cocoindex-io/cocoindex/blob/e84aa99b3292c5270a4b313b2a7137ad9ce8ab3b/python/cocoindex/connectors/iggy/_target.py#L110-L146","documentation":"Unlike Kafka, Iggy has no native tombstone records for deletes. When a reconciliation sees a desired state of non-existence and the connector has no deletion_value_fn configured, it raises ValueError rather than emitting an ambiguous delete.","triggerScenarios":"Reconcile output for a key with coco.is_non_existence(desired_target_state) (a delete) on an Iggy target constructed without deletion_value_fn — e.g. during update when a source record disappears.","commonSituations":"Source rows/files deleted between runs causing target deletes; switching a target from Kafka (tombstones supported) to Iggy without adapting delete handling.","solutions":["Provide deletion_value_fn when constructing the Iggy target so deletes can be encoded as a message value","Encode deletes inside the normal payload (e.g. a flag in the message value) and handle them downstream","If deletes are impossible/unnecessary, ensure prev records and prev_may_be_missing are handled so no delete action is generated"],"exampleFix":"// before\ntarget = iggy.TableTarget(client, stream=\"s\", topic=\"t\", ...)\n// after\ntarget = iggy.TableTarget(client, stream=\"s\", topic=\"t\", deletion_value_fn=lambda key: encode_tombstone(key), ...)","handlingStrategy":"validation","validationCode":"if deletion_value_fn is None:\n    raise ValueError(\"Iggy target requires deletion_value_fn to handle deletes\")","typeGuard":null,"tryCatchPattern":"try:\n    await app.update()\nexcept ValueError as e:\n    if \"tombstones\" in str(e):\n        reconfigure_target_with_deletion_value_fn()","preventionTips":["Always configure deletion_value_fn for Iggy targets that can see deletions","Model deletes explicitly in the payload schema and document downstream handling","Test delete scenarios (source record removed) against the Iggy target before production"],"tags":["iggy","delete","tombstone","reconciliation"],"backgroundTag":"unsupported-operation","analyzedSha":"e84aa99b3292c5270a4b313b2a7137ad9ce8ab3b","analyzedAt":"2026-09-08T15:59:19.997Z","contentChangedAt":"2026-09-08T15:59:19.997Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}