From 200efa73a69779233d8ca76ddc1ca1f098670e10 Mon Sep 17 00:00:00 2001 From: Chandrasekharan M Date: Wed, 27 May 2026 12:54:40 +0530 Subject: [PATCH] UN-3479 [FIX] Stamp adapter_key alongside adapter_id_key on tool_instance PATCH MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ToolInstanceHelper.update_metadata_with_adapter_properties resolved the adapter and only wrote the target UUID to metadata[adapter_id_key], leaving metadata[adapter_key] as whatever the PATCH sent (a name from to_representation, or a stale UUID from create() defaults). The schema enum is on adapter_key, and the lazy migrator skips any UUID-shaped value there — so stale UUIDs survive PATCH and later fail validation with " is not one of []" during workflow execution (seen on cloned org workflows after adapter churn). Write the resolved UUID to both keys so the invariant metadata[adapter_key] == metadata[adapter_id_key] == holds after every save. Co-Authored-By: Claude Opus 4.7 --- .../tool_instance_v2/tool_instance_helper.py | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/backend/tool_instance_v2/tool_instance_helper.py b/backend/tool_instance_v2/tool_instance_helper.py index 5fbf983dc4..285377fa8f 100644 --- a/backend/tool_instance_v2/tool_instance_helper.py +++ b/backend/tool_instance_v2/tool_instance_helper.py @@ -97,26 +97,24 @@ def update_metadata_with_adapter_properties( """ if adapter_key in metadata: adapter_value = metadata[adapter_key] - adapter_id = None if ToolInstanceHelper.is_uuid_format(adapter_value): logger.debug(f"Adapter value '{adapter_value}' is already in UUID format") adapter = AdapterInstance.objects.get( id=adapter_value, adapter_type=adapter_type.value ) - adapter_id = str(adapter.id) - metadata_key_for_id = adapter_property.get( - AdapterPropertyKey.ADAPTER_ID_KEY, AdapterPropertyKey.ADAPTER_ID - ) - metadata[metadata_key_for_id] = adapter_id else: adapter = AdapterProcessor.get_adapter_by_name_and_type( adapter_type=adapter_type, adapter_name=adapter_value ) - adapter_id = str(adapter.id) - metadata_key_for_id = adapter_property.get( - AdapterPropertyKey.ADAPTER_ID_KEY, AdapterPropertyKey.ADAPTER_ID - ) - metadata[metadata_key_for_id] = adapter_id + adapter_id = str(adapter.id) + metadata_key_for_id = adapter_property.get( + AdapterPropertyKey.ADAPTER_ID_KEY, AdapterPropertyKey.ADAPTER_ID + ) + # Keep adapter_key and adapter_id_key both canonical to the resolved + # target UUID; otherwise stale UUID-shaped values at adapter_key + # bypass the lazy migrator and fail schema enum validation later. + metadata[adapter_key] = adapter_id + metadata[metadata_key_for_id] = adapter_id @staticmethod def update_metadata_with_adapter_instances(