Stored Transformation

Stored transformation detail

Inspect version history, edit inputs, and save a new version without overwriting prior records.

Transformation Name test-3300
Selected Version v3
Versions 7
Updated 2026-05-20T08:45:26.842964+00:00
Version 7 Version 6 Version 5 Version 4 Version 3 Version 2 Version 1
Target Stored target schema Switch between manual editing, a persisted schema, and an internal schema, then validate or translate with the selected target schema.
Result Generated jq filter
{ "name": .name.value, "hasDescription": {shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null)), "hasAdditionalInformation": {"remarks": .extraInfo.value}, "hasAdditionalType": .category.value, "hasLocation": .location.value }
Output Transformed output
{
  "hasAdditionalInformation": {
    "remarks": "Encinar"
  },
  "hasAdditionalType": "TrailRoute",
  "hasDescription": {
    "longDescription": "Comenzamos",
    "shortDescription": "Dificultad: baja"
  },
  "hasLocation": {
    "coordinates": [
      -3.8565638,
      40.4845294
    ],
    "type": "Point"
  },
  "name": "Majalacabra"
}
Trace Details
{
  "attempts": [
    {
      "attempt_number": 1,
      "compile_ok": true,
      "error_message": null,
      "execution_ok": true,
      "jq_expression": ".name.value",
      "schema_valid": true,
      "stage": "field",
      "target_field": "name",
      "used_hints": true
    },
    {
      "attempt_number": 1,
      "compile_ok": true,
      "error_message": null,
      "execution_ok": true,
      "jq_expression": "{shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null))",
      "schema_valid": true,
      "stage": "field",
      "target_field": "hasDescription",
      "used_hints": true
    },
    {
      "attempt_number": 1,
      "compile_ok": true,
      "error_message": null,
      "execution_ok": true,
      "jq_expression": "{\"remarks\": .extraInfo.value}",
      "schema_valid": true,
      "stage": "field",
      "target_field": "hasAdditionalInformation",
      "used_hints": true
    },
    {
      "attempt_number": 1,
      "compile_ok": true,
      "error_message": null,
      "execution_ok": true,
      "jq_expression": ".category.value",
      "schema_valid": true,
      "stage": "field",
      "target_field": "hasAdditionalType",
      "used_hints": true
    },
    {
      "attempt_number": 1,
      "compile_ok": true,
      "error_message": null,
      "execution_ok": true,
      "jq_expression": ".location.value",
      "schema_valid": true,
      "stage": "field",
      "target_field": "hasLocation",
      "used_hints": true
    },
    {
      "attempt_number": 1,
      "compile_ok": true,
      "error_message": null,
      "execution_ok": true,
      "jq_expression": "{ \"name\": .name.value, \"hasDescription\": {shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null)), \"hasAdditionalInformation\": {\"remarks\": .extraInfo.value}, \"hasAdditionalType\": .category.value, \"hasLocation\": .location.value }",
      "schema_valid": true,
      "stage": "global",
      "target_field": null,
      "used_hints": true
    }
  ],
  "events": [
    {
      "payload": {
        "field_name": "name",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "match_result": {
          "candidate_source_path": "name.value",
          "confidence": 0.99,
          "identified": true,
          "reasoning": "Source field name.value semantically matches target name."
        },
        "prompt_payload": {
          "field_name": "name",
          "field_schema": {
            "type": "string"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "input_summary": {
            "path_count": 42,
            "paths": [
              "alternateName",
              "alternateName.metadata",
              "alternateName.type",
              "alternateName.value",
              "category",
              "category.metadata",
              "category.type",
              "category.value",
              "dataProvider",
              "dataProvider.metadata",
              "dataProvider.type",
              "dataProvider.value",
              "description",
              "description.metadata",
              "description.type",
              "description.value",
              "extraInfo",
              "extraInfo.metadata",
              "extraInfo.type",
              "extraInfo.value",
              "id",
              "location",
              "location.metadata",
              "location.type",
              "location.value",
              "location.value.coordinates",
              "location.value.coordinates[0]",
              "location.value.coordinates[1]",
              "location.value.type",
              "name",
              "name.metadata",
              "name.type",
              "name.value",
              "shortDescription",
              "shortDescription.metadata",
              "shortDescription.type",
              "shortDescription.value",
              "source",
              "source.metadata",
              "source.type",
              "source.value",
              "type"
            ],
            "root_type": "dict"
          },
          "output_schema": {
            "additionalProperties": true,
            "properties": {
              "hasAdditionalInformation": {
                "additionalProperties": false,
                "properties": {
                  "remarks": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasAdditionalType": {
                "type": "string"
              },
              "hasDescription": {
                "additionalProperties": false,
                "properties": {
                  "longDescription": {
                    "type": "string"
                  },
                  "shortDescription": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasLocation": {
                "additionalProperties": false,
                "properties": {
                  "coordinates": {
                    "items": {
                      "type": "number"
                    },
                    "type": "array"
                  },
                  "type": {
                    "enum": [
                      "Point"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "type",
                  "coordinates"
                ],
                "type": "object"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "hasLocation"
            ],
            "type": "object"
          },
          "required": true,
          "task": "match"
        },
        "response": "{\"identified\":true,\"candidate_source_path\":\"name.value\",\"reasoning\":\"Source field name.value semantically matches target name.\",\"confidence\":0.99}",
        "system_prompt": "You perform semantic field matching between a target schema field and source JSON paths. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like match, result, mapping, output, or data. Use exactly these keys: \"identified\", \"candidate_source_path\", \"reasoning\", \"confidence\". \"identified\" must be a JSON boolean. \"candidate_source_path\" must be a string path or null. \"reasoning\" must be a short string. \"confidence\" must be a JSON number between 0.0 and 1.0. If no reliable match exists, return identified=false, candidate_source_path=null, a brief reasoning string, and confidence=0.0. Example valid output: {\"identified\":true,\"candidate_source_path\":\"datetime\",\"reasoning\":\"The source field semantically matches the target date.\",\"confidence\":0.92}",
        "used_hints": true
      },
      "stage": "semantic_match",
      "timestamp": "2026-05-19T17:13:22.866904+00:00"
    },
    {
      "payload": {
        "field_name": "hasDescription",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "match_result": {
          "candidate_source_path": "shortDescription.value",
          "confidence": 0.95,
          "identified": true,
          "reasoning": "shortDescription.value maps to hasDescription.shortDescription and description.value maps to hasDescription.longDescription"
        },
        "prompt_payload": {
          "field_name": "hasDescription",
          "field_schema": {
            "additionalProperties": false,
            "properties": {
              "longDescription": {
                "type": "string"
              },
              "shortDescription": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "input_summary": {
            "path_count": 42,
            "paths": [
              "alternateName",
              "alternateName.metadata",
              "alternateName.type",
              "alternateName.value",
              "category",
              "category.metadata",
              "category.type",
              "category.value",
              "dataProvider",
              "dataProvider.metadata",
              "dataProvider.type",
              "dataProvider.value",
              "description",
              "description.metadata",
              "description.type",
              "description.value",
              "extraInfo",
              "extraInfo.metadata",
              "extraInfo.type",
              "extraInfo.value",
              "id",
              "location",
              "location.metadata",
              "location.type",
              "location.value",
              "location.value.coordinates",
              "location.value.coordinates[0]",
              "location.value.coordinates[1]",
              "location.value.type",
              "name",
              "name.metadata",
              "name.type",
              "name.value",
              "shortDescription",
              "shortDescription.metadata",
              "shortDescription.type",
              "shortDescription.value",
              "source",
              "source.metadata",
              "source.type",
              "source.value",
              "type"
            ],
            "root_type": "dict"
          },
          "output_schema": {
            "additionalProperties": true,
            "properties": {
              "hasAdditionalInformation": {
                "additionalProperties": false,
                "properties": {
                  "remarks": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasAdditionalType": {
                "type": "string"
              },
              "hasDescription": {
                "additionalProperties": false,
                "properties": {
                  "longDescription": {
                    "type": "string"
                  },
                  "shortDescription": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasLocation": {
                "additionalProperties": false,
                "properties": {
                  "coordinates": {
                    "items": {
                      "type": "number"
                    },
                    "type": "array"
                  },
                  "type": {
                    "enum": [
                      "Point"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "type",
                  "coordinates"
                ],
                "type": "object"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "hasLocation"
            ],
            "type": "object"
          },
          "required": false,
          "task": "match"
        },
        "response": "{\"identified\":true,\"candidate_source_path\":\"shortDescription.value\",\"reasoning\":\"shortDescription.value maps to hasDescription.shortDescription and description.value maps to hasDescription.longDescription\",\"confidence\":0.95}",
        "system_prompt": "You perform semantic field matching between a target schema field and source JSON paths. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like match, result, mapping, output, or data. Use exactly these keys: \"identified\", \"candidate_source_path\", \"reasoning\", \"confidence\". \"identified\" must be a JSON boolean. \"candidate_source_path\" must be a string path or null. \"reasoning\" must be a short string. \"confidence\" must be a JSON number between 0.0 and 1.0. If no reliable match exists, return identified=false, candidate_source_path=null, a brief reasoning string, and confidence=0.0. Example valid output: {\"identified\":true,\"candidate_source_path\":\"datetime\",\"reasoning\":\"The source field semantically matches the target date.\",\"confidence\":0.92}",
        "used_hints": true
      },
      "stage": "semantic_match",
      "timestamp": "2026-05-19T17:13:32.393784+00:00"
    },
    {
      "payload": {
        "field_name": "hasAdditionalInformation",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "match_result": {
          "candidate_source_path": "extraInfo.value",
          "confidence": 0.95,
          "identified": true,
          "reasoning": "Source field extraInfo.value semantically matches target hasAdditionalInformation.remarks"
        },
        "prompt_payload": {
          "field_name": "hasAdditionalInformation",
          "field_schema": {
            "additionalProperties": false,
            "properties": {
              "remarks": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "input_summary": {
            "path_count": 42,
            "paths": [
              "alternateName",
              "alternateName.metadata",
              "alternateName.type",
              "alternateName.value",
              "category",
              "category.metadata",
              "category.type",
              "category.value",
              "dataProvider",
              "dataProvider.metadata",
              "dataProvider.type",
              "dataProvider.value",
              "description",
              "description.metadata",
              "description.type",
              "description.value",
              "extraInfo",
              "extraInfo.metadata",
              "extraInfo.type",
              "extraInfo.value",
              "id",
              "location",
              "location.metadata",
              "location.type",
              "location.value",
              "location.value.coordinates",
              "location.value.coordinates[0]",
              "location.value.coordinates[1]",
              "location.value.type",
              "name",
              "name.metadata",
              "name.type",
              "name.value",
              "shortDescription",
              "shortDescription.metadata",
              "shortDescription.type",
              "shortDescription.value",
              "source",
              "source.metadata",
              "source.type",
              "source.value",
              "type"
            ],
            "root_type": "dict"
          },
          "output_schema": {
            "additionalProperties": true,
            "properties": {
              "hasAdditionalInformation": {
                "additionalProperties": false,
                "properties": {
                  "remarks": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasAdditionalType": {
                "type": "string"
              },
              "hasDescription": {
                "additionalProperties": false,
                "properties": {
                  "longDescription": {
                    "type": "string"
                  },
                  "shortDescription": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasLocation": {
                "additionalProperties": false,
                "properties": {
                  "coordinates": {
                    "items": {
                      "type": "number"
                    },
                    "type": "array"
                  },
                  "type": {
                    "enum": [
                      "Point"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "type",
                  "coordinates"
                ],
                "type": "object"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "hasLocation"
            ],
            "type": "object"
          },
          "required": false,
          "task": "match"
        },
        "response": "{\"identified\":true,\"candidate_source_path\":\"extraInfo.value\",\"reasoning\":\"Source field extraInfo.value semantically matches target hasAdditionalInformation.remarks\",\"confidence\":0.95}",
        "system_prompt": "You perform semantic field matching between a target schema field and source JSON paths. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like match, result, mapping, output, or data. Use exactly these keys: \"identified\", \"candidate_source_path\", \"reasoning\", \"confidence\". \"identified\" must be a JSON boolean. \"candidate_source_path\" must be a string path or null. \"reasoning\" must be a short string. \"confidence\" must be a JSON number between 0.0 and 1.0. If no reliable match exists, return identified=false, candidate_source_path=null, a brief reasoning string, and confidence=0.0. Example valid output: {\"identified\":true,\"candidate_source_path\":\"datetime\",\"reasoning\":\"The source field semantically matches the target date.\",\"confidence\":0.92}",
        "used_hints": true
      },
      "stage": "semantic_match",
      "timestamp": "2026-05-19T17:13:35.061159+00:00"
    },
    {
      "payload": {
        "field_name": "hasAdditionalType",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "match_result": {
          "candidate_source_path": "category.value",
          "confidence": 0.95,
          "identified": true,
          "reasoning": "category.value maps to hasAdditionalType per mapping"
        },
        "prompt_payload": {
          "field_name": "hasAdditionalType",
          "field_schema": {
            "type": "string"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "input_summary": {
            "path_count": 42,
            "paths": [
              "alternateName",
              "alternateName.metadata",
              "alternateName.type",
              "alternateName.value",
              "category",
              "category.metadata",
              "category.type",
              "category.value",
              "dataProvider",
              "dataProvider.metadata",
              "dataProvider.type",
              "dataProvider.value",
              "description",
              "description.metadata",
              "description.type",
              "description.value",
              "extraInfo",
              "extraInfo.metadata",
              "extraInfo.type",
              "extraInfo.value",
              "id",
              "location",
              "location.metadata",
              "location.type",
              "location.value",
              "location.value.coordinates",
              "location.value.coordinates[0]",
              "location.value.coordinates[1]",
              "location.value.type",
              "name",
              "name.metadata",
              "name.type",
              "name.value",
              "shortDescription",
              "shortDescription.metadata",
              "shortDescription.type",
              "shortDescription.value",
              "source",
              "source.metadata",
              "source.type",
              "source.value",
              "type"
            ],
            "root_type": "dict"
          },
          "output_schema": {
            "additionalProperties": true,
            "properties": {
              "hasAdditionalInformation": {
                "additionalProperties": false,
                "properties": {
                  "remarks": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasAdditionalType": {
                "type": "string"
              },
              "hasDescription": {
                "additionalProperties": false,
                "properties": {
                  "longDescription": {
                    "type": "string"
                  },
                  "shortDescription": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasLocation": {
                "additionalProperties": false,
                "properties": {
                  "coordinates": {
                    "items": {
                      "type": "number"
                    },
                    "type": "array"
                  },
                  "type": {
                    "enum": [
                      "Point"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "type",
                  "coordinates"
                ],
                "type": "object"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "hasLocation"
            ],
            "type": "object"
          },
          "required": false,
          "task": "match"
        },
        "response": "{\"identified\":true,\"candidate_source_path\":\"category.value\",\"reasoning\":\"category.value maps to hasAdditionalType per mapping\",\"confidence\":0.95}",
        "system_prompt": "You perform semantic field matching between a target schema field and source JSON paths. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like match, result, mapping, output, or data. Use exactly these keys: \"identified\", \"candidate_source_path\", \"reasoning\", \"confidence\". \"identified\" must be a JSON boolean. \"candidate_source_path\" must be a string path or null. \"reasoning\" must be a short string. \"confidence\" must be a JSON number between 0.0 and 1.0. If no reliable match exists, return identified=false, candidate_source_path=null, a brief reasoning string, and confidence=0.0. Example valid output: {\"identified\":true,\"candidate_source_path\":\"datetime\",\"reasoning\":\"The source field semantically matches the target date.\",\"confidence\":0.92}",
        "used_hints": true
      },
      "stage": "semantic_match",
      "timestamp": "2026-05-19T17:13:37.379766+00:00"
    },
    {
      "payload": {
        "field_name": "hasLocation",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "match_result": {
          "candidate_source_path": "location.value",
          "confidence": 0.95,
          "identified": true,
          "reasoning": "The source field location.value contains a GeoJSON Point with coordinates, matching the target hasLocation schema."
        },
        "prompt_payload": {
          "field_name": "hasLocation",
          "field_schema": {
            "additionalProperties": false,
            "properties": {
              "coordinates": {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              "type": {
                "enum": [
                  "Point"
                ],
                "type": "string"
              }
            },
            "required": [
              "type",
              "coordinates"
            ],
            "type": "object"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "input_summary": {
            "path_count": 42,
            "paths": [
              "alternateName",
              "alternateName.metadata",
              "alternateName.type",
              "alternateName.value",
              "category",
              "category.metadata",
              "category.type",
              "category.value",
              "dataProvider",
              "dataProvider.metadata",
              "dataProvider.type",
              "dataProvider.value",
              "description",
              "description.metadata",
              "description.type",
              "description.value",
              "extraInfo",
              "extraInfo.metadata",
              "extraInfo.type",
              "extraInfo.value",
              "id",
              "location",
              "location.metadata",
              "location.type",
              "location.value",
              "location.value.coordinates",
              "location.value.coordinates[0]",
              "location.value.coordinates[1]",
              "location.value.type",
              "name",
              "name.metadata",
              "name.type",
              "name.value",
              "shortDescription",
              "shortDescription.metadata",
              "shortDescription.type",
              "shortDescription.value",
              "source",
              "source.metadata",
              "source.type",
              "source.value",
              "type"
            ],
            "root_type": "dict"
          },
          "output_schema": {
            "additionalProperties": true,
            "properties": {
              "hasAdditionalInformation": {
                "additionalProperties": false,
                "properties": {
                  "remarks": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasAdditionalType": {
                "type": "string"
              },
              "hasDescription": {
                "additionalProperties": false,
                "properties": {
                  "longDescription": {
                    "type": "string"
                  },
                  "shortDescription": {
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "hasLocation": {
                "additionalProperties": false,
                "properties": {
                  "coordinates": {
                    "items": {
                      "type": "number"
                    },
                    "type": "array"
                  },
                  "type": {
                    "enum": [
                      "Point"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "type",
                  "coordinates"
                ],
                "type": "object"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "hasLocation"
            ],
            "type": "object"
          },
          "required": true,
          "task": "match"
        },
        "response": "{\"identified\":true,\"candidate_source_path\":\"location.value\",\"reasoning\":\"The source field location.value contains a GeoJSON Point with coordinates, matching the target hasLocation schema.\",\"confidence\":0.95}",
        "system_prompt": "You perform semantic field matching between a target schema field and source JSON paths. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like match, result, mapping, output, or data. Use exactly these keys: \"identified\", \"candidate_source_path\", \"reasoning\", \"confidence\". \"identified\" must be a JSON boolean. \"candidate_source_path\" must be a string path or null. \"reasoning\" must be a short string. \"confidence\" must be a JSON number between 0.0 and 1.0. If no reliable match exists, return identified=false, candidate_source_path=null, a brief reasoning string, and confidence=0.0. Example valid output: {\"identified\":true,\"candidate_source_path\":\"datetime\",\"reasoning\":\"The source field semantically matches the target date.\",\"confidence\":0.92}",
        "used_hints": true
      },
      "stage": "semantic_match",
      "timestamp": "2026-05-19T17:13:39.974933+00:00"
    },
    {
      "payload": {
        "field_name": "name",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "jq_expression": ".name.value",
        "prompt_payload": {
          "candidate_source_path": "name.value",
          "field_name": "name",
          "field_schema": {
            "type": "string"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "source_fragment": "Majalacabra",
          "source_json": {
            "alternateName": {
              "metadata": {},
              "type": "string",
              "value": "LR-01"
            },
            "category": {
              "metadata": {},
              "type": "string",
              "value": "TrailRoute"
            },
            "dataProvider": {
              "metadata": {},
              "type": "string",
              "value": "nec-ccoc"
            },
            "description": {
              "metadata": {},
              "type": "string",
              "value": "Comenzamos"
            },
            "extraInfo": {
              "metadata": {},
              "type": "string",
              "value": "Encinar"
            },
            "id": "trailroute_lr-01",
            "location": {
              "metadata": {},
              "type": "geo:json",
              "value": {
                "coordinates": [
                  -3.8565638,
                  40.4845294
                ],
                "type": "Point"
              }
            },
            "name": {
              "metadata": {},
              "type": "string",
              "value": "Majalacabra"
            },
            "shortDescription": {
              "metadata": {},
              "type": "string",
              "value": "Dificultad: baja"
            },
            "source": {
              "metadata": {},
              "type": "string",
              "value": "portal-randev6"
            },
            "type": "PointOfInterest"
          },
          "task": "synthesize"
        },
        "response": "{\"jq_expression\":\".name.value\"}",
        "system_prompt": "You generate a jq expression for one target field. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like result, output, data, or expression. Use exactly this output schema: {\"jq_expression\": string}. \"jq_expression\" must be a JSON string containing only the jq expression for the target field. Use candidate_source_path as the primary source location, verify it against source_json, and use source_fragment as the focused local value. Do not return explanations or extra keys. Example valid output: {\"jq_expression\":\".datetime\"}",
        "used_hints": true
      },
      "stage": "jq_synthesis",
      "timestamp": "2026-05-19T17:13:45.072856+00:00"
    },
    {
      "payload": {
        "field_name": "hasDescription",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "jq_expression": "{shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null))",
        "prompt_payload": {
          "candidate_source_path": "shortDescription.value",
          "field_name": "hasDescription",
          "field_schema": {
            "additionalProperties": false,
            "properties": {
              "longDescription": {
                "type": "string"
              },
              "shortDescription": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "source_fragment": "Dificultad: baja",
          "source_json": {
            "alternateName": {
              "metadata": {},
              "type": "string",
              "value": "LR-01"
            },
            "category": {
              "metadata": {},
              "type": "string",
              "value": "TrailRoute"
            },
            "dataProvider": {
              "metadata": {},
              "type": "string",
              "value": "nec-ccoc"
            },
            "description": {
              "metadata": {},
              "type": "string",
              "value": "Comenzamos"
            },
            "extraInfo": {
              "metadata": {},
              "type": "string",
              "value": "Encinar"
            },
            "id": "trailroute_lr-01",
            "location": {
              "metadata": {},
              "type": "geo:json",
              "value": {
                "coordinates": [
                  -3.8565638,
                  40.4845294
                ],
                "type": "Point"
              }
            },
            "name": {
              "metadata": {},
              "type": "string",
              "value": "Majalacabra"
            },
            "shortDescription": {
              "metadata": {},
              "type": "string",
              "value": "Dificultad: baja"
            },
            "source": {
              "metadata": {},
              "type": "string",
              "value": "portal-randev6"
            },
            "type": "PointOfInterest"
          },
          "task": "synthesize"
        },
        "response": "{\"jq_expression\":\"{shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null))\"}",
        "system_prompt": "You generate a jq expression for one target field. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like result, output, data, or expression. Use exactly this output schema: {\"jq_expression\": string}. \"jq_expression\" must be a JSON string containing only the jq expression for the target field. Use candidate_source_path as the primary source location, verify it against source_json, and use source_fragment as the focused local value. Do not return explanations or extra keys. Example valid output: {\"jq_expression\":\".datetime\"}",
        "used_hints": true
      },
      "stage": "jq_synthesis",
      "timestamp": "2026-05-19T17:13:55.577296+00:00"
    },
    {
      "payload": {
        "field_name": "hasAdditionalInformation",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "jq_expression": "{\"remarks\": .extraInfo.value}",
        "prompt_payload": {
          "candidate_source_path": "extraInfo.value",
          "field_name": "hasAdditionalInformation",
          "field_schema": {
            "additionalProperties": false,
            "properties": {
              "remarks": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "source_fragment": "Encinar",
          "source_json": {
            "alternateName": {
              "metadata": {},
              "type": "string",
              "value": "LR-01"
            },
            "category": {
              "metadata": {},
              "type": "string",
              "value": "TrailRoute"
            },
            "dataProvider": {
              "metadata": {},
              "type": "string",
              "value": "nec-ccoc"
            },
            "description": {
              "metadata": {},
              "type": "string",
              "value": "Comenzamos"
            },
            "extraInfo": {
              "metadata": {},
              "type": "string",
              "value": "Encinar"
            },
            "id": "trailroute_lr-01",
            "location": {
              "metadata": {},
              "type": "geo:json",
              "value": {
                "coordinates": [
                  -3.8565638,
                  40.4845294
                ],
                "type": "Point"
              }
            },
            "name": {
              "metadata": {},
              "type": "string",
              "value": "Majalacabra"
            },
            "shortDescription": {
              "metadata": {},
              "type": "string",
              "value": "Dificultad: baja"
            },
            "source": {
              "metadata": {},
              "type": "string",
              "value": "portal-randev6"
            },
            "type": "PointOfInterest"
          },
          "task": "synthesize"
        },
        "response": "{\"jq_expression\":\"{\\\"remarks\\\": .extraInfo.value}\"}",
        "system_prompt": "You generate a jq expression for one target field. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like result, output, data, or expression. Use exactly this output schema: {\"jq_expression\": string}. \"jq_expression\" must be a JSON string containing only the jq expression for the target field. Use candidate_source_path as the primary source location, verify it against source_json, and use source_fragment as the focused local value. Do not return explanations or extra keys. Example valid output: {\"jq_expression\":\".datetime\"}",
        "used_hints": true
      },
      "stage": "jq_synthesis",
      "timestamp": "2026-05-19T17:14:00.265573+00:00"
    },
    {
      "payload": {
        "field_name": "hasAdditionalType",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "jq_expression": ".category.value",
        "prompt_payload": {
          "candidate_source_path": "category.value",
          "field_name": "hasAdditionalType",
          "field_schema": {
            "type": "string"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "source_fragment": "TrailRoute",
          "source_json": {
            "alternateName": {
              "metadata": {},
              "type": "string",
              "value": "LR-01"
            },
            "category": {
              "metadata": {},
              "type": "string",
              "value": "TrailRoute"
            },
            "dataProvider": {
              "metadata": {},
              "type": "string",
              "value": "nec-ccoc"
            },
            "description": {
              "metadata": {},
              "type": "string",
              "value": "Comenzamos"
            },
            "extraInfo": {
              "metadata": {},
              "type": "string",
              "value": "Encinar"
            },
            "id": "trailroute_lr-01",
            "location": {
              "metadata": {},
              "type": "geo:json",
              "value": {
                "coordinates": [
                  -3.8565638,
                  40.4845294
                ],
                "type": "Point"
              }
            },
            "name": {
              "metadata": {},
              "type": "string",
              "value": "Majalacabra"
            },
            "shortDescription": {
              "metadata": {},
              "type": "string",
              "value": "Dificultad: baja"
            },
            "source": {
              "metadata": {},
              "type": "string",
              "value": "portal-randev6"
            },
            "type": "PointOfInterest"
          },
          "task": "synthesize"
        },
        "response": "{\"jq_expression\":\".category.value\"}",
        "system_prompt": "You generate a jq expression for one target field. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like result, output, data, or expression. Use exactly this output schema: {\"jq_expression\": string}. \"jq_expression\" must be a JSON string containing only the jq expression for the target field. Use candidate_source_path as the primary source location, verify it against source_json, and use source_fragment as the focused local value. Do not return explanations or extra keys. Example valid output: {\"jq_expression\":\".datetime\"}",
        "used_hints": true
      },
      "stage": "jq_synthesis",
      "timestamp": "2026-05-19T17:14:03.616189+00:00"
    },
    {
      "payload": {
        "field_name": "hasLocation",
        "hint_hash": "5bf57f0e5bec310a4dd90ebc437a09ad688f84e4639270059e2dad58001ef543",
        "jq_expression": ".location.value",
        "prompt_payload": {
          "candidate_source_path": "location.value",
          "field_name": "hasLocation",
          "field_schema": {
            "additionalProperties": false,
            "properties": {
              "coordinates": {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              "type": {
                "enum": [
                  "Point"
                ],
                "type": "string"
              }
            },
            "required": [
              "type",
              "coordinates"
            ],
            "type": "object"
          },
          "hints": "Transform NGSI PointOfInterest into Trail schema.\r\n\r\nMappings:\r\n- name.value -\u003e name\r\n- category.value -\u003e hasAdditionalType\r\n- location.value -\u003e hasLocation\r\n- extraInfo.value -\u003e hasAdditionalInformation.remarks\r\n\r\nDescription mapping:\r\n- shortDescription.value MUST map to hasDescription.shortDescription\r\n- description.value MUST map to hasDescription.longDescription\r\n\r\nRules:\r\n- hasDescription must include both fields when available:\r\n  - shortDescription\r\n  - longDescription\r\n- Do not drop description.value if present\r\n- Both fields are independent and must be mapped separately\r\n- hasDescription is an object of plain strings\r\n- Always extract using .value\r\n- Ignore metadata and type",
          "source_fragment": {
            "coordinates": [
              -3.8565638,
              40.4845294
            ],
            "type": "Point"
          },
          "source_json": {
            "alternateName": {
              "metadata": {},
              "type": "string",
              "value": "LR-01"
            },
            "category": {
              "metadata": {},
              "type": "string",
              "value": "TrailRoute"
            },
            "dataProvider": {
              "metadata": {},
              "type": "string",
              "value": "nec-ccoc"
            },
            "description": {
              "metadata": {},
              "type": "string",
              "value": "Comenzamos"
            },
            "extraInfo": {
              "metadata": {},
              "type": "string",
              "value": "Encinar"
            },
            "id": "trailroute_lr-01",
            "location": {
              "metadata": {},
              "type": "geo:json",
              "value": {
                "coordinates": [
                  -3.8565638,
                  40.4845294
                ],
                "type": "Point"
              }
            },
            "name": {
              "metadata": {},
              "type": "string",
              "value": "Majalacabra"
            },
            "shortDescription": {
              "metadata": {},
              "type": "string",
              "value": "Dificultad: baja"
            },
            "source": {
              "metadata": {},
              "type": "string",
              "value": "portal-randev6"
            },
            "type": "PointOfInterest"
          },
          "task": "synthesize"
        },
        "response": "{\"jq_expression\":\".location.value\"}",
        "system_prompt": "You generate a jq expression for one target field. Return exactly one flat JSON object and nothing else. Do not wrap the result in markdown. Do not nest the result under keys like result, output, data, or expression. Use exactly this output schema: {\"jq_expression\": string}. \"jq_expression\" must be a JSON string containing only the jq expression for the target field. Use candidate_source_path as the primary source location, verify it against source_json, and use source_fragment as the focused local value. Do not return explanations or extra keys. Example valid output: {\"jq_expression\":\".datetime\"}",
        "used_hints": true
      },
      "stage": "jq_synthesis",
      "timestamp": "2026-05-19T17:14:06.589606+00:00"
    },
    {
      "payload": {
        "field_expressions": {
          "hasAdditionalInformation": "{\"remarks\": .extraInfo.value}",
          "hasAdditionalType": ".category.value",
          "hasDescription": "{shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null))",
          "hasLocation": ".location.value",
          "name": ".name.value"
        },
        "jq_filter": "{ \"name\": .name.value, \"hasDescription\": {shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null)), \"hasAdditionalInformation\": {\"remarks\": .extraInfo.value}, \"hasAdditionalType\": .category.value, \"hasLocation\": .location.value }",
        "validation_passed": true
      },
      "stage": "generation_complete",
      "timestamp": "2026-05-19T17:14:06.595186+00:00"
    },
    {
      "payload": {
        "jq_filter": "{ \"name\": .name.value, \"hasDescription\": {shortDescription: .shortDescription.value?, longDescription: .description.value?} | del(.[] | select(. == null)), \"hasAdditionalInformation\": {\"remarks\": .extraInfo.value}, \"hasAdditionalType\": .category.value, \"hasLocation\": .location.value }",
        "output_json": {
          "hasAdditionalInformation": {
            "remarks": "Encinar"
          },
          "hasAdditionalType": "TrailRoute",
          "hasDescription": {
            "longDescription": "Comenzamos",
            "shortDescription": "Dificultad: baja"
          },
          "hasLocation": {
            "coordinates": [
              -3.8565638,
              40.4845294
            ],
            "type": "Point"
          },
          "name": "Majalacabra"
        },
        "schema_valid": true,
        "validation_errors": []
      },
      "stage": "transform_complete",
      "timestamp": "2026-05-19T17:14:06.597464+00:00"
    }
  ],
  "run_id": "81356bc6-2a5b-4abd-9bcb-2517faf2da3a"
}